summaryrefslogtreecommitdiffhomepage
path: root/qxt-mini/qxtglobalshortcut_mac.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2019-01-16 07:59:17 +0100
committerStanislaw Halik <sthalik@misaki.pl>2019-01-16 07:59:17 +0100
commit77a2cab6fb297d0b95c79e55261e3be092cba350 (patch)
tree094a381a2ebbdbca6ebfed1aad7d02eb964f21ea /qxt-mini/qxtglobalshortcut_mac.cpp
parentd091350a69198ef0a00ca89b5ebb504de639f893 (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.cpp208
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;
}