summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--qxt-mini/qxtglobalshortcut_mac.cpp208
1 files changed, 93 insertions, 115 deletions
diff --git a/qxt-mini/qxtglobalshortcut_mac.cpp b/qxt-mini/qxtglobalshortcut_mac.cpp
index d7cd7f84..5f55f579 100644
--- a/qxt-mini/qxtglobalshortcut_mac.cpp
+++ b/qxt-mini/qxtglobalshortcut_mac.cpp
@@ -43,132 +43,104 @@ 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 && GetEventKind(event) == kEventHotKeyPressed)
+ if (GetEventClass(event) == kEventClassKeyboard)
{
+ 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, true);
+ QxtGlobalShortcutPrivate::activateShortcut(id.second, id.first, is_down);
}
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;
- 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;
+
+ for (const auto& m : modifiers)
+ if (modifiers & m.qt_mods)
+ native |= m.native_mods;
+
return native;
}
quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key keys)
{
UTF16Char ch;
- // 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:
- ;
- }
+
+ for (k const& : key_list)
+ if (k.qt_key == keys)
+ return k.native_key;
if (keys == Qt::Key_Escape) ch = 27;
else if (keys == Qt::Key_Return) ch = 13;
@@ -228,16 +200,21 @@ 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)
{
- 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);
- }
+ static const bool once = register_event_handler();
EventHotKeyID keyID;
keyID.signature = 'cute';
@@ -255,15 +232,16 @@ 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;
}