diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2019-01-16 07:59:17 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2019-01-16 07:59:17 +0100 |
commit | 77a2cab6fb297d0b95c79e55261e3be092cba350 (patch) | |
tree | 094a381a2ebbdbca6ebfed1aad7d02eb964f21ea /qxt-mini/qxtglobalshortcut_mac.cpp | |
parent | d091350a69198ef0a00ca89b5ebb504de639f893 (diff) |
Revert "qxt-mini: try fix osx shortcut snafu"
I haven't even compile-tested it.
This reverts commit 6eb44ec4831f58e7658efbb0b9f0813629b9cdea.
Diffstat (limited to 'qxt-mini/qxtglobalshortcut_mac.cpp')
-rw-r--r-- | qxt-mini/qxtglobalshortcut_mac.cpp | 208 |
1 files changed, 115 insertions, 93 deletions
diff --git a/qxt-mini/qxtglobalshortcut_mac.cpp b/qxt-mini/qxtglobalshortcut_mac.cpp index 5f55f579..d7cd7f84 100644 --- a/qxt-mini/qxtglobalshortcut_mac.cpp +++ b/qxt-mini/qxtglobalshortcut_mac.cpp @@ -43,104 +43,132 @@ typedef QPair<uint, uint> Identifier; static QMap<quint32, EventHotKeyRef> keyRefs; static QHash<Identifier, quint32> keyIDs; static quint32 hotKeySerial = 0; +static bool qxt_mac_handler_installed = false; OSStatus qxt_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, void* data) { Q_UNUSED(nextHandler); Q_UNUSED(data); - if (GetEventClass(event) == kEventClassKeyboard) + if (GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed) { - int kind = GetEventKind(event); - bool is_down; - - if (kind == kEventHotKeyPressed) - is_down = true; - else if (kind == kEventHotKeyReleased) - is_down = false; - else - return noErr; - EventHotKeyID keyID; GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(keyID), NULL, &keyID); Identifier id = keyIDs.key(keyID.id); if(id != Identifier()) - QxtGlobalShortcutPrivate::activateShortcut(id.second, id.first, is_down); + QxtGlobalShortcutPrivate::activateShortcut(id.second, id.first, true); } return noErr; } -// Constants found in NSEvent.h from AppKit.framework -// cf. https://stackoverflow.com/a/16125341 -// cf. https://web.archive.org/web/20100501161453/http://www.classicteck.com/rbarticles/mackeyboard.php - -static struct { - Qt::Key qt_key; - unsigned native_key; -} const key_list[] = { - { Qt::Key_Escape , 0x35 }, - { Qt::Key_Return , 0x24 }, - { Qt::Key_Return , 0x4c }, - { Qt::Key_Tab , 0x30 }, - { Qt::Key_Space , 0x31 }, - { Qt::Key_Delete , 0x33 }, - { Qt::Key_F17 , 0x40 }, - { Qt::Key_VolumeUp , 0x48 }, - { Qt::Key_VolumeDown , 0x49 }, - { Qt::Key_Mute , 0x4A }, - { Qt::Key_F1 , 0x7A }, - { Qt::Key_F2 , 0x78 }, - { Qt::Key_F3 , 0x63 }, - { Qt::Key_F4 , 0x76 }, - { Qt::Key_F5 , 0x60 }, - { Qt::Key_F6 , 0x61 }, - { Qt::Key_F7 , 0x62 }, - { Qt::Key_F8 , 0x64 }, - { Qt::Key_F9 , 0x65 }, - { Qt::Key_F10 , 0x6D }, - { Qt::Key_F11 , 0x67 }, - { Qt::Key_F12 , 0x6F }, - { Qt::Key_Help , 0x72 }, - { Qt::Key_PageUp , 0x74 }, - { Qt::Key_PageDown , 0x79 }, - { Qt::Key_Delete , 0x33 }, - { Qt::Key_Backspace , 0x75 }, - { Qt::Key_Home , 0x73 }, - { Qt::Key_End , 0x77 }, - { Qt::Key_LeftArrow , 0x7B }, - { Qt::Key_RightArrow , 0x7C }, - { Qt::Key_DownArrow , 0x7D }, - { Qt::Key_UpArrow , 0x7E }, -}; - -static struct modifiers { - Qt::KeyboardModifiers qt_mods; - unsigned native_mods; -} const modifier_list[] = { - { Qt::ShiftModifier, 56 }, - { Qt::ControlModifier, 59 }, - { Qt::AltModifier, 55 }, - { Qt::MetaModifier, 58 }, - //{ Qt::KeypadModifier, kEventKeyModifierNumLockMask }, -}; - quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) { quint32 native = 0; - - for (const auto& m : modifiers) - if (modifiers & m.qt_mods) - native |= m.native_mods; - + if (modifiers & Qt::ShiftModifier) + native |= shiftKey; + if (modifiers & Qt::ControlModifier) + native |= cmdKey; + if (modifiers & Qt::AltModifier) + native |= optionKey; + if (modifiers & Qt::MetaModifier) + native |= controlKey; + if (modifiers & Qt::KeypadModifier) + native |= kEventKeyModifierNumLockMask; return native; } quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key keys) { UTF16Char ch; - - for (k const& : key_list) - if (k.qt_key == keys) - return k.native_key; + // Constants found in NSEvent.h from AppKit.framework + switch (keys) + { + case Qt::Key_Return: + return kVK_Return; + case Qt::Key_Enter: + return kVK_ANSI_KeypadEnter; + case Qt::Key_Tab: + return kVK_Tab; + case Qt::Key_Space: + return kVK_Space; + case Qt::Key_Backspace: + return kVK_Delete; + case Qt::Key_Control: + return kVK_Command; + case Qt::Key_Shift: + return kVK_Shift; + case Qt::Key_CapsLock: + return kVK_CapsLock; + case Qt::Key_Option: + return kVK_Option; + case Qt::Key_Meta: + return kVK_Control; + case Qt::Key_F17: + return kVK_F17; + case Qt::Key_VolumeUp: + return kVK_VolumeUp; + case Qt::Key_VolumeDown: + return kVK_VolumeDown; + case Qt::Key_F18: + return kVK_F18; + case Qt::Key_F19: + return kVK_F19; + case Qt::Key_F20: + return kVK_F20; + case Qt::Key_F5: + return kVK_F5; + case Qt::Key_F6: + return kVK_F6; + case Qt::Key_F7: + return kVK_F7; + case Qt::Key_F3: + return kVK_F3; + case Qt::Key_F8: + return kVK_F8; + case Qt::Key_F9: + return kVK_F9; + case Qt::Key_F11: + return kVK_F11; + case Qt::Key_F13: + return kVK_F13; + case Qt::Key_F16: + return kVK_F16; + case Qt::Key_F14: + return kVK_F14; + case Qt::Key_F10: + return kVK_F10; + case Qt::Key_F12: + return kVK_F12; + case Qt::Key_F15: + return kVK_F15; + case Qt::Key_Help: + return kVK_Help; + case Qt::Key_Home: + return kVK_Home; + case Qt::Key_PageUp: + return kVK_PageUp; + case Qt::Key_Delete: + return kVK_ForwardDelete; + case Qt::Key_F4: + return kVK_F4; + case Qt::Key_End: + return kVK_End; + case Qt::Key_F2: + return kVK_F2; + case Qt::Key_PageDown: + return kVK_PageDown; + case Qt::Key_F1: + return kVK_F1; + case Qt::Key_Left: + return kVK_LeftArrow; + case Qt::Key_Right: + return kVK_RightArrow; + case Qt::Key_Down: + return kVK_DownArrow; + case Qt::Key_Up: + return kVK_UpArrow; + default: + ; + } if (keys == Qt::Key_Escape) ch = 27; else if (keys == Qt::Key_Return) ch = 13; @@ -200,21 +228,16 @@ quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key keys) return 0; } -static bool register_event_handler() -{ - EventTypeSpec specs[2] = { - { kEventClassKeyboard, kEventHotKeyPressed }, - { kEventClassKeyboard, kEventHotKeyReleased }, - }; - - (void)InstallApplicationEventHandler(&qxt_mac_handle_hot_key, 2, &t, NULL, NULL); - - return true; -} - bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods) { - static const bool once = register_event_handler(); + if (!qxt_mac_handler_installed) + { + qxt_mac_handler_installed = true; + EventTypeSpec t; + t.eventClass = kEventClassKeyboard; + t.eventKind = kEventHotKeyPressed; + InstallApplicationEventHandler(&qxt_mac_handle_hot_key, 1, &t, NULL, NULL); + } EventHotKeyID keyID; keyID.signature = 'cute'; @@ -232,16 +255,15 @@ bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativ bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods) { - Identifier id{nativeMods, nativeKey}; - if (!keyIDs.contains(id)) - return false; + Identifier id(nativeMods, nativeKey); + if (!keyIDs.contains(id)) return false; EventHotKeyRef ref = keyRefs.take(keyIDs[id]); keyIDs.remove(id); return !UnregisterEventHotKey(ref); } - -bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, void *message, long *result) +bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, + void *message, long *result) { return false; } |