diff options
Diffstat (limited to 'qxt-mini')
| -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;  } | 
