From f67fe01ac667e1b416fb277f9ab5fd857790cc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 7 Jul 2020 20:28:33 +0200 Subject: [PATCH] macOS: Use helper method in QCocoaKeyMapper for swapping Ctrl and Cmd Centralizes the logic for swapping the two modifiers. The debug logging for modifier mapping has been removed as that level of granular logging is overkill. Change-Id: Ib4818c77f5b32ff20c9fe6df56528a120e5bd80e Reviewed-by: Volker Hilsheimer --- .../platforms/cocoa/qcocoakeymapper.mm | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm index 3f057658da..bb8787bf4a 100644 --- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm +++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm @@ -48,7 +48,22 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpaKeyMapper, "qt.qpa.keymapper"); Q_LOGGING_CATEGORY(lcQpaKeyMapperKeys, "qt.qpa.keymapper.keys"); -Q_LOGGING_CATEGORY(lcQpaKeyMapperModifiers, "qt.qpa.keymapper.modifiers"); + +static Qt::KeyboardModifiers swapModifiersIfNeeded(const Qt::KeyboardModifiers modifiers) +{ + if (QCoreApplication::testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) + return modifiers; + + Qt::KeyboardModifiers swappedModifiers = modifiers; + swappedModifiers &= ~(Qt::MetaModifier | Qt::ControlModifier); + + if (modifiers & Qt::ControlModifier) + swappedModifiers |= Qt::MetaModifier; + if (modifiers & Qt::MetaModifier) + swappedModifiers |= Qt::ControlModifier; + + return swappedModifiers; +} Qt::KeyboardModifiers QCocoaKeyMapper::fromCocoaModifiers(NSEventModifierFlags cocoaModifiers) { @@ -70,9 +85,9 @@ Qt::KeyboardModifiers QCocoaKeyMapper::fromCocoaModifiers(NSEventModifierFlags c static constexpr std::tuple carbonModifierMap[] = { { shiftKey, Qt::ShiftModifier }, { rightShiftKey, Qt::ShiftModifier }, - { controlKey, Qt::MetaModifier }, - { rightControlKey, Qt::MetaModifier }, - { cmdKey, Qt::ControlModifier }, + { controlKey, Qt::ControlModifier }, + { rightControlKey, Qt::ControlModifier }, + { cmdKey, Qt::MetaModifier }, { optionKey, Qt::AltModifier }, { rightOptionKey, Qt::AltModifier }, { kEventKeyModifierNumLockMask, Qt::KeypadModifier } @@ -82,49 +97,25 @@ using CarbonModifiers = UInt32; // As opposed to EventModifiers which is UInt16 Qt::KeyboardModifiers fromCarbonModifiers(CarbonModifiers carbonModifiers) { - qCDebug(lcQpaKeyMapperModifiers, "Mapping carbon modifiers: %d (0x%04x)", - carbonModifiers, carbonModifiers); - Qt::KeyboardModifiers qtModifiers = Qt::NoModifier; for (const auto &[carbonModifier, qtModifier] : carbonModifierMap) { - if (carbonModifiers & carbonModifier) { - qCDebug(lcQpaKeyMapperModifiers) << "Got modifier" << qtModifier; + if (carbonModifiers & carbonModifier) qtModifiers |= qtModifier; - } } - if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { - Qt::KeyboardModifiers oldModifiers = qtModifiers; - qtModifiers &= ~(Qt::MetaModifier | Qt::ControlModifier); - if (oldModifiers & Qt::ControlModifier) - qtModifiers |= Qt::MetaModifier; - if (oldModifiers & Qt::MetaModifier) - qtModifiers |= Qt::ControlModifier; - } - - return qtModifiers; + return swapModifiersIfNeeded(qtModifiers); } static CarbonModifiers toCarbonModifiers(Qt::KeyboardModifiers qtModifiers) { - qCDebug(lcQpaKeyMapperModifiers).verbosity(1) << "Mapping" << qtModifiers; + qtModifiers = swapModifiersIfNeeded(qtModifiers); CarbonModifiers carbonModifiers = 0; for (const auto &[carbonModifier, qtModifier] : carbonModifierMap) { - if (qtModifiers & qtModifier) { - qCDebug(lcQpaKeyMapperModifiers) << "Got carbon modifier" << carbonModifier; + if (qtModifiers & qtModifier) carbonModifiers |= carbonModifier; - } } - if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { - int oldModifiers = carbonModifiers; - carbonModifiers &= ~(controlKey | rightControlKey | cmdKey); - if (oldModifiers & (controlKey | rightControlKey)) - carbonModifiers |= cmdKey; - if (oldModifiers & cmdKey) - carbonModifiers |= (controlKey | rightControlKey); - } return carbonModifiers; }