From 0a52eba3c0ba1c3ddaa263f83db8b64c3058824c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 2 Jul 2020 15:23:50 +0200 Subject: macOS: Move Cocoa modifier mapping logic to QCocoaKeyMapper Along with similar logic for Carbon. Change-Id: Ie32f8ffa336006387d50d3b9e8491816aba4ea04 Reviewed-by: Timur Pocheptsov --- .../platforms/cocoa/qcocoaapplicationdelegate.mm | 2 +- src/plugins/platforms/cocoa/qcocoakeymapper.h | 2 ++ src/plugins/platforms/cocoa/qcocoakeymapper.mm | 17 ++++++++++++++ src/plugins/platforms/cocoa/qcocoansmenu.mm | 3 ++- src/plugins/platforms/cocoa/qnsview.h | 4 ---- src/plugins/platforms/cocoa/qnsview_dragging.mm | 6 ++--- src/plugins/platforms/cocoa/qnsview_keys.mm | 27 +++------------------- src/plugins/platforms/cocoa/qnsview_mouse.mm | 6 ++--- src/plugins/platforms/cocoa/qnsview_tablet.mm | 2 +- 9 files changed, 32 insertions(+), 37 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index bdc203e4e1..62f2cc30e0 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -375,7 +375,7 @@ QT_USE_NAMESPACE return; QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData.loadRelaxed()); - QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]]; + QGuiApplicationPrivate::modifier_buttons = QCocoaKeyMapper::fromCocoaModifiers([NSEvent modifierFlags]); static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated); activatedSignal.invoke(platformItem, Qt::QueuedConnection); diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.h b/src/plugins/platforms/cocoa/qcocoakeymapper.h index b2ad36712b..f195cda7be 100644 --- a/src/plugins/platforms/cocoa/qcocoakeymapper.h +++ b/src/plugins/platforms/cocoa/qcocoakeymapper.h @@ -82,6 +82,8 @@ public: static Qt::KeyboardModifiers queryKeyboardModifiers(); QList possibleKeys(const QKeyEvent *event) const; + static Qt::KeyboardModifiers fromCocoaModifiers(NSEventModifierFlags cocoaModifiers); + private: bool updateKeyboard(); void deleteLayouts(); diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm index 86143f275b..40d13e2d6a 100644 --- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm +++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm @@ -50,6 +50,23 @@ Q_LOGGING_CATEGORY(lcQpaKeyMapper, "qt.qpa.keymapper"); Q_LOGGING_CATEGORY(lcQpaKeyMapperKeys, "qt.qpa.keymapper.keys"); Q_LOGGING_CATEGORY(lcQpaKeyMapperModifiers, "qt.qpa.keymapper.modifiers"); +Qt::KeyboardModifiers QCocoaKeyMapper::fromCocoaModifiers(NSEventModifierFlags cocoaModifiers) +{ + const bool dontSwapCtrlAndMeta = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta); + Qt::KeyboardModifiers qtMods =Qt::NoModifier; + if (cocoaModifiers & NSEventModifierFlagShift) + qtMods |= Qt::ShiftModifier; + if (cocoaModifiers & NSEventModifierFlagControl) + qtMods |= dontSwapCtrlAndMeta ? Qt::ControlModifier : Qt::MetaModifier; + if (cocoaModifiers & NSEventModifierFlagOption) + qtMods |= Qt::AltModifier; + if (cocoaModifiers & NSEventModifierFlagCommand) + qtMods |= dontSwapCtrlAndMeta ? Qt::MetaModifier : Qt::ControlModifier; + if (cocoaModifiers & NSEventModifierFlagNumericPad) + qtMods |= Qt::KeypadModifier; + return qtMods; +} + static constexpr std::tuple carbonModifierMap[] = { { shiftKey, Qt::ShiftModifier }, { rightShiftKey, Qt::ShiftModifier }, diff --git a/src/plugins/platforms/cocoa/qcocoansmenu.mm b/src/plugins/platforms/cocoa/qcocoansmenu.mm index 44e574e83d..d271a566d9 100644 --- a/src/plugins/platforms/cocoa/qcocoansmenu.mm +++ b/src/plugins/platforms/cocoa/qcocoansmenu.mm @@ -46,6 +46,7 @@ #include "qcocoawindow.h" #include "qnsview.h" #include "qcocoahelpers.h" +#include "qcocoakeymapper.h" #include #include @@ -253,7 +254,7 @@ static NSString *qt_mac_removePrivateUnicode(NSString *string) QChar ch; int keyCode; ulong nativeModifiers = event.modifierFlags; - Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers:nativeModifiers]; + Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers); NSString *charactersIgnoringModifiers = event.charactersIgnoringModifiers; NSString *characters = event.characters; diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index 2c7bb00df2..a9a547c891 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -60,10 +60,6 @@ QT_DECLARE_NAMESPACED_OBJC_INTERFACE(QNSView, NSView - (void)resetMouseButtons; @end -@interface QNSView (KeysAPI) -+ (Qt::KeyboardModifiers)convertKeyModifiers:(ulong)modifierFlags; -@end - @interface QNSView (ComplexTextAPI) - (void)unmarkText; - (void)cancelComposingText; diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm index 44ffc87f7a..d4ab5f4a24 100644 --- a/src/plugins/platforms/cocoa/qnsview_dragging.mm +++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm @@ -197,7 +197,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin if (!target) return NSDragOperationNone; - const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags]; + const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags); const auto buttons = currentlyPressedMouseButtons(); const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint); @@ -261,7 +261,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QPlatformDropQtResponse response(false, Qt::IgnoreAction); QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags]; + const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags); const auto buttons = currentlyPressedMouseButtons(); const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint); @@ -302,7 +302,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin // this case won't send the matching release event, so we have to // synthesize it here. m_buttons = currentlyPressedMouseButtons(); - const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags]; + const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags); NSPoint windowPoint = [self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin; NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil]; diff --git a/src/plugins/platforms/cocoa/qnsview_keys.mm b/src/plugins/platforms/cocoa/qnsview_keys.mm index 847adca207..73b2b89176 100644 --- a/src/plugins/platforms/cocoa/qnsview_keys.mm +++ b/src/plugins/platforms/cocoa/qnsview_keys.mm @@ -39,27 +39,6 @@ // This file is included from qnsview.mm, and only used to organize the code -@implementation QNSView (KeysAPI) - -+ (Qt::KeyboardModifiers)convertKeyModifiers:(ulong)modifierFlags -{ - const bool dontSwapCtrlAndMeta = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta); - Qt::KeyboardModifiers qtMods =Qt::NoModifier; - if (modifierFlags & NSEventModifierFlagShift) - qtMods |= Qt::ShiftModifier; - if (modifierFlags & NSEventModifierFlagControl) - qtMods |= dontSwapCtrlAndMeta ? Qt::ControlModifier : Qt::MetaModifier; - if (modifierFlags & NSEventModifierFlagOption) - qtMods |= Qt::AltModifier; - if (modifierFlags & NSEventModifierFlagCommand) - qtMods |= dontSwapCtrlAndMeta ? Qt::MetaModifier : Qt::ControlModifier; - if (modifierFlags & NSEventModifierFlagNumericPad) - qtMods |= Qt::KeypadModifier; - return qtMods; -} - -@end - @implementation QNSView (Keys) - (int)convertKeyCode:(QChar)keyChar @@ -71,7 +50,7 @@ { ulong timestamp = [nsevent timestamp] * 1000; ulong nativeModifiers = [nsevent modifierFlags]; - Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers: nativeModifiers]; + Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers); NSString *charactersIgnoringModifiers = [nsevent charactersIgnoringModifiers]; NSString *characters = [nsevent characters]; if (m_inputSource != characters) { @@ -219,7 +198,7 @@ { ulong timestamp = [nsevent timestamp] * 1000; ulong modifiers = [nsevent modifierFlags]; - Qt::KeyboardModifiers qmodifiers = [QNSView convertKeyModifiers:modifiers]; + Qt::KeyboardModifiers qmodifiers = QCocoaKeyMapper::fromCocoaModifiers(modifiers); // calculate the delta and remember the current modifiers for next time static ulong m_lastKnownModifiers; @@ -255,7 +234,7 @@ timestamp, (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress, qtCode, - qmodifiers ^ [QNSView convertKeyModifiers:mac_mask]); + qmodifiers ^ QCocoaKeyMapper::fromCocoaModifiers(mac_mask)); } } diff --git a/src/plugins/platforms/cocoa/qnsview_mouse.mm b/src/plugins/platforms/cocoa/qnsview_mouse.mm index 0503baf38e..ea8e8d60a6 100644 --- a/src/plugins/platforms/cocoa/qnsview_mouse.mm +++ b/src/plugins/platforms/cocoa/qnsview_mouse.mm @@ -281,7 +281,7 @@ QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); nativeDrag->setLastMouseEvent(theEvent, self); - const auto modifiers = [QNSView convertKeyModifiers:theEvent.modifierFlags]; + const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags); auto button = cocoaButton2QtButton(theEvent); if (button == Qt::LeftButton && m_sendUpAsRightButton) button = Qt::RightButton; @@ -432,7 +432,7 @@ [[NSTextInputContext currentInputContext] handleEvent:theEvent]; } else { auto ctrlOrMetaModifier = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta) ? Qt::ControlModifier : Qt::MetaModifier; - if (!m_dontOverrideCtrlLMB && [QNSView convertKeyModifiers:[theEvent modifierFlags]] & ctrlOrMetaModifier) { + if (!m_dontOverrideCtrlLMB && QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags) & ctrlOrMetaModifier) { m_buttons |= Qt::RightButton; m_sendUpAsRightButton = true; } else { @@ -681,7 +681,7 @@ // 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 (theEvent.momentumPhase == NSEventPhaseNone) - m_currentWheelModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; + m_currentWheelModifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags); // "isInverted": natural OS X scrolling, inverted from the Qt/other platform/Jens perspective. bool isInverted = [theEvent isDirectionInvertedFromDevice]; diff --git a/src/plugins/platforms/cocoa/qnsview_tablet.mm b/src/plugins/platforms/cocoa/qnsview_tablet.mm index 7777e9c16a..f164f81b31 100644 --- a/src/plugins/platforms/cocoa/qnsview_tablet.mm +++ b/src/plugins/platforms/cocoa/qnsview_tablet.mm @@ -109,7 +109,7 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash) if (rotation > 180.0) rotation -= 360.0; - Qt::KeyboardModifiers keyboardModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; + Qt::KeyboardModifiers keyboardModifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags); Qt::MouseButtons buttons = ignoreButtonMapping ? static_cast(static_cast([theEvent buttonMask])) : m_buttons; qCDebug(lcQpaTablet, "event on tablet %d with tool %hd type %hd unique ID %lld pos %6.1f, %6.1f root pos %6.1f, %6.1f buttons 0x%x pressure %4.2lf tilt %d, %d rotation %6.2lf", -- cgit v1.2.3