1 #include <Carbon/Carbon.h>
4 #include <QApplication>
7 static QMap<quint32, EventHotKeyRef>
keyRefs;
8 static QHash<Identifier, quint32>
keyIDs;
16 qApp->macEventFilter(nextHandler, event);
20 #if !TTK_QT_VERSION_CHECK(5,0,0)
24 EventRef
event = (EventRef) message;
25 if(GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed)
28 GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID,
nullptr,
sizeof(keyID),
nullptr, &keyID);
35 bool QGlobalShortcutPrivate::nativeEventFilter(
const QByteArray &,
void *message,
qint *)
37 EventRef
event = (EventRef) message;
38 if(GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed)
41 GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID,
nullptr,
sizeof(keyID),
nullptr, &keyID);
52 if(modifiers & Qt::ShiftModifier)
54 if(modifiers & Qt::ControlModifier)
56 if(modifiers & Qt::AltModifier)
58 if(modifiers & Qt::MetaModifier)
60 if(modifiers & Qt::KeypadModifier)
61 native |= kEventKeyModifierNumLockMask;
69 if(key == Qt::Key_Up) ch = 0xF700;
70 else if(key == Qt::Key_Down) ch = 0xF701;
71 else if(key == Qt::Key_Left) ch = 0xF702;
72 else if(key == Qt::Key_Right) ch = 0xF703;
73 else if(key >= Qt::Key_F1 && key <= Qt::Key_F35)
74 ch = key - Qt::Key_F1 + 0xF704;
75 else if(key == Qt::Key_Insert) ch = 0xF727;
76 else if(key == Qt::Key_Delete) ch = 0xF728;
77 else if(key == Qt::Key_Home) ch = 0xF729;
78 else if(key == Qt::Key_End) ch = 0xF72B;
79 else if(key == Qt::Key_PageUp) ch = 0xF72C;
80 else if(key == Qt::Key_PageDown) ch = 0xF72D;
81 else if(key == Qt::Key_Print) ch = 0xF72E;
82 else if(key == Qt::Key_ScrollLock) ch = 0xF72F;
83 else if(key == Qt::Key_Pause) ch = 0xF730;
84 else if(key == Qt::Key_SysReq) ch = 0xF731;
85 else if(key == Qt::Key_Stop) ch = 0xF734;
86 else if(key == Qt::Key_Menu) ch = 0xF735;
87 else if(key == Qt::Key_Select) ch = 0xF741;
88 else if(key == Qt::Key_Execute) ch = 0xF742;
89 else if(key == Qt::Key_Help) ch = 0xF746;
90 else if(key == Qt::Key_Mode_switch) ch = 0xF747;
91 else if(key == Qt::Key_Escape) ch = 27;
92 else if(key == Qt::Key_Return) ch = 13;
93 else if(key == Qt::Key_Enter) ch = 3;
94 else if(key == Qt::Key_Tab) ch = 9;
97 KeyboardLayoutRef layout;
98 KeyboardLayoutKind layoutKind;
99 KLGetCurrentKeyboardLayout(&layout);
102 if(layoutKind == kKLKCHRKind)
104 if(ch > 255)
return 0;
109 for(
int i = 0; i < ct; ++i)
111 char *keyTable = data + 260 + 128 * i;
112 for(
int j = 0; j < 128; ++j)
114 if(keyTable[j] == ch)
return j;
124 UCKeyboardTypeHeader *table = header->keyboardTypeList;
126 for (quint32 i=0; i < header->keyboardTypeCount; i++)
128 UCKeyStateRecordsIndex *stateRec = 0;
129 if(table[i].keyStateRecordsIndexOffset != 0)
131 stateRec =
TTKReinterpretCast(UCKeyStateRecordsIndex*, data + table[i].keyStateRecordsIndexOffset);
132 if(stateRec->keyStateRecordsIndexFormat != kUCKeyStateRecordsIndexFormat) stateRec = 0;
135 UCKeyToCharTableIndex *charTable =
TTKReinterpretCast(UCKeyToCharTableIndex*, data + table[i].keyToCharTableIndexOffset);
136 if(charTable->keyToCharTableIndexFormat != kUCKeyToCharTableIndexFormat)
continue;
138 for (quint32 j=0; j < charTable->keyToCharTableCount; j++)
140 UCKeyOutput *keyToChar =
TTKReinterpretCast(UCKeyOutput*, data + charTable->keyToCharTableOffsets[j]);
141 for (quint32 k=0; k < charTable->keyToCharTableSize; k++)
143 if(keyToChar[k] & kUCKeyOutputTestForIndexMask)
145 long idx = keyToChar[k] & kUCKeyOutputGetIndexMask;
146 if(stateRec && idx < stateRec->keyStateRecordCount)
148 UCKeyStateRecord *rec =
TTKReinterpretCast(UCKeyStateRecord*, data + stateRec->keyStateRecordOffsets[idx]);
149 if(rec->stateZeroCharData == ch)
return k;
152 else if(!(keyToChar[k] & kUCKeyOutputSequenceIndexMask) && keyToChar[k] < 0xFFFE)
154 if(keyToChar[k] == ch)
return k;
168 t.eventClass = kEventClassKeyboard;
169 t.eventKind = kEventHotKeyPressed;
174 keyID.signature =
'cute';
177 EventHotKeyRef ref = 0;
178 bool rv = !RegisterEventHotKey(nativeKey, nativeMods, keyID, GetApplicationEventTarget(), 0, &ref);
191 if(!
keyIDs.contains(
id))
return false;
195 return !UnregisterEventHotKey(ref);
static quint32 nativeKeycode(Qt::Key keycode)
#define TTKConstCast(x, y)
static bool q_mac_handler_installed
static QMap< quint32, EventHotKeyRef > keyRefs
static QHash< Identifier, quint32 > keyIDs
static constexpr wchar_t key[]
static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers)
OSStatus q_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, void *data)
static bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods)
static bool eventFilter(void *message)
static bool registerShortcut(quint32 nativeKey, quint32 nativeMods)
QPair< uint, uint > Identifier
static quint32 hotKeySerial
#define TTKReinterpretCast(x, y)
static void activateShortcut(quint32 nativeKey, quint32 nativeMods)