summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-02 15:23:50 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-02 15:35:18 +0200
commit0a52eba3c0ba1c3ddaa263f83db8b64c3058824c (patch)
tree45f8a211fd4ded1b528df1a526f8ba35ebda4f7f
parent0ad35db302a4945edeb057cb77da69b3af63671d (diff)
macOS: Move Cocoa modifier mapping logic to QCocoaKeyMapper
Along with similar logic for Carbon. Change-Id: Ie32f8ffa336006387d50d3b9e8491816aba4ea04 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.mm17
-rw-r--r--src/plugins/platforms/cocoa/qcocoansmenu.mm3
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h4
-rw-r--r--src/plugins/platforms/cocoa/qnsview_dragging.mm6
-rw-r--r--src/plugins/platforms/cocoa/qnsview_keys.mm27
-rw-r--r--src/plugins/platforms/cocoa/qnsview_mouse.mm6
-rw-r--r--src/plugins/platforms/cocoa/qnsview_tablet.mm2
9 files changed, 32 insertions, 37 deletions
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<int> 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<int, Qt::KeyboardModifier> 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 <QtCore/qcoreapplication.h>
#include <QtCore/qcoreevent.h>
@@ -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<Qt::MouseButtons>(static_cast<uint>([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",