summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-07 17:13:45 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-08 01:09:38 +0200
commit1c8953e52074e7b377c27fe167f4e00729bb2ad6 (patch)
tree6049fdb570510301d5cd5565cff0b2584a7dda58 /src/plugins/platforms
parente255146183d3a1dd9491fd4090cdf4a5244ce754 (diff)
macOS: Move AA_MacDontSwapCtrlAndMeta logic out of QPlatformTheme
Change-Id: Ia36f60587d98902406de7de8acdc3c4521cfd05a Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm37
2 files changed, 41 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.h b/src/plugins/platforms/cocoa/qcocoatheme.h
index 50e56ef1bf..f6276e3d1a 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.h
+++ b/src/plugins/platforms/cocoa/qcocoatheme.h
@@ -80,6 +80,10 @@ public:
void handleSystemThemeChange();
+#ifndef QT_NO_SHORTCUT
+ QList<QKeySequence> keyBindings(QKeySequence::StandardKey key) const override;
+#endif
+
private:
mutable QPalette *m_systemPalette;
QMacNotificationObserver m_systemColorObserver;
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index 13e1b9da2b..674a8da60a 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -561,4 +561,41 @@ QPlatformMenuBar *QCocoaTheme::createPlatformMenuBar() const
return new QCocoaMenuBar();
}
+#ifndef QT_NO_SHORTCUT
+QList<QKeySequence> QCocoaTheme::keyBindings(QKeySequence::StandardKey key) const
+{
+ // The default key bindings in QPlatformTheme all hard-coded to use the Ctrl
+ // modifier, to match other platforms. In the normal case, when translating
+ // those to key sequences, we'll end up with Qt::ControlModifier+X, which is
+ // then matched against incoming key events that have been mapped from the
+ // command key to Qt::ControlModifier, and we'll get a match. If, however,
+ // the AA_MacDontSwapCtrlAndMeta application attribute is set, we need to
+ // fix the resulting key sequence so that it will match against unmapped
+ // key events that contain Qt::MetaModifier.
+ auto bindings = QPlatformTheme::keyBindings(key);
+
+ if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) {
+ static auto swapCtrlMeta = [](int keySequence) {
+ auto originalKeySequence = keySequence;
+ keySequence &= ~(Qt::ControlModifier | Qt::MetaModifier);
+ if (originalKeySequence & Qt::ControlModifier)
+ keySequence |= Qt::MetaModifier;
+ if (originalKeySequence & Qt::MetaModifier)
+ keySequence |= Qt::ControlModifier;
+ return keySequence;
+ };
+
+ QList<QKeySequence> swappedBindings;
+ for (auto binding : bindings) {
+ Q_ASSERT(binding.count() == 1);
+ swappedBindings.append(QKeySequence(swapCtrlMeta(binding[0])));
+ }
+
+ bindings = swappedBindings;
+ }
+
+ return bindings;
+}
+#endif
+
QT_END_NAMESPACE