diff --git a/src/core/macglobalshortcutbackend.mm b/src/core/macglobalshortcutbackend.mm index 9d8485dcb..53ef98e6c 100644 --- a/src/core/macglobalshortcutbackend.mm +++ b/src/core/macglobalshortcutbackend.mm @@ -102,10 +102,29 @@ class MacGlobalShortcutBackendPrivate : boost::noncopyable { private: static QKeySequence GetSequence(NSEvent* event) { NSString* str = [event charactersIgnoringModifiers]; - NSString* lower = [str lowercaseString]; - const char* chars = [lower UTF8String]; + NSString* upper = [str uppercaseString]; + const char* chars = [upper UTF8String]; NSUInteger modifiers = [event modifierFlags]; - int key = Qt::Key_A + chars[0] - 'a'; // >.> + int key = 0; + unsigned char c = chars[0]; + switch (c) { + case 0x1b: key = Qt::Key_Escape; break; + case 0x09: key = Qt::Key_Tab; break; + case 0x0d: key = Qt::Key_Return; break; + case 0x08: key = Qt::Key_Backspace; break; + } + + if (key == 0) { + if (c >= 0x20 && c <= 0x7e) { // ASCII from space to ~ + key = c; + } else { + key = MapFunctionKey([event keyCode]); + if (key == 0) { + return QKeySequence(); + } + } + } + if (modifiers & NSShiftKeyMask) { key += Qt::SHIFT; } @@ -127,6 +146,65 @@ class MacGlobalShortcutBackendPrivate : boost::noncopyable { backend_->KeyPressed(sequence); } + static int MapFunctionKey(int keycode) { + switch (keycode) { + // Function keys + case NSInsertFunctionKey: return Qt::Key_Insert; + case NSDeleteFunctionKey: return Qt::Key_Delete; + case NSPauseFunctionKey: return Qt::Key_Pause; + case NSPrintFunctionKey: return Qt::Key_Print; + case NSSysReqFunctionKey: return Qt::Key_SysReq; + case NSHomeFunctionKey: return Qt::Key_Home; + case NSEndFunctionKey: return Qt::Key_End; + case NSLeftArrowFunctionKey: return Qt::Key_Left; + case NSUpArrowFunctionKey: return Qt::Key_Up; + case NSRightArrowFunctionKey: return Qt::Key_Right; + case NSDownArrowFunctionKey: return Qt::Key_Down; + case NSPageUpFunctionKey: return Qt::Key_PageUp; + case NSPageDownFunctionKey: return Qt::Key_PageDown; + case NSScrollLockFunctionKey: return Qt::Key_ScrollLock; + case NSF1FunctionKey: return Qt::Key_F1; + case NSF2FunctionKey: return Qt::Key_F2; + case NSF3FunctionKey: return Qt::Key_F3; + case NSF4FunctionKey: return Qt::Key_F4; + case NSF5FunctionKey: return Qt::Key_F5; + case NSF6FunctionKey: return Qt::Key_F6; + case NSF7FunctionKey: return Qt::Key_F7; + case NSF8FunctionKey: return Qt::Key_F8; + case NSF9FunctionKey: return Qt::Key_F9; + case NSF10FunctionKey: return Qt::Key_F10; + case NSF11FunctionKey: return Qt::Key_F11; + case NSF12FunctionKey: return Qt::Key_F12; + case NSF13FunctionKey: return Qt::Key_F13; + case NSF14FunctionKey: return Qt::Key_F14; + case NSF15FunctionKey: return Qt::Key_F15; + case NSF16FunctionKey: return Qt::Key_F16; + case NSF17FunctionKey: return Qt::Key_F17; + case NSF18FunctionKey: return Qt::Key_F18; + case NSF19FunctionKey: return Qt::Key_F19; + case NSF20FunctionKey: return Qt::Key_F20; + case NSF21FunctionKey: return Qt::Key_F21; + case NSF22FunctionKey: return Qt::Key_F22; + case NSF23FunctionKey: return Qt::Key_F23; + case NSF24FunctionKey: return Qt::Key_F24; + case NSF25FunctionKey: return Qt::Key_F25; + case NSF26FunctionKey: return Qt::Key_F26; + case NSF27FunctionKey: return Qt::Key_F27; + case NSF28FunctionKey: return Qt::Key_F28; + case NSF29FunctionKey: return Qt::Key_F29; + case NSF30FunctionKey: return Qt::Key_F30; + case NSF31FunctionKey: return Qt::Key_F31; + case NSF32FunctionKey: return Qt::Key_F32; + case NSF33FunctionKey: return Qt::Key_F33; + case NSF34FunctionKey: return Qt::Key_F34; + case NSF35FunctionKey: return Qt::Key_F35; + case NSMenuFunctionKey: return Qt::Key_Menu; + case NSHelpFunctionKey: return Qt::Key_Help; + } + + return 0; + } + id global_monitor_; id local_monitor_; MacGlobalShortcutBackend* backend_;