From 6c40fde892ae8d833802b60a67661812acfd63a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 4 Mar 2013 20:37:44 -0500 Subject: [PATCH] libwinpr-input: map most evdev keycodes --- libfreerdp/locale/keyboard_xkbfile.c | 25 +++ winpr/include/winpr/input.h | 25 +-- winpr/libwinpr/input/keycode.c | 221 ++++++++++++++------------- winpr/libwinpr/input/scancode.c | 65 ++++---- 4 files changed, 186 insertions(+), 150 deletions(-) diff --git a/libfreerdp/locale/keyboard_xkbfile.c b/libfreerdp/locale/keyboard_xkbfile.c index e0efb22fd..1113a6141 100644 --- a/libfreerdp/locale/keyboard_xkbfile.c +++ b/libfreerdp/locale/keyboard_xkbfile.c @@ -28,6 +28,7 @@ #include #include +#include #include @@ -202,6 +203,30 @@ UINT32 freerdp_keyboard_init_xkbfile(UINT32 keyboardLayoutId, RDP_SCANCODE x11_k freerdp_keyboard_load_map_from_xkbfile(display, x11_keycode_to_rdp_scancode); +#if 1 + //ZeroMemory(x11_keycode_to_rdp_scancode, sizeof(RDP_SCANCODE) * 256); + + { + DWORD keycode; + DWORD vkcode; + DWORD scancode; + + for (keycode = 0; keycode < 256; keycode++) + { + vkcode = GetVirtualKeyCodeFromKeycode(keycode, KEYCODE_TYPE_EVDEV); + scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4); + + if (x11_keycode_to_rdp_scancode[keycode] != scancode) + { + printf("mismatch keycode 0x%04X (%d) -> vkcode 0x%04X (%s) -> scancode 0x%04X, expected: 0x%04X\n", + keycode, keycode, vkcode, GetVirtualKeyName(vkcode & 0xFF), scancode, x11_keycode_to_rdp_scancode[keycode]); + } + + x11_keycode_to_rdp_scancode[keycode] = scancode; + } + } +#endif + XCloseDisplay(display); return keyboardLayoutId; diff --git a/winpr/include/winpr/input.h b/winpr/include/winpr/input.h index 67ab4995f..3edfaadb4 100644 --- a/winpr/include/winpr/input.h +++ b/winpr/include/winpr/input.h @@ -420,19 +420,19 @@ #define KBD4_T44 VK_F10 #define KBD4_T45 VK_NUMLOCK #define KBD4_T46 VK_SCROLL -#define KBD4_T47 VK_HOME -#define KBD4_T48 VK_UP -#define KBD4_T49 VK_PRIOR +#define KBD4_T47 VK_NUMPAD7 /* VK_HOME */ +#define KBD4_T48 VK_NUMPAD8 /* VK_UP */ +#define KBD4_T49 VK_NUMPAD9 /* VK_PRIOR */ #define KBD4_T4A VK_SUBTRACT -#define KBD4_T4B VK_LEFT -#define KBD4_T4C VK_CLEAR -#define KBD4_T4D VK_RIGHT +#define KBD4_T4B VK_NUMPAD4 /* VK_LEFT */ +#define KBD4_T4C VK_NUMPAD5 /* VK_CLEAR */ +#define KBD4_T4D VK_NUMPAD6 /* VK_RIGHT */ #define KBD4_T4E VK_ADD -#define KBD4_T4F VK_END -#define KBD4_T50 VK_DOWN -#define KBD4_T51 VK_NEXT -#define KBD4_T52 VK_INSERT -#define KBD4_T53 VK_DELETE +#define KBD4_T4F VK_NUMPAD1 /* VK_END */ +#define KBD4_T50 VK_NUMPAD2 /* VK_DOWN */ +#define KBD4_T51 VK_NUMPAD3 /* VK_NEXT */ +#define KBD4_T52 VK_NUMPAD0 /* VK_INSERT */ +#define KBD4_T53 VK_DECIMAL /* VK_DELETE */ #define KBD4_T54 VK_SNAPSHOT #define KBD4_T55 VK_NONE #define KBD4_T56 VK_OEM_102 /* NE */ @@ -492,7 +492,7 @@ #define KBD4_X35 VK_DIVIDE #define KBD4_X37 VK_SNAPSHOT #define KBD4_X38 VK_RMENU -#define KBD4_X46 VK_CANCEL +#define KBD4_X46 VK_PAUSE /* VK_CANCEL */ #define KBD4_X47 VK_HOME #define KBD4_X48 VK_UP #define KBD4_X49 VK_PRIOR @@ -848,6 +848,7 @@ WINPR_API DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKey WINPR_API DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType); #define KEYCODE_TYPE_APPLE 0x00000001 +#define KEYCODE_TYPE_EVDEV 0x00000002 WINPR_API DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags); diff --git a/winpr/libwinpr/input/keycode.c b/winpr/libwinpr/input/keycode.c index 80c0f8616..9d93b35af 100644 --- a/winpr/libwinpr/input/keycode.c +++ b/winpr/libwinpr/input/keycode.c @@ -300,6 +300,8 @@ DWORD KEYCODE_TO_VKCODE_APPLE[256] = * http://www.freedesktop.org/wiki/Software/XKeyboardConfig */ +/* TODO: Finish Japanese Keyboard */ + DWORD KEYCODE_TO_VKCODE_EVDEV[256] = { 0, /* 0 */ @@ -311,117 +313,117 @@ DWORD KEYCODE_TO_VKCODE_EVDEV[256] = 0, /* 6 */ 0, /* 7 */ 0, /* 8 */ - 0, /* 9 */ - 0, /* 10 */ - 0, /* 11 */ - 0, /* 12 */ - 0, /* 13 */ - 0, /* 14 */ - 0, /* 15 */ - 0, /* 16 */ - 0, /* 17 */ - 0, /* 18 */ - 0, /* 19 */ - 0, /* 20 */ - 0, /* 21 */ - 0, /* 22 */ - 0, /* 23 */ - 0, /* 24 */ - 0, /* 25 */ - 0, /* 26 */ - 0, /* 27 */ - 0, /* 28 */ - 0, /* 29 */ - 0, /* 30 */ - 0, /* 31 */ - 0, /* 32 */ - 0, /* 33 */ - 0, /* 34 */ - 0, /* 35 */ - 0, /* 36 */ - 0, /* 37 */ - 0, /* 38 */ - 0, /* 39 */ - 0, /* 40 */ - 0, /* 41 */ - 0, /* 42 */ - 0, /* 43 */ - 0, /* 44 */ - 0, /* 45 */ - 0, /* 46 */ - 0, /* 47 */ - 0, /* 48 */ - 0, /* 49 */ - 0, /* 50 */ - 0, /* 51 */ - 0, /* 52 */ - 0, /* 53 */ - 0, /* 54 */ - 0, /* 55 */ - 0, /* 56 */ - 0, /* 57 */ - 0, /* 58 */ - 0, /* 59 */ - 0, /* 60 */ - 0, /* 61 */ - 0, /* 62 */ - 0, /* 63 */ - 0, /* 64 */ - 0, /* 65 */ - 0, /* 66 */ - 0, /* 67 */ - 0, /* 68 */ - 0, /* 69 */ - 0, /* 70 */ - 0, /* 71 */ - 0, /* 72 */ - 0, /* 73 */ - 0, /* 74 */ - 0, /* 75 */ - 0, /* 76 */ - 0, /* 77 */ - 0, /* 78 */ - 0, /* 79 */ - 0, /* 80 */ - 0, /* 81 */ - 0, /* 82 */ - 0, /* 83 */ - 0, /* 84 */ - 0, /* 85 */ - 0, /* 86 */ - 0, /* 87 */ - 0, /* 88 */ - 0, /* 89 */ - 0, /* 90 */ - 0, /* 91 */ + VK_ESCAPE, /* 9 */ + VK_KEY_1, /* 10 */ + VK_KEY_2, /* 11 */ + VK_KEY_3, /* 12 */ + VK_KEY_4, /* 13 */ + VK_KEY_5, /* 14 */ + VK_KEY_6, /* 15 */ + VK_KEY_7, /* 16 */ + VK_KEY_8, /* 17 */ + VK_KEY_9, /* 18 */ + VK_KEY_0, /* 19 */ + VK_OEM_MINUS, /* 20 */ + VK_OEM_PLUS, /* 21 */ + VK_BACK, /* 22 */ + VK_TAB, /* 23 */ + VK_KEY_Q, /* 24 */ + VK_KEY_W, /* 25 */ + VK_KEY_E, /* 26 */ + VK_KEY_R, /* 27 */ + VK_KEY_T, /* 28 */ + VK_KEY_Y, /* 29 */ + VK_KEY_U, /* 30 */ + VK_KEY_I, /* 31 */ + VK_KEY_O, /* 32 */ + VK_KEY_P, /* 33 */ + VK_OEM_4, /* 34 */ + VK_OEM_6, /* 35 */ + VK_RETURN, /* 36 */ + VK_LCONTROL, /* 37 */ + VK_KEY_A, /* 38 */ + VK_KEY_S, /* 39 */ + VK_KEY_D, /* 40 */ + VK_KEY_F, /* 41 */ + VK_KEY_G, /* 42 */ + VK_KEY_H, /* 43 */ + VK_KEY_J, /* 44 */ + VK_KEY_K, /* 45 */ + VK_KEY_L, /* 46 */ + VK_OEM_1, /* 47 */ + VK_OEM_7, /* 48 */ + VK_OEM_3, /* 49 */ + VK_LSHIFT, /* 50 */ + VK_OEM_5, /* 51 */ + VK_KEY_Z, /* 52 */ + VK_KEY_X, /* 53 */ + VK_KEY_C, /* 54 */ + VK_KEY_V, /* 55 */ + VK_KEY_B, /* 56 */ + VK_KEY_N, /* 57 */ + VK_KEY_M, /* 58 */ + VK_OEM_COMMA, /* 59 */ + VK_OEM_PERIOD, /* 60 */ + VK_OEM_2, /* 61 */ + VK_RSHIFT, /* 62 */ + VK_MULTIPLY, /* 63 */ + VK_LMENU, /* 64 */ + VK_SPACE, /* 65 */ + VK_CAPITAL, /* 66 */ + VK_F1, /* 67 */ + VK_F2, /* 68 */ + VK_F3, /* 69 */ + VK_F4, /* 70 */ + VK_F5, /* 71 */ + VK_F6, /* 72 */ + VK_F7, /* 73 */ + VK_F8, /* 74 */ + VK_F9, /* 75 */ + VK_F10, /* 76 */ + VK_NUMLOCK, /* 77 */ + VK_SCROLL, /* 78 */ + VK_NUMPAD7, /* 79 */ + VK_NUMPAD8, /* 80 */ + VK_NUMPAD9, /* 81 */ + VK_SUBTRACT, /* 82 */ + VK_NUMPAD4, /* 83 */ + VK_NUMPAD5, /* 84 */ + VK_NUMPAD6, /* 85 */ + VK_ADD, /* 86 */ + VK_NUMPAD1, /* 87 */ + VK_NUMPAD2, /* 88 */ + VK_NUMPAD3, /* 89 */ + VK_NUMPAD0, /* 90 */ + VK_DECIMAL, /* 91 */ 0, /* 92 */ 0, /* 93 */ - 0, /* 94 */ - 0, /* 95 */ - 0, /* 96 */ - 0, /* 97 */ + VK_OEM_102, /* 94 */ + VK_F11, /* 95 */ + VK_F12, /* 96 */ + VK_ABNT_C1, /* 97 */ 0, /* 98 */ 0, /* 99 */ 0, /* 100 */ 0, /* 101 */ 0, /* 102 */ 0, /* 103 */ - 0, /* 104 */ - 0, /* 105 */ - 0, /* 106 */ - 0, /* 107 */ - 0, /* 108 */ + VK_RETURN | KBDEXT, /* 104 */ + VK_RCONTROL | KBDEXT, /* 105 */ + VK_DIVIDE | KBDEXT, /* 106 */ + VK_SNAPSHOT | KBDEXT, /* 107 */ + VK_RMENU | KBDEXT, /* 108 */ 0, /* KEY_LINEFEED 109 */ - 0, /* 110 */ - 0, /* 111 */ - 0, /* 112 */ - 0, /* 113 */ - 0, /* 114 */ - 0, /* 115 */ - 0, /* 116 */ - 0, /* 117 */ - 0, /* 118 */ - 0, /* 119 */ + VK_HOME | KBDEXT, /* 110 */ + VK_UP | KBDEXT, /* 111 */ + VK_PRIOR | KBDEXT, /* 112 */ + VK_LEFT | KBDEXT, /* 113 */ + VK_RIGHT | KBDEXT, /* 114 */ + VK_END | KBDEXT, /* 115 */ + VK_DOWN | KBDEXT, /* 116 */ + VK_NEXT | KBDEXT, /* 117 */ + VK_INSERT | KBDEXT, /* 118 */ + VK_DELETE | KBDEXT, /* 119 */ 0, /* KEY_MACRO 120 */ 0, /* 121 */ 0, /* 122 */ @@ -429,15 +431,15 @@ DWORD KEYCODE_TO_VKCODE_EVDEV[256] = 0, /* 124 */ 0, /* 125 */ 0, /* KEY_KPPLUSMINUS 126 */ - 0, /* 127 */ + VK_PAUSE | KBDEXT, /* 127 */ 0, /* KEY_SCALE 128 */ - 0, /* KEY_KPCOMMA 129 */ + VK_ABNT_C2, /* KEY_KPCOMMA 129 */ 0, /* 130 */ 0, /* 131 */ 0, /* 132 */ - 0, /* 133 */ - 0, /* 134 */ - 0, /* 135 */ + VK_LWIN | KBDEXT, /* 133 */ + VK_RWIN | KBDEXT, /* 134 */ + VK_APPS | KBDEXT, /* 135 */ 0, /* 136 */ 0, /* 137 */ 0, /* 138 */ @@ -571,6 +573,11 @@ DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags) if (keycode < 0xFF) vkcode = KEYCODE_TO_VKCODE_APPLE[keycode & 0xFF]; } + else if (dwFlags & KEYCODE_TYPE_EVDEV) + { + if (keycode < 0xFF) + vkcode = KEYCODE_TO_VKCODE_EVDEV[keycode & 0xFF]; + } if (!vkcode) vkcode = VK_NONE; diff --git a/winpr/libwinpr/input/scancode.c b/winpr/libwinpr/input/scancode.c index 5711f789a..d4a92ca8e 100644 --- a/winpr/libwinpr/input/scancode.c +++ b/winpr/libwinpr/input/scancode.c @@ -294,7 +294,7 @@ DWORD KBD4X[128] = VK_NONE, VK_NONE, VK_NONE, - VK_NONE + VK_NONE, }; /** @@ -576,19 +576,18 @@ DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType) if (dwKeyboardType == 4) { - if (scancode & KBDEXT) - vkcode = KBD4X[scancode & 0x7F]; - else - vkcode = KBD4T[scancode & 0x7F]; + if (vkcode < 128) + vkcode = (scancode & KBDEXT) ? KBD4X[scancode] : KBD4T[scancode]; } else if (dwKeyboardType == 7) { - if (scancode & KBDEXT) - vkcode = KBD7X[scancode & 0x7F]; - else - vkcode = KBD7T[scancode & 0x7F]; + if (vkcode < 128) + vkcode = (scancode & KBDEXT) ? KBD7X[scancode] : KBD7T[scancode]; } + if (!vkcode) + vkcode = VK_NONE; + return vkcode; } @@ -604,20 +603,22 @@ DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType) if (dwKeyboardType == 4) { - for (i = 0; i < 128; i++) - { - if (KBD4T[i] == vkcode) - { - scancode = i; - break; - } - } - - if (!scancode) + if (vkcode & KBDEXT) { for (i = 0; i < 128; i++) { - if (KBD4X[i] == vkcode) + if (KBD4X[i] == (vkcode & 0xFF)) + { + scancode = (i | KBDEXT); + break; + } + } + } + else + { + for (i = 0; i < 128; i++) + { + if (KBD4T[i] == (vkcode & 0xFF)) { scancode = i; break; @@ -627,20 +628,22 @@ DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType) } else if (dwKeyboardType == 7) { - for (i = 0; i < 128; i++) - { - if (KBD7T[i] == vkcode) - { - scancode = i; - break; - } - } - - if (!scancode) + if (vkcode & KBDEXT) { for (i = 0; i < 128; i++) { - if (KBD7X[i] == vkcode) + if (KBD7X[i] == (vkcode & 0xFF)) + { + scancode = (i | KBDEXT); + break; + } + } + } + else + { + for (i = 0; i < 128; i++) + { + if (KBD7T[i] == (vkcode & 0xFF)) { scancode = i; break;