Cocoa: Send keyboard modifiers with wheel events.
authorMorten Johan Sorvig <morten.sorvig@nokia.com>
Fri, 16 Mar 2012 15:19:13 +0000 (16:19 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 19 Mar 2012 10:52:10 +0000 (11:52 +0100)
Read and save the modifiers at the beginning of the
event stream to keep the event interpretation constant
for the entire event stream.

Change-Id: I66046dea8f8fd3ff2f88c48da5f076377bda32dd
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
src/plugins/platforms/cocoa/qnsview.h
src/plugins/platforms/cocoa/qnsview.mm

index f09c933..2b7caae 100644 (file)
@@ -61,6 +61,7 @@ QT_END_NAMESPACE
     QString m_composingText;
     bool m_keyEventsAccepted;
     QStringList *currentCustomDragTypes;
+    Qt::KeyboardModifiers currentWheelModifiers;
 }
 
 - (id)init;
index 3a697a3..ed67fd5 100644 (file)
@@ -545,7 +545,31 @@ static QTouchDevice *touchDevice = 0;
     NSTimeInterval timestamp = [theEvent timestamp];
     ulong qt_timestamp = timestamp * 1000;
 
-    QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, pixelDelta, angleDelta);
+    // Set keyboard modifiers depending on event phase. A two-finger trackpad flick
+    // generates a stream of scroll events. We want the keyboard modifier state to
+    // be the state at the beginning of the flick in order to avoid changing the
+    // interpretation of the events mid-stream. One example of this happening would
+    // be when pressing cmd after scrolling in Qt Creator: not taking the phase into
+    // account causes the end of the event stream to be interpreted as font size changes.
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+    if ([theEvent respondsToSelector:@selector(scrollingDeltaX)]) {
+        NSEventPhase phase = [theEvent phase];
+        if (phase == NSEventPhaseBegan) {
+            currentWheelModifiers = [self convertKeyModifiers:[theEvent modifierFlags]];
+        }
+
+        QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, pixelDelta, angleDelta, currentWheelModifiers);
+
+        if (phase == NSEventPhaseEnded || phase == NSEventPhaseCancelled) {
+            currentWheelModifiers = Qt::NoModifier;
+        }
+    }
+#else
+    QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, pixelDelta, angleDelta,
+                                             [self convertKeyModifiers:[theEvent modifierFlags]]);
+#endif
+
 }
 #endif //QT_NO_WHEELEVENT