Implemented QxtGlobalShortcut's Mac specific internals using TIS instead of KL
This commit is contained in:
parent
5c29612935
commit
6e7ff65530
|
@ -69,63 +69,118 @@ quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
|
|||
{
|
||||
UTF16Char ch;
|
||||
// Constants found in NSEvent.h from AppKit.framework
|
||||
if (key == Qt::Key_Up) ch = 0xF700;
|
||||
else if (key == Qt::Key_Down) ch = 0xF701;
|
||||
else if (key == Qt::Key_Left) ch = 0xF702;
|
||||
else if (key == Qt::Key_Right) ch = 0xF703;
|
||||
else if (key >= Qt::Key_F1 && key <= Qt::Key_F35)
|
||||
ch = key - Qt::Key_F1 + 0xF704;
|
||||
else if (key == Qt::Key_Insert) ch = 0xF727;
|
||||
else if (key == Qt::Key_Delete) ch = 0xF728;
|
||||
else if (key == Qt::Key_Home) ch = 0xF729;
|
||||
else if (key == Qt::Key_End) ch = 0xF72B;
|
||||
else if (key == Qt::Key_PageUp) ch = 0xF72C;
|
||||
else if (key == Qt::Key_PageDown) ch = 0xF72D;
|
||||
else if (key == Qt::Key_Print) ch = 0xF72E;
|
||||
else if (key == Qt::Key_ScrollLock) ch = 0xF72F;
|
||||
else if (key == Qt::Key_Pause) ch = 0xF730;
|
||||
else if (key == Qt::Key_SysReq) ch = 0xF731;
|
||||
else if (key == Qt::Key_Stop) ch = 0xF734;
|
||||
else if (key == Qt::Key_Menu) ch = 0xF735;
|
||||
else if (key == Qt::Key_Select) ch = 0xF741;
|
||||
else if (key == Qt::Key_Execute) ch = 0xF742;
|
||||
else if (key == Qt::Key_Help) ch = 0xF746;
|
||||
else if (key == Qt::Key_Mode_switch) ch = 0xF747;
|
||||
else if (key == Qt::Key_Escape) ch = 27;
|
||||
else if (key == Qt::Key_Return) ch = 13;
|
||||
else if (key == Qt::Key_Enter) ch = 3;
|
||||
else if (key == Qt::Key_Tab) ch = 9;
|
||||
else ch = key;
|
||||
|
||||
KeyboardLayoutRef layout;
|
||||
KeyboardLayoutKind layoutKind;
|
||||
KLGetCurrentKeyboardLayout(&layout);
|
||||
KLGetKeyboardLayoutProperty(layout, kKLKind, const_cast<const void**>(reinterpret_cast<void**>(&layoutKind)));
|
||||
|
||||
if (layoutKind == kKLKCHRKind)
|
||||
{ // no Unicode available
|
||||
if (ch > 255) return 0;
|
||||
|
||||
char* data;
|
||||
KLGetKeyboardLayoutProperty(layout, kKLKCHRData, const_cast<const void**>(reinterpret_cast<void**>(&data)));
|
||||
int ct = *reinterpret_cast<short*>(data + 258);
|
||||
for (int i = 0; i < ct; i++)
|
||||
{
|
||||
char* keyTable = data + 260 + 128 * i;
|
||||
for (int j = 0; j < 128; j++)
|
||||
{
|
||||
if (keyTable[j] == ch) return j;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
switch (key)
|
||||
{
|
||||
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:
|
||||
;
|
||||
}
|
||||
|
||||
char* data;
|
||||
KLGetKeyboardLayoutProperty(layout, kKLuchrData, const_cast<const void**>(reinterpret_cast<void**>(&data)));
|
||||
UCKeyboardLayout* header = reinterpret_cast<UCKeyboardLayout*>(data);
|
||||
if (key == Qt::Key_Escape) ch = 27;
|
||||
else if (key == Qt::Key_Return) ch = 13;
|
||||
else if (key == Qt::Key_Enter) ch = 3;
|
||||
else if (key == Qt::Key_Tab) ch = 9;
|
||||
else ch = key;
|
||||
|
||||
CFDataRef currentLayoutData;
|
||||
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
|
||||
|
||||
if (currentKeyboard == NULL)
|
||||
return 0;
|
||||
|
||||
currentLayoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
|
||||
CFRelease(currentKeyboard);
|
||||
if (currentLayoutData == NULL)
|
||||
return 0;
|
||||
|
||||
UCKeyboardLayout* header = (UCKeyboardLayout*)CFDataGetBytePtr(currentLayoutData);
|
||||
UCKeyboardTypeHeader* table = header->keyboardTypeList;
|
||||
|
||||
uint8_t *data = (uint8_t*)header;
|
||||
// God, would a little documentation for this shit kill you...
|
||||
for (quint32 i=0; i < header->keyboardTypeCount; i++)
|
||||
{
|
||||
UCKeyStateRecordsIndex* stateRec = 0;
|
||||
|
@ -159,7 +214,6 @@ quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
|
|||
} // for k
|
||||
} // for j
|
||||
} // for i
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user