diff options
author | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2022-01-05 16:42:23 +0100 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2022-11-25 14:40:36 +0100 |
commit | 4332cb313469de1525afe3cddd792d7bc7e08a14 (patch) | |
tree | 270b2b2484fa92d088bcca0e1306d6d528dcfa1b | |
parent | bb629a2e293b8b181cfb176087aab96f68cfbbd7 (diff) |
qnsview_drag: only ignore key modifier while dragging 'within the application'
We return a mask containing several supported DND operations and if modifiers
were ignored, an external application can select a 'wrong' operation (not the
one we wanted when pressing a modifier). Saying that, the old logic of ignoring
still applies if we are dragging 'within the application'.
Fixes: QTBUG-99471
Change-Id: I67c9a656960e95d6d2298f4b3bdd2052faedb263
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.mm | 2 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview_dragging.mm | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index eb4405ccd0..c574e2b7c8 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -109,6 +109,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMouseMoveHelper); // Text QString m_composingText; QPointer<QObject> m_composingFocusObject; + NSDraggingContext m_lastSeenContext; } - (instancetype)initWithCocoaWindow:(QCocoaWindow *)platformWindow @@ -130,6 +131,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMouseMoveHelper); m_lastKeyDead = false; m_sendKeyEvent = false; m_currentlyInterpretedKeyEvent = nil; + m_lastSeenContext = NSDraggingContextWithinApplication; } return self; } diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm index 06b917945a..f5bb25c300 100644 --- a/src/plugins/platforms/cocoa/qnsview_dragging.mm +++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm @@ -45,8 +45,8 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin - (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context { Q_UNUSED(session); - Q_UNUSED(context); + m_lastSeenContext = context; QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); return qt_mac_mapDropActions(nativeDrag->currentDrag()->supportedActions()); } @@ -61,8 +61,11 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin // // Since Qt already takes care of tracking the keyboard modifiers, we // don't need (or want) Cocoa to filter anything. Instead, we'll let - // the application do the actual filtering. - return YES; + // the application do the actual filtering. But only while dragging + // within application, otherwise ignored modifiers may end up in a + // wrong drop operation executed. + + return m_lastSeenContext == NSDraggingContextWithinApplication; } - (BOOL)wantsPeriodicDraggingUpdates @@ -250,6 +253,8 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin Q_UNUSED(screenPoint); Q_UNUSED(operation); + m_lastSeenContext = NSDraggingContextWithinApplication; + if (!m_platformWindow) return; |