diff --git a/src/autotype/mac/AutoTypeMac.cpp b/src/autotype/mac/AutoTypeMac.cpp index 015abe670..eb6e4f774 100644 --- a/src/autotype/mac/AutoTypeMac.cpp +++ b/src/autotype/mac/AutoTypeMac.cpp @@ -172,7 +172,7 @@ void AutoTypePlatformMac::sendChar(const QChar& ch, bool isKeyDown) // Send key code to active window // see: Quartz Event Services // -void AutoTypePlatformMac::sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers = 0) +void AutoTypePlatformMac::sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers) { uint16 keyCode = macUtils()->qtToNativeKeyCode(key); if (keyCode == INVALID_KEYCODE) { @@ -238,38 +238,22 @@ AutoTypeAction::Result AutoTypeExecutorMac::execBegin(const AutoTypeBegin* actio AutoTypeAction::Result AutoTypeExecutorMac::execType(const AutoTypeKey* action) { - if (action->modifiers & Qt::ShiftModifier) { - m_platform->sendKey(Qt::Key_Shift, true); - } - if (action->modifiers & Qt::ControlModifier) { - m_platform->sendKey(Qt::Key_Control, true); - } - if (action->modifiers & Qt::AltModifier) { - m_platform->sendKey(Qt::Key_Alt, true); - } - if (action->modifiers & Qt::MetaModifier) { - m_platform->sendKey(Qt::Key_Meta, true); - } + if (action->key != Qt::Key_unknown) { - m_platform->sendKey(action->key, true); - m_platform->sendKey(action->key, false); + m_platform->sendKey(action->key, true, action->modifiers); + m_platform->sendKey(action->key, false, action->modifiers); } else { - m_platform->sendChar(action->character, true); - m_platform->sendChar(action->character, false); - } - - if (action->modifiers & Qt::ShiftModifier) { - m_platform->sendKey(Qt::Key_Shift, false); - } - if (action->modifiers & Qt::ControlModifier) { - m_platform->sendKey(Qt::Key_Control, false); - } - if (action->modifiers & Qt::AltModifier) { - m_platform->sendKey(Qt::Key_Alt, false); - } - if (action->modifiers & Qt::MetaModifier) { - m_platform->sendKey(Qt::Key_Meta, false); + if (action->modifiers != Qt::NoModifier) { + // If we have modifiers set than we intend to send a key sequence + // convert to uppercase to align with Qt Key mappings + int ch = action->character.toUpper().toLatin1(); + m_platform->sendKey(static_cast(ch), true, action->modifiers); + m_platform->sendKey(static_cast(ch), false, action->modifiers); + } else { + m_platform->sendChar(action->character, true); + m_platform->sendChar(action->character, false); + } } Tools::sleep(execDelayMs); diff --git a/src/autotype/mac/AutoTypeMac.h b/src/autotype/mac/AutoTypeMac.h index e12a06ec5..54805a4e9 100644 --- a/src/autotype/mac/AutoTypeMac.h +++ b/src/autotype/mac/AutoTypeMac.h @@ -45,7 +45,7 @@ public: bool raiseOwnWindow() override; void sendChar(const QChar& ch, bool isKeyDown); - void sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers); + void sendKey(Qt::Key key, bool isKeyDown, Qt::KeyboardModifiers modifiers = 0); private: static int windowLayer(CFDictionaryRef window); diff --git a/src/gui/osutils/macutils/MacUtils.cpp b/src/gui/osutils/macutils/MacUtils.cpp index c7d91950f..bc4503a8a 100644 --- a/src/gui/osutils/macutils/MacUtils.cpp +++ b/src/gui/osutils/macutils/MacUtils.cpp @@ -185,7 +185,6 @@ void MacUtils::registerNativeEventFilter() bool MacUtils::registerGlobalShortcut(const QString& name, Qt::Key key, Qt::KeyboardModifiers modifiers, QString* error) { auto keycode = qtToNativeKeyCode(key); - auto modifierscode = qtToNativeModifiers(modifiers, false); if (keycode == INVALID_KEYCODE) { if (error) { *error = tr("Invalid key code"); @@ -193,6 +192,16 @@ bool MacUtils::registerGlobalShortcut(const QString& name, Qt::Key key, Qt::Keyb return false; } + // Qt inverts CMD and CTRL on macOS under the hood, undo this + if (modifiers & Qt::MetaModifier && !(modifiers & Qt::ControlModifier)) { + modifiers &= ~Qt::MetaModifier; + modifiers |= Qt::ControlModifier; + } else if (modifiers & Qt::ControlModifier && !(modifiers & Qt::MetaModifier)) { + modifiers &= ~Qt::ControlModifier; + modifiers |= Qt::MetaModifier; + } + auto modifierscode = qtToNativeModifiers(modifiers, false); + // Check if this key combo is registered to another shortcut QHashIterator> i(m_globalShortcuts); while (i.hasNext()) { @@ -440,7 +449,6 @@ uint16 MacUtils::qtToNativeKeyCode(Qt::Key key) return kVK_F16; default: - Q_ASSERT(false); return INVALID_KEYCODE; } } @@ -469,13 +477,13 @@ CGEventFlags MacUtils::qtToNativeModifiers(Qt::KeyboardModifiers modifiers, bool nativeModifiers = CGEventFlags(nativeModifiers | shiftMod); } if (modifiers & Qt::ControlModifier) { - nativeModifiers = CGEventFlags(nativeModifiers | cmdMod); + nativeModifiers = CGEventFlags(nativeModifiers | controlMod); } if (modifiers & Qt::AltModifier) { nativeModifiers = CGEventFlags(nativeModifiers | optionMod); } if (modifiers & Qt::MetaModifier) { - nativeModifiers = CGEventFlags(nativeModifiers | controlMod); + nativeModifiers = CGEventFlags(nativeModifiers | cmdMod); } return nativeModifiers;