// // KeyboardSupport.m // // Created by Diego Waxemberg on 8/25/18. // Copyright © 2018 Moonlight Game Streaming Project. All rights reserved. // Modified by Duy to use X11 symcodes used in guacamole and VNC // #import #import "KeyboardSupport.h" #define XK_MISCELLANY #define XK_LATIN1 #define XK_CURRENCY #import "keysymdef.h" extern long GetKeySymCode(UIKey* key) { long keyCode = 0; long isShift = false; if (key.modifierFlags & UIKeyModifierShift) { isShift = true; } // if (key.modifierFlags & UIKeyModifierAlternate) { // modifierFlags |= MODIFIER_ALT; // } // if (key.modifierFlags & (UIKeyModifierControl | UIKeyModifierCommand)) { // modifierFlags |= MODIFIER_CTRL; // } // This converts UIKeyboardHIDUsage values to Win32 VK_* values // https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes if (key.keyCode >= UIKeyboardHIDUsageKeyboardA && key.keyCode <= UIKeyboardHIDUsageKeyboardZ) { keyCode = (key.keyCode - UIKeyboardHIDUsageKeyboardA) + (isShift ? XK_A : XK_a); } else if (key.keyCode == UIKeyboardHIDUsageKeyboard0) { // This key is at the beginning of the VK_ range but the end // of the UIKeyboardHIDUsageKeyboard range. keyCode = isShift ? XK_parenright : XK_0; } else if (!isShift && key.keyCode >= UIKeyboardHIDUsageKeyboard1 && key.keyCode <= UIKeyboardHIDUsageKeyboard9) { keyCode = (key.keyCode - UIKeyboardHIDUsageKeyboard1) + XK_1; } else if (key.keyCode == UIKeyboardHIDUsageKeypad0) { // This key is at the beginning of the VK_ range but the end // of the UIKeyboardHIDUsageKeypad range. keyCode = XK_KP_0; } else if (key.keyCode >= UIKeyboardHIDUsageKeypad1 && key.keyCode <= UIKeyboardHIDUsageKeypad9) { keyCode = (key.keyCode - UIKeyboardHIDUsageKeypad1) + XK_KP_1; } else if (key.keyCode >= UIKeyboardHIDUsageKeyboardF1 && key.keyCode <= UIKeyboardHIDUsageKeyboardF12) { keyCode = (key.keyCode - UIKeyboardHIDUsageKeyboardF1) + XK_F1; } else if (key.keyCode >= UIKeyboardHIDUsageKeyboardF13 && key.keyCode <= UIKeyboardHIDUsageKeyboardF24) { keyCode = (key.keyCode - UIKeyboardHIDUsageKeyboardF13) + XK_F13; } else { switch (key.keyCode) { case UIKeyboardHIDUsageKeyboard1: keyCode = XK_exclam; break; case UIKeyboardHIDUsageKeyboard2: keyCode = XK_at; break; case UIKeyboardHIDUsageKeyboard3: keyCode = XK_numbersign; break; case UIKeyboardHIDUsageKeyboard4: keyCode = XK_dollar; break; case UIKeyboardHIDUsageKeyboard5: keyCode = XK_percent; break; case UIKeyboardHIDUsageKeyboard6: keyCode = XK_asciicircum; break; case UIKeyboardHIDUsageKeyboard7: keyCode = XK_ampersand; break; case UIKeyboardHIDUsageKeyboard8: keyCode = XK_asterisk; break; case UIKeyboardHIDUsageKeyboard9: keyCode = XK_parenleft; break; case UIKeyboardHIDUsageKeyboardReturnOrEnter: keyCode = XK_Return; break; case UIKeyboardHIDUsageKeyboardEscape: keyCode = XK_Escape; break; case UIKeyboardHIDUsageKeyboardDeleteOrBackspace: keyCode = XK_BackSpace; break; case UIKeyboardHIDUsageKeyboardTab: keyCode = XK_Tab; break; case UIKeyboardHIDUsageKeyboardSpacebar: keyCode = XK_space; break; case UIKeyboardHIDUsageKeyboardHyphen: keyCode = !isShift ? XK_minus : XK_underscore; break; case UIKeyboardHIDUsageKeyboardEqualSign: keyCode = !isShift ? XK_equal : XK_plus; break; case UIKeyboardHIDUsageKeyboardOpenBracket: keyCode = !isShift ? XK_bracketleft : XK_braceleft; break; case UIKeyboardHIDUsageKeyboardCloseBracket: keyCode = !isShift ? XK_bracketright : XK_braceright; break; case UIKeyboardHIDUsageKeyboardBackslash: keyCode = !isShift ? XK_backslash : XK_bar; break; case UIKeyboardHIDUsageKeyboardSemicolon: keyCode = !isShift ? XK_semicolon : XK_colon; break; case UIKeyboardHIDUsageKeyboardQuote: keyCode = !isShift ? XK_quoteright : XK_quotedbl; break; case UIKeyboardHIDUsageKeyboardGraveAccentAndTilde: keyCode = !isShift ? XK_grave : XK_asciitilde; break; case UIKeyboardHIDUsageKeyboardComma: keyCode = !isShift ? XK_comma : XK_less; break; case UIKeyboardHIDUsageKeyboardPeriod: keyCode = !isShift ? XK_period : XK_greater; break; case UIKeyboardHIDUsageKeyboardSlash: keyCode = !isShift ? XK_slash : XK_question; break; case UIKeyboardHIDUsageKeyboardCapsLock: keyCode = XK_Caps_Lock; break; case UIKeyboardHIDUsageKeyboardPrintScreen: keyCode = XK_Print; break; case UIKeyboardHIDUsageKeyboardScrollLock: keyCode = XK_Scroll_Lock; break; case UIKeyboardHIDUsageKeyboardPause: keyCode = XK_Pause; break; case UIKeyboardHIDUsageKeyboardInsert: keyCode = XK_Insert; break; case UIKeyboardHIDUsageKeyboardHome: keyCode = XK_Home; break; case UIKeyboardHIDUsageKeyboardPageUp: keyCode = XK_Page_Up; break; case UIKeyboardHIDUsageKeyboardDeleteForward: keyCode = XK_Delete; break; case UIKeyboardHIDUsageKeyboardEnd: keyCode = XK_End; break; case UIKeyboardHIDUsageKeyboardPageDown: keyCode = XK_Page_Down; break; case UIKeyboardHIDUsageKeyboardRightArrow: keyCode = XK_Right; break; case UIKeyboardHIDUsageKeyboardLeftArrow: keyCode = XK_Left; break; case UIKeyboardHIDUsageKeyboardDownArrow: keyCode = XK_Down; break; case UIKeyboardHIDUsageKeyboardUpArrow: keyCode = XK_Up; break; case UIKeyboardHIDUsageKeypadNumLock: keyCode = XK_Num_Lock; break; case UIKeyboardHIDUsageKeypadSlash: keyCode = XK_KP_Decimal; break; case UIKeyboardHIDUsageKeypadAsterisk: keyCode = XK_asterisk; break; case UIKeyboardHIDUsageKeypadHyphen: keyCode = XK_KP_Subtract; break; case UIKeyboardHIDUsageKeypadPlus: keyCode = XK_KP_Add; break; case UIKeyboardHIDUsageKeypadEnter: keyCode = XK_KP_Enter; break; case UIKeyboardHIDUsageKeypadPeriod: keyCode = XK_KP_Decimal; break; case UIKeyboardHIDUsageKeyboardNonUSBackslash: keyCode = XK_backslash; //FIXME: Dup break; case UIKeyboardHIDUsageKeypadComma: keyCode = XK_KP_Separator; //FIXME: Dup break; case UIKeyboardHIDUsageKeyboardCancel: keyCode = XK_Cancel; break; case UIKeyboardHIDUsageKeyboardClear: keyCode = XK_Clear; break; // case UIKeyboardHIDUsageKeyboardCrSelOrProps: // keyCode = 0xF7; // break; // case UIKeyboardHIDUsageKeyboardExSel: // keyCode = 0xF8; // break; case UIKeyboardHIDUsageKeyboardLeftGUI: keyCode = XK_Alt_L; break; case UIKeyboardHIDUsageKeyboardLeftControl: keyCode = XK_Control_L; break; case UIKeyboardHIDUsageKeyboardLeftShift: keyCode = XK_Shift_L; break; case UIKeyboardHIDUsageKeyboardLeftAlt: keyCode = XK_Meta_L; break; case UIKeyboardHIDUsageKeyboardRightGUI: keyCode = XK_Alt_R; break; case UIKeyboardHIDUsageKeyboardRightControl: keyCode = XK_Control_R; break; case UIKeyboardHIDUsageKeyboardRightShift: keyCode = XK_Shift_R; break; case UIKeyboardHIDUsageKeyboardRightAlt: keyCode = XK_Meta_R; break; case 669: //GLOBE KEY keyCode = XK_Alt_L; break; default: NSLog(@"Unhandled HID usage: %lu", (unsigned long)key.keyCode); // assert(0); // return false; } } return keyCode; }