diff options
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoatheme.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoatheme.mm | 37 |
1 files changed, 37 insertions, 0 deletions
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 |