From 99f2a503941f69bc7ec15791fddf1dc42bc158a4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 13 Oct 2022 22:40:24 -0700 Subject: [PATCH] X11 scancode mapping cleanup * Consolidated scancode mapping tables into a single location for all backends * Verified that the xfree86_scancode_table2 is largely identical to the Linux scancode table * Updated the Linux scancode table with the latest kernel keycodes (still unmapped) * Route X11 keysym -> scancode mapping through the linux scancode table (which a few hand-written exceptions), which will allow mappings to automatically get picked up as they are added in the Linux scancode table * Disabled verbose reporting of missing keysym mappings, we have enough data for now --- include/SDL_scancode.h | 5 + src/core/linux/SDL_evdev.c | 28 +- src/events/SDL_keyboard.c | 1053 ++++++++++++---------- src/events/SDL_scancode_tables.c | 73 ++ src/events/SDL_scancode_tables_c.h | 37 + src/events/scancodes_darwin.h | 2 + src/events/scancodes_linux.h | 1033 ++++++++++++++++----- src/events/scancodes_windows.h | 2 + src/events/scancodes_xfree86.h | 491 +++++----- src/video/directfb/SDL_DirectFB_events.c | 9 +- src/video/wayland/SDL_waylandevents.c | 74 +- src/video/x11/SDL_x11events.c | 11 +- src/video/x11/SDL_x11keyboard.c | 590 +++++++++--- 13 files changed, 2251 insertions(+), 1157 deletions(-) create mode 100644 src/events/SDL_scancode_tables.c create mode 100644 src/events/SDL_scancode_tables_c.h diff --git a/include/SDL_scancode.h b/include/SDL_scancode.h index aaa782f8d..6f40884ee 100644 --- a/include/SDL_scancode.h +++ b/include/SDL_scancode.h @@ -345,6 +345,11 @@ typedef enum * \name Usage page 0x0C * * These values are mapped from usage page 0x0C (USB consumer page). + * See https://usb.org/sites/default/files/hut1_2.pdf + * + * There are way more keys in the spec than we can represent in the + * current scancode range, so pick the ones that commonly come up in + * real world usage. */ /* @{ */ diff --git a/src/core/linux/SDL_evdev.c b/src/core/linux/SDL_evdev.c index 6355e1392..f5ab06253 100644 --- a/src/core/linux/SDL_evdev.c +++ b/src/core/linux/SDL_evdev.c @@ -42,7 +42,7 @@ #include "SDL_endian.h" #include "SDL_scancode.h" #include "../../events/SDL_events_c.h" -#include "../../events/scancodes_linux.h" /* adds linux_scancode_table */ +#include "../../events/SDL_scancode_tables_c.h" #include "../../core/linux/SDL_evdev_capabilities.h" #include "../../core/linux/SDL_udev.h" @@ -509,23 +509,21 @@ SDL_EVDEV_Poll(void) static SDL_Scancode SDL_EVDEV_translate_keycode(int keycode) { - SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; + SDL_Scancode scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_LINUX, keycode); - if (keycode < SDL_arraysize(linux_scancode_table)) { - scancode = linux_scancode_table[keycode]; - - if (scancode == SDL_SCANCODE_UNKNOWN) { - /* BTN_TOUCH is handled elsewhere, but we might still end up here if - you get an unexpected BTN_TOUCH from something SDL believes is not - a touch device. In this case, we'd rather not get a misleading - SDL_Log message about an unknown key. */ - if (keycode != BTN_TOUCH) { - SDL_Log("The key you just pressed is not recognized by SDL. To help " - "get this fixed, please report this to the SDL forums/mailing list " - " EVDEV KeyCode %d", keycode); - } +#ifdef DEBUG_SCANCODES + if (scancode == SDL_SCANCODE_UNKNOWN) { + /* BTN_TOUCH is handled elsewhere, but we might still end up here if + you get an unexpected BTN_TOUCH from something SDL believes is not + a touch device. In this case, we'd rather not get a misleading + SDL_Log message about an unknown key. */ + if (keycode != BTN_TOUCH) { + SDL_Log("The key you just pressed is not recognized by SDL. To help " + "get this fixed, please report this to the SDL forums/mailing list " + " EVDEV KeyCode %d", keycode); } } +#endif /* DEBUG_SCANCODES */ return scancode; } diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index f83191251..b1e27e1ae 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -53,480 +53,591 @@ struct SDL_Keyboard static SDL_Keyboard SDL_keyboard; static const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES] = { - 0, 0, 0, 0, - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '0', - SDLK_RETURN, - SDLK_ESCAPE, - SDLK_BACKSPACE, - SDLK_TAB, - SDLK_SPACE, - '-', - '=', - '[', - ']', - '\\', - '#', - ';', - '\'', - '`', - ',', - '.', - '/', - SDLK_CAPSLOCK, - SDLK_F1, - SDLK_F2, - SDLK_F3, - SDLK_F4, - SDLK_F5, - SDLK_F6, - SDLK_F7, - SDLK_F8, - SDLK_F9, - SDLK_F10, - SDLK_F11, - SDLK_F12, - SDLK_PRINTSCREEN, - SDLK_SCROLLLOCK, - SDLK_PAUSE, - SDLK_INSERT, - SDLK_HOME, - SDLK_PAGEUP, - SDLK_DELETE, - SDLK_END, - SDLK_PAGEDOWN, - SDLK_RIGHT, - SDLK_LEFT, - SDLK_DOWN, - SDLK_UP, - SDLK_NUMLOCKCLEAR, - SDLK_KP_DIVIDE, - SDLK_KP_MULTIPLY, - SDLK_KP_MINUS, - SDLK_KP_PLUS, - SDLK_KP_ENTER, - SDLK_KP_1, - SDLK_KP_2, - SDLK_KP_3, - SDLK_KP_4, - SDLK_KP_5, - SDLK_KP_6, - SDLK_KP_7, - SDLK_KP_8, - SDLK_KP_9, - SDLK_KP_0, - SDLK_KP_PERIOD, - 0, - SDLK_APPLICATION, - SDLK_POWER, - SDLK_KP_EQUALS, - SDLK_F13, - SDLK_F14, - SDLK_F15, - SDLK_F16, - SDLK_F17, - SDLK_F18, - SDLK_F19, - SDLK_F20, - SDLK_F21, - SDLK_F22, - SDLK_F23, - SDLK_F24, - SDLK_EXECUTE, - SDLK_HELP, - SDLK_MENU, - SDLK_SELECT, - SDLK_STOP, - SDLK_AGAIN, - SDLK_UNDO, - SDLK_CUT, - SDLK_COPY, - SDLK_PASTE, - SDLK_FIND, - SDLK_MUTE, - SDLK_VOLUMEUP, - SDLK_VOLUMEDOWN, - 0, 0, 0, - SDLK_KP_COMMA, - SDLK_KP_EQUALSAS400, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - SDLK_ALTERASE, - SDLK_SYSREQ, - SDLK_CANCEL, - SDLK_CLEAR, - SDLK_PRIOR, - SDLK_RETURN2, - SDLK_SEPARATOR, - SDLK_OUT, - SDLK_OPER, - SDLK_CLEARAGAIN, - SDLK_CRSEL, - SDLK_EXSEL, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - SDLK_KP_00, - SDLK_KP_000, - SDLK_THOUSANDSSEPARATOR, - SDLK_DECIMALSEPARATOR, - SDLK_CURRENCYUNIT, - SDLK_CURRENCYSUBUNIT, - SDLK_KP_LEFTPAREN, - SDLK_KP_RIGHTPAREN, - SDLK_KP_LEFTBRACE, - SDLK_KP_RIGHTBRACE, - SDLK_KP_TAB, - SDLK_KP_BACKSPACE, - SDLK_KP_A, - SDLK_KP_B, - SDLK_KP_C, - SDLK_KP_D, - SDLK_KP_E, - SDLK_KP_F, - SDLK_KP_XOR, - SDLK_KP_POWER, - SDLK_KP_PERCENT, - SDLK_KP_LESS, - SDLK_KP_GREATER, - SDLK_KP_AMPERSAND, - SDLK_KP_DBLAMPERSAND, - SDLK_KP_VERTICALBAR, - SDLK_KP_DBLVERTICALBAR, - SDLK_KP_COLON, - SDLK_KP_HASH, - SDLK_KP_SPACE, - SDLK_KP_AT, - SDLK_KP_EXCLAM, - SDLK_KP_MEMSTORE, - SDLK_KP_MEMRECALL, - SDLK_KP_MEMCLEAR, - SDLK_KP_MEMADD, - SDLK_KP_MEMSUBTRACT, - SDLK_KP_MEMMULTIPLY, - SDLK_KP_MEMDIVIDE, - SDLK_KP_PLUSMINUS, - SDLK_KP_CLEAR, - SDLK_KP_CLEARENTRY, - SDLK_KP_BINARY, - SDLK_KP_OCTAL, - SDLK_KP_DECIMAL, - SDLK_KP_HEXADECIMAL, - 0, 0, - SDLK_LCTRL, - SDLK_LSHIFT, - SDLK_LALT, - SDLK_LGUI, - SDLK_RCTRL, - SDLK_RSHIFT, - SDLK_RALT, - SDLK_RGUI, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - SDLK_MODE, - SDLK_AUDIONEXT, - SDLK_AUDIOPREV, - SDLK_AUDIOSTOP, - SDLK_AUDIOPLAY, - SDLK_AUDIOMUTE, - SDLK_MEDIASELECT, - SDLK_WWW, - SDLK_MAIL, - SDLK_CALCULATOR, - SDLK_COMPUTER, - SDLK_AC_SEARCH, - SDLK_AC_HOME, - SDLK_AC_BACK, - SDLK_AC_FORWARD, - SDLK_AC_STOP, - SDLK_AC_REFRESH, - SDLK_AC_BOOKMARKS, - SDLK_BRIGHTNESSDOWN, - SDLK_BRIGHTNESSUP, - SDLK_DISPLAYSWITCH, - SDLK_KBDILLUMTOGGLE, - SDLK_KBDILLUMDOWN, - SDLK_KBDILLUMUP, - SDLK_EJECT, - SDLK_SLEEP, - SDLK_APP1, - SDLK_APP2, - SDLK_AUDIOREWIND, - SDLK_AUDIOFASTFORWARD, - SDLK_SOFTLEFT, - SDLK_SOFTRIGHT, - SDLK_CALL, - SDLK_ENDCALL, + /* 0 */ 0, + /* 1 */ 0, + /* 2 */ 0, + /* 3 */ 0, + /* 4 */ 'a', + /* 5 */ 'b', + /* 6 */ 'c', + /* 7 */ 'd', + /* 8 */ 'e', + /* 9 */ 'f', + /* 10 */ 'g', + /* 11 */ 'h', + /* 12 */ 'i', + /* 13 */ 'j', + /* 14 */ 'k', + /* 15 */ 'l', + /* 16 */ 'm', + /* 17 */ 'n', + /* 18 */ 'o', + /* 19 */ 'p', + /* 20 */ 'q', + /* 21 */ 'r', + /* 22 */ 's', + /* 23 */ 't', + /* 24 */ 'u', + /* 25 */ 'v', + /* 26 */ 'w', + /* 27 */ 'x', + /* 28 */ 'y', + /* 29 */ 'z', + /* 30 */ '1', + /* 31 */ '2', + /* 32 */ '3', + /* 33 */ '4', + /* 34 */ '5', + /* 35 */ '6', + /* 36 */ '7', + /* 37 */ '8', + /* 38 */ '9', + /* 39 */ '0', + /* 40 */ SDLK_RETURN, + /* 41 */ SDLK_ESCAPE, + /* 42 */ SDLK_BACKSPACE, + /* 43 */ SDLK_TAB, + /* 44 */ SDLK_SPACE, + /* 45 */ '-', + /* 46 */ '=', + /* 47 */ '[', + /* 48 */ ']', + /* 49 */ '\\', + /* 50 */ '#', + /* 51 */ ';', + /* 52 */ '\'', + /* 53 */ '`', + /* 54 */ ',', + /* 55 */ '.', + /* 56 */ '/', + /* 57 */ SDLK_CAPSLOCK, + /* 58 */ SDLK_F1, + /* 59 */ SDLK_F2, + /* 60 */ SDLK_F3, + /* 61 */ SDLK_F4, + /* 62 */ SDLK_F5, + /* 63 */ SDLK_F6, + /* 64 */ SDLK_F7, + /* 65 */ SDLK_F8, + /* 66 */ SDLK_F9, + /* 67 */ SDLK_F10, + /* 68 */ SDLK_F11, + /* 69 */ SDLK_F12, + /* 70 */ SDLK_PRINTSCREEN, + /* 71 */ SDLK_SCROLLLOCK, + /* 72 */ SDLK_PAUSE, + /* 73 */ SDLK_INSERT, + /* 74 */ SDLK_HOME, + /* 75 */ SDLK_PAGEUP, + /* 76 */ SDLK_DELETE, + /* 77 */ SDLK_END, + /* 78 */ SDLK_PAGEDOWN, + /* 79 */ SDLK_RIGHT, + /* 80 */ SDLK_LEFT, + /* 81 */ SDLK_DOWN, + /* 82 */ SDLK_UP, + /* 83 */ SDLK_NUMLOCKCLEAR, + /* 84 */ SDLK_KP_DIVIDE, + /* 85 */ SDLK_KP_MULTIPLY, + /* 86 */ SDLK_KP_MINUS, + /* 87 */ SDLK_KP_PLUS, + /* 88 */ SDLK_KP_ENTER, + /* 89 */ SDLK_KP_1, + /* 90 */ SDLK_KP_2, + /* 91 */ SDLK_KP_3, + /* 92 */ SDLK_KP_4, + /* 93 */ SDLK_KP_5, + /* 94 */ SDLK_KP_6, + /* 95 */ SDLK_KP_7, + /* 96 */ SDLK_KP_8, + /* 97 */ SDLK_KP_9, + /* 98 */ SDLK_KP_0, + /* 99 */ SDLK_KP_PERIOD, + /* 100 */ 0, + /* 101 */ SDLK_APPLICATION, + /* 102 */ SDLK_POWER, + /* 103 */ SDLK_KP_EQUALS, + /* 104 */ SDLK_F13, + /* 105 */ SDLK_F14, + /* 106 */ SDLK_F15, + /* 107 */ SDLK_F16, + /* 108 */ SDLK_F17, + /* 109 */ SDLK_F18, + /* 110 */ SDLK_F19, + /* 111 */ SDLK_F20, + /* 112 */ SDLK_F21, + /* 113 */ SDLK_F22, + /* 114 */ SDLK_F23, + /* 115 */ SDLK_F24, + /* 116 */ SDLK_EXECUTE, + /* 117 */ SDLK_HELP, + /* 118 */ SDLK_MENU, + /* 119 */ SDLK_SELECT, + /* 120 */ SDLK_STOP, + /* 121 */ SDLK_AGAIN, + /* 122 */ SDLK_UNDO, + /* 123 */ SDLK_CUT, + /* 124 */ SDLK_COPY, + /* 125 */ SDLK_PASTE, + /* 126 */ SDLK_FIND, + /* 127 */ SDLK_MUTE, + /* 128 */ SDLK_VOLUMEUP, + /* 129 */ SDLK_VOLUMEDOWN, + /* 130 */ 0, + /* 131 */ 0, + /* 132 */ 0, + /* 133 */ SDLK_KP_COMMA, + /* 134 */ SDLK_KP_EQUALSAS400, + /* 135 */ 0, + /* 136 */ 0, + /* 137 */ 0, + /* 138 */ 0, + /* 139 */ 0, + /* 140 */ 0, + /* 141 */ 0, + /* 142 */ 0, + /* 143 */ 0, + /* 144 */ 0, + /* 145 */ 0, + /* 146 */ 0, + /* 147 */ 0, + /* 148 */ 0, + /* 149 */ 0, + /* 150 */ 0, + /* 151 */ 0, + /* 152 */ 0, + /* 153 */ SDLK_ALTERASE, + /* 154 */ SDLK_SYSREQ, + /* 155 */ SDLK_CANCEL, + /* 156 */ SDLK_CLEAR, + /* 157 */ SDLK_PRIOR, + /* 158 */ SDLK_RETURN2, + /* 159 */ SDLK_SEPARATOR, + /* 160 */ SDLK_OUT, + /* 161 */ SDLK_OPER, + /* 162 */ SDLK_CLEARAGAIN, + /* 163 */ SDLK_CRSEL, + /* 164 */ SDLK_EXSEL, + /* 165 */ 0, + /* 166 */ 0, + /* 167 */ 0, + /* 168 */ 0, + /* 169 */ 0, + /* 170 */ 0, + /* 171 */ 0, + /* 172 */ 0, + /* 173 */ 0, + /* 174 */ 0, + /* 175 */ 0, + /* 176 */ SDLK_KP_00, + /* 177 */ SDLK_KP_000, + /* 178 */ SDLK_THOUSANDSSEPARATOR, + /* 179 */ SDLK_DECIMALSEPARATOR, + /* 180 */ SDLK_CURRENCYUNIT, + /* 181 */ SDLK_CURRENCYSUBUNIT, + /* 182 */ SDLK_KP_LEFTPAREN, + /* 183 */ SDLK_KP_RIGHTPAREN, + /* 184 */ SDLK_KP_LEFTBRACE, + /* 185 */ SDLK_KP_RIGHTBRACE, + /* 186 */ SDLK_KP_TAB, + /* 187 */ SDLK_KP_BACKSPACE, + /* 188 */ SDLK_KP_A, + /* 189 */ SDLK_KP_B, + /* 190 */ SDLK_KP_C, + /* 191 */ SDLK_KP_D, + /* 192 */ SDLK_KP_E, + /* 193 */ SDLK_KP_F, + /* 194 */ SDLK_KP_XOR, + /* 195 */ SDLK_KP_POWER, + /* 196 */ SDLK_KP_PERCENT, + /* 197 */ SDLK_KP_LESS, + /* 198 */ SDLK_KP_GREATER, + /* 199 */ SDLK_KP_AMPERSAND, + /* 200 */ SDLK_KP_DBLAMPERSAND, + /* 201 */ SDLK_KP_VERTICALBAR, + /* 202 */ SDLK_KP_DBLVERTICALBAR, + /* 203 */ SDLK_KP_COLON, + /* 204 */ SDLK_KP_HASH, + /* 205 */ SDLK_KP_SPACE, + /* 206 */ SDLK_KP_AT, + /* 207 */ SDLK_KP_EXCLAM, + /* 208 */ SDLK_KP_MEMSTORE, + /* 209 */ SDLK_KP_MEMRECALL, + /* 210 */ SDLK_KP_MEMCLEAR, + /* 211 */ SDLK_KP_MEMADD, + /* 212 */ SDLK_KP_MEMSUBTRACT, + /* 213 */ SDLK_KP_MEMMULTIPLY, + /* 214 */ SDLK_KP_MEMDIVIDE, + /* 215 */ SDLK_KP_PLUSMINUS, + /* 216 */ SDLK_KP_CLEAR, + /* 217 */ SDLK_KP_CLEARENTRY, + /* 218 */ SDLK_KP_BINARY, + /* 219 */ SDLK_KP_OCTAL, + /* 220 */ SDLK_KP_DECIMAL, + /* 221 */ SDLK_KP_HEXADECIMAL, + /* 222 */ 0, + /* 223 */ 0, + /* 224 */ SDLK_LCTRL, + /* 225 */ SDLK_LSHIFT, + /* 226 */ SDLK_LALT, + /* 227 */ SDLK_LGUI, + /* 228 */ SDLK_RCTRL, + /* 229 */ SDLK_RSHIFT, + /* 230 */ SDLK_RALT, + /* 231 */ SDLK_RGUI, + /* 232 */ 0, + /* 233 */ 0, + /* 234 */ 0, + /* 235 */ 0, + /* 236 */ 0, + /* 237 */ 0, + /* 238 */ 0, + /* 239 */ 0, + /* 240 */ 0, + /* 241 */ 0, + /* 242 */ 0, + /* 243 */ 0, + /* 244 */ 0, + /* 245 */ 0, + /* 246 */ 0, + /* 247 */ 0, + /* 248 */ 0, + /* 249 */ 0, + /* 250 */ 0, + /* 251 */ 0, + /* 252 */ 0, + /* 253 */ 0, + /* 254 */ 0, + /* 255 */ 0, + /* 256 */ 0, + /* 257 */ SDLK_MODE, + /* 258 */ SDLK_AUDIONEXT, + /* 259 */ SDLK_AUDIOPREV, + /* 260 */ SDLK_AUDIOSTOP, + /* 261 */ SDLK_AUDIOPLAY, + /* 262 */ SDLK_AUDIOMUTE, + /* 263 */ SDLK_MEDIASELECT, + /* 264 */ SDLK_WWW, + /* 265 */ SDLK_MAIL, + /* 266 */ SDLK_CALCULATOR, + /* 267 */ SDLK_COMPUTER, + /* 268 */ SDLK_AC_SEARCH, + /* 269 */ SDLK_AC_HOME, + /* 270 */ SDLK_AC_BACK, + /* 271 */ SDLK_AC_FORWARD, + /* 272 */ SDLK_AC_STOP, + /* 273 */ SDLK_AC_REFRESH, + /* 274 */ SDLK_AC_BOOKMARKS, + /* 275 */ SDLK_BRIGHTNESSDOWN, + /* 276 */ SDLK_BRIGHTNESSUP, + /* 277 */ SDLK_DISPLAYSWITCH, + /* 278 */ SDLK_KBDILLUMTOGGLE, + /* 279 */ SDLK_KBDILLUMDOWN, + /* 280 */ SDLK_KBDILLUMUP, + /* 281 */ SDLK_EJECT, + /* 282 */ SDLK_SLEEP, + /* 283 */ SDLK_APP1, + /* 284 */ SDLK_APP2, + /* 285 */ SDLK_AUDIOREWIND, + /* 286 */ SDLK_AUDIOFASTFORWARD, + /* 287 */ SDLK_SOFTLEFT, + /* 288 */ SDLK_SOFTRIGHT, + /* 289 */ SDLK_CALL, + /* 290 */ SDLK_ENDCALL, }; static const char *SDL_scancode_names[SDL_NUM_SCANCODES] = { - NULL, NULL, NULL, NULL, - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "Return", - "Escape", - "Backspace", - "Tab", - "Space", - "-", - "=", - "[", - "]", - "\\", - "#", - ";", - "'", - "`", - ",", - ".", - "/", - "CapsLock", - "F1", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "F10", - "F11", - "F12", - "PrintScreen", - "ScrollLock", - "Pause", - "Insert", - "Home", - "PageUp", - "Delete", - "End", - "PageDown", - "Right", - "Left", - "Down", - "Up", - "Numlock", - "Keypad /", - "Keypad *", - "Keypad -", - "Keypad +", - "Keypad Enter", - "Keypad 1", - "Keypad 2", - "Keypad 3", - "Keypad 4", - "Keypad 5", - "Keypad 6", - "Keypad 7", - "Keypad 8", - "Keypad 9", - "Keypad 0", - "Keypad .", - NULL, - "Application", - "Power", - "Keypad =", - "F13", - "F14", - "F15", - "F16", - "F17", - "F18", - "F19", - "F20", - "F21", - "F22", - "F23", - "F24", - "Execute", - "Help", - "Menu", - "Select", - "Stop", - "Again", - "Undo", - "Cut", - "Copy", - "Paste", - "Find", - "Mute", - "VolumeUp", - "VolumeDown", - NULL, NULL, NULL, - "Keypad ,", - "Keypad = (AS400)", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, - "AltErase", - "SysReq", - "Cancel", - "Clear", - "Prior", - "Return", - "Separator", - "Out", - "Oper", - "Clear / Again", - "CrSel", - "ExSel", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - "Keypad 00", - "Keypad 000", - "ThousandsSeparator", - "DecimalSeparator", - "CurrencyUnit", - "CurrencySubUnit", - "Keypad (", - "Keypad )", - "Keypad {", - "Keypad }", - "Keypad Tab", - "Keypad Backspace", - "Keypad A", - "Keypad B", - "Keypad C", - "Keypad D", - "Keypad E", - "Keypad F", - "Keypad XOR", - "Keypad ^", - "Keypad %", - "Keypad <", - "Keypad >", - "Keypad &", - "Keypad &&", - "Keypad |", - "Keypad ||", - "Keypad :", - "Keypad #", - "Keypad Space", - "Keypad @", - "Keypad !", - "Keypad MemStore", - "Keypad MemRecall", - "Keypad MemClear", - "Keypad MemAdd", - "Keypad MemSubtract", - "Keypad MemMultiply", - "Keypad MemDivide", - "Keypad +/-", - "Keypad Clear", - "Keypad ClearEntry", - "Keypad Binary", - "Keypad Octal", - "Keypad Decimal", - "Keypad Hexadecimal", - NULL, NULL, - "Left Ctrl", - "Left Shift", - "Left Alt", - "Left GUI", - "Right Ctrl", - "Right Shift", - "Right Alt", - "Right GUI", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, - "ModeSwitch", - "AudioNext", - "AudioPrev", - "AudioStop", - "AudioPlay", - "AudioMute", - "MediaSelect", - "WWW", - "Mail", - "Calculator", - "Computer", - "AC Search", - "AC Home", - "AC Back", - "AC Forward", - "AC Stop", - "AC Refresh", - "AC Bookmarks", - "BrightnessDown", - "BrightnessUp", - "DisplaySwitch", - "KBDIllumToggle", - "KBDIllumDown", - "KBDIllumUp", - "Eject", - "Sleep", - "App1", - "App2", - "AudioRewind", - "AudioFastForward", - "SoftLeft", - "SoftRight", - "Call", - "EndCall", + /* 0 */ NULL, + /* 1 */ NULL, + /* 2 */ NULL, + /* 3 */ NULL, + /* 4 */ "A", + /* 5 */ "B", + /* 6 */ "C", + /* 7 */ "D", + /* 8 */ "E", + /* 9 */ "F", + /* 10 */ "G", + /* 11 */ "H", + /* 12 */ "I", + /* 13 */ "J", + /* 14 */ "K", + /* 15 */ "L", + /* 16 */ "M", + /* 17 */ "N", + /* 18 */ "O", + /* 19 */ "P", + /* 20 */ "Q", + /* 21 */ "R", + /* 22 */ "S", + /* 23 */ "T", + /* 24 */ "U", + /* 25 */ "V", + /* 26 */ "W", + /* 27 */ "X", + /* 28 */ "Y", + /* 29 */ "Z", + /* 30 */ "1", + /* 31 */ "2", + /* 32 */ "3", + /* 33 */ "4", + /* 34 */ "5", + /* 35 */ "6", + /* 36 */ "7", + /* 37 */ "8", + /* 38 */ "9", + /* 39 */ "0", + /* 40 */ "Return", + /* 41 */ "Escape", + /* 42 */ "Backspace", + /* 43 */ "Tab", + /* 44 */ "Space", + /* 45 */ "-", + /* 46 */ "=", + /* 47 */ "[", + /* 48 */ "]", + /* 49 */ "\\", + /* 50 */ "#", + /* 51 */ ";", + /* 52 */ "'", + /* 53 */ "`", + /* 54 */ ",", + /* 55 */ ".", + /* 56 */ "/", + /* 57 */ "CapsLock", + /* 58 */ "F1", + /* 59 */ "F2", + /* 60 */ "F3", + /* 61 */ "F4", + /* 62 */ "F5", + /* 63 */ "F6", + /* 64 */ "F7", + /* 65 */ "F8", + /* 66 */ "F9", + /* 67 */ "F10", + /* 68 */ "F11", + /* 69 */ "F12", + /* 70 */ "PrintScreen", + /* 71 */ "ScrollLock", + /* 72 */ "Pause", + /* 73 */ "Insert", + /* 74 */ "Home", + /* 75 */ "PageUp", + /* 76 */ "Delete", + /* 77 */ "End", + /* 78 */ "PageDown", + /* 79 */ "Right", + /* 80 */ "Left", + /* 81 */ "Down", + /* 82 */ "Up", + /* 83 */ "Numlock", + /* 84 */ "Keypad /", + /* 85 */ "Keypad *", + /* 86 */ "Keypad -", + /* 87 */ "Keypad +", + /* 88 */ "Keypad Enter", + /* 89 */ "Keypad 1", + /* 90 */ "Keypad 2", + /* 91 */ "Keypad 3", + /* 92 */ "Keypad 4", + /* 93 */ "Keypad 5", + /* 94 */ "Keypad 6", + /* 95 */ "Keypad 7", + /* 96 */ "Keypad 8", + /* 97 */ "Keypad 9", + /* 98 */ "Keypad 0", + /* 99 */ "Keypad .", + /* 100 */ NULL, + /* 101 */ "Application", + /* 102 */ "Power", + /* 103 */ "Keypad =", + /* 104 */ "F13", + /* 105 */ "F14", + /* 106 */ "F15", + /* 107 */ "F16", + /* 108 */ "F17", + /* 109 */ "F18", + /* 110 */ "F19", + /* 111 */ "F20", + /* 112 */ "F21", + /* 113 */ "F22", + /* 114 */ "F23", + /* 115 */ "F24", + /* 116 */ "Execute", + /* 117 */ "Help", + /* 118 */ "Menu", + /* 119 */ "Select", + /* 120 */ "Stop", + /* 121 */ "Again", + /* 122 */ "Undo", + /* 123 */ "Cut", + /* 124 */ "Copy", + /* 125 */ "Paste", + /* 126 */ "Find", + /* 127 */ "Mute", + /* 128 */ "VolumeUp", + /* 129 */ "VolumeDown", + /* 130 */ NULL, + /* 131 */ NULL, + /* 132 */ NULL, + /* 133 */ "Keypad ,", + /* 134 */ "Keypad = (AS400)", + /* 135 */ NULL, + /* 136 */ NULL, + /* 137 */ NULL, + /* 138 */ NULL, + /* 139 */ NULL, + /* 140 */ NULL, + /* 141 */ NULL, + /* 142 */ NULL, + /* 143 */ NULL, + /* 144 */ NULL, + /* 145 */ NULL, + /* 146 */ NULL, + /* 147 */ NULL, + /* 148 */ NULL, + /* 149 */ NULL, + /* 150 */ NULL, + /* 151 */ NULL, + /* 152 */ NULL, + /* 153 */ "AltErase", + /* 154 */ "SysReq", + /* 155 */ "Cancel", + /* 156 */ "Clear", + /* 157 */ "Prior", + /* 158 */ "Return", + /* 159 */ "Separator", + /* 160 */ "Out", + /* 161 */ "Oper", + /* 162 */ "Clear / Again", + /* 163 */ "CrSel", + /* 164 */ "ExSel", + /* 165 */ NULL, + /* 166 */ NULL, + /* 167 */ NULL, + /* 168 */ NULL, + /* 169 */ NULL, + /* 170 */ NULL, + /* 171 */ NULL, + /* 172 */ NULL, + /* 173 */ NULL, + /* 174 */ NULL, + /* 175 */ NULL, + /* 176 */ "Keypad 00", + /* 177 */ "Keypad 000", + /* 178 */ "ThousandsSeparator", + /* 179 */ "DecimalSeparator", + /* 180 */ "CurrencyUnit", + /* 181 */ "CurrencySubUnit", + /* 182 */ "Keypad (", + /* 183 */ "Keypad )", + /* 184 */ "Keypad {", + /* 185 */ "Keypad }", + /* 186 */ "Keypad Tab", + /* 187 */ "Keypad Backspace", + /* 188 */ "Keypad A", + /* 189 */ "Keypad B", + /* 190 */ "Keypad C", + /* 191 */ "Keypad D", + /* 192 */ "Keypad E", + /* 193 */ "Keypad F", + /* 194 */ "Keypad XOR", + /* 195 */ "Keypad ^", + /* 196 */ "Keypad %", + /* 197 */ "Keypad <", + /* 198 */ "Keypad >", + /* 199 */ "Keypad &", + /* 200 */ "Keypad &&", + /* 201 */ "Keypad |", + /* 202 */ "Keypad ||", + /* 203 */ "Keypad :", + /* 204 */ "Keypad #", + /* 205 */ "Keypad Space", + /* 206 */ "Keypad @", + /* 207 */ "Keypad !", + /* 208 */ "Keypad MemStore", + /* 209 */ "Keypad MemRecall", + /* 210 */ "Keypad MemClear", + /* 211 */ "Keypad MemAdd", + /* 212 */ "Keypad MemSubtract", + /* 213 */ "Keypad MemMultiply", + /* 214 */ "Keypad MemDivide", + /* 215 */ "Keypad +/-", + /* 216 */ "Keypad Clear", + /* 217 */ "Keypad ClearEntry", + /* 218 */ "Keypad Binary", + /* 219 */ "Keypad Octal", + /* 220 */ "Keypad Decimal", + /* 221 */ "Keypad Hexadecimal", + /* 222 */ NULL, + /* 223 */ NULL, + /* 224 */ "Left Ctrl", + /* 225 */ "Left Shift", + /* 226 */ "Left Alt", + /* 227 */ "Left GUI", + /* 228 */ "Right Ctrl", + /* 229 */ "Right Shift", + /* 230 */ "Right Alt", + /* 231 */ "Right GUI", + /* 232 */ NULL, + /* 233 */ NULL, + /* 234 */ NULL, + /* 235 */ NULL, + /* 236 */ NULL, + /* 237 */ NULL, + /* 238 */ NULL, + /* 239 */ NULL, + /* 240 */ NULL, + /* 241 */ NULL, + /* 242 */ NULL, + /* 243 */ NULL, + /* 244 */ NULL, + /* 245 */ NULL, + /* 246 */ NULL, + /* 247 */ NULL, + /* 248 */ NULL, + /* 249 */ NULL, + /* 250 */ NULL, + /* 251 */ NULL, + /* 252 */ NULL, + /* 253 */ NULL, + /* 254 */ NULL, + /* 255 */ NULL, + /* 256 */ NULL, + /* 257 */ "ModeSwitch", + /* 258 */ "AudioNext", + /* 259 */ "AudioPrev", + /* 260 */ "AudioStop", + /* 261 */ "AudioPlay", + /* 262 */ "AudioMute", + /* 263 */ "MediaSelect", + /* 264 */ "WWW", + /* 265 */ "Mail", + /* 266 */ "Calculator", + /* 267 */ "Computer", + /* 268 */ "AC Search", + /* 269 */ "AC Home", + /* 270 */ "AC Back", + /* 271 */ "AC Forward", + /* 272 */ "AC Stop", + /* 273 */ "AC Refresh", + /* 274 */ "AC Bookmarks", + /* 275 */ "BrightnessDown", + /* 276 */ "BrightnessUp", + /* 277 */ "DisplaySwitch", + /* 278 */ "KBDIllumToggle", + /* 279 */ "KBDIllumDown", + /* 280 */ "KBDIllumUp", + /* 281 */ "Eject", + /* 282 */ "Sleep", + /* 283 */ "App1", + /* 284 */ "App2", + /* 285 */ "AudioRewind", + /* 286 */ "AudioFastForward", + /* 287 */ "SoftLeft", + /* 288 */ "SoftRight", + /* 289 */ "Call", + /* 290 */ "EndCall", }; /* Taken from SDL_iconv() */ diff --git a/src/events/SDL_scancode_tables.c b/src/events/SDL_scancode_tables.c new file mode 100644 index 000000000..9c9a55fe8 --- /dev/null +++ b/src/events/SDL_scancode_tables.c @@ -0,0 +1,73 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../SDL_internal.h" + +#if SDL_INPUT_LINUXEV || SDL_VIDEO_DRIVER_DIRECTFB || SDL_VIDEO_DRIVER_WAYLAND || SDL_VIDEO_DRIVER_X11 + +#include "SDL_scancode_tables_c.h" + +#include "scancodes_darwin.h" +#include "scancodes_linux.h" +#include "scancodes_xfree86.h" + +static const struct +{ + SDL_ScancodeTable table; + SDL_Scancode const *scancodes; + int num_entries; +} SDL_scancode_tables[] = { + { SDL_SCANCODE_TABLE_DARWIN, darwin_scancode_table, SDL_arraysize(darwin_scancode_table) }, + { SDL_SCANCODE_TABLE_LINUX, linux_scancode_table, SDL_arraysize(linux_scancode_table) }, + { SDL_SCANCODE_TABLE_XFREE86_1, xfree86_scancode_table, SDL_arraysize(xfree86_scancode_table) }, + { SDL_SCANCODE_TABLE_XFREE86_2, xfree86_scancode_table2, SDL_arraysize(xfree86_scancode_table2) }, + { SDL_SCANCODE_TABLE_XVNC, xvnc_scancode_table, SDL_arraysize(xvnc_scancode_table) }, +}; + +const SDL_Scancode *SDL_GetScancodeTable(SDL_ScancodeTable table, int *num_entries) +{ + int i; + + for (i = 0; i < SDL_arraysize(SDL_scancode_tables); ++i) { + if (table == SDL_scancode_tables[i].table) { + *num_entries = SDL_scancode_tables[i].num_entries; + return SDL_scancode_tables[i].scancodes; + } + } + + *num_entries = 0; + return NULL; +} + +SDL_Scancode SDL_GetScancodeFromTable(SDL_ScancodeTable table, int keycode) +{ + SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; + int num_entries; + const SDL_Scancode *scancodes = SDL_GetScancodeTable(table, &num_entries); + + if (keycode >= 0 && keycode < num_entries) { + scancode = scancodes[keycode]; + } + return scancode; +} + +#endif /* SDL_INPUT_LINUXEV || SDL_VIDEO_DRIVER_DIRECTFB || SDL_VIDEO_DRIVER_WAYLAND || SDL_VIDEO_DRIVER_X11 */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/SDL_scancode_tables_c.h b/src/events/SDL_scancode_tables_c.h new file mode 100644 index 000000000..c85b8ddca --- /dev/null +++ b/src/events/SDL_scancode_tables_c.h @@ -0,0 +1,37 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../SDL_internal.h" + +#include "../../include/SDL_scancode.h" + +typedef enum +{ + SDL_SCANCODE_TABLE_DARWIN, + SDL_SCANCODE_TABLE_LINUX, + SDL_SCANCODE_TABLE_XFREE86_1, + SDL_SCANCODE_TABLE_XFREE86_2, + SDL_SCANCODE_TABLE_XVNC, +} SDL_ScancodeTable; + +extern const SDL_Scancode *SDL_GetScancodeTable(SDL_ScancodeTable table, int *num_entries); +extern SDL_Scancode SDL_GetScancodeFromTable(SDL_ScancodeTable table, int keycode); + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/scancodes_darwin.h b/src/events/scancodes_darwin.h index 75564112a..1d0b5c165 100644 --- a/src/events/scancodes_darwin.h +++ b/src/events/scancodes_darwin.h @@ -157,3 +157,5 @@ static const SDL_Scancode darwin_scancode_table[] = { /* 127 */ SDL_SCANCODE_POWER }; /* *INDENT-ON* */ /* clang-format on */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/scancodes_linux.h b/src/events/scancodes_linux.h index f274e993a..020f76ba9 100644 --- a/src/events/scancodes_linux.h +++ b/src/events/scancodes_linux.h @@ -26,238 +26,805 @@ */ /* *INDENT-OFF* */ /* clang-format off */ static SDL_Scancode const linux_scancode_table[] = { - /* 0 */ SDL_SCANCODE_UNKNOWN, - /* 1 */ SDL_SCANCODE_ESCAPE, - /* 2 */ SDL_SCANCODE_1, - /* 3 */ SDL_SCANCODE_2, - /* 4 */ SDL_SCANCODE_3, - /* 5 */ SDL_SCANCODE_4, - /* 6 */ SDL_SCANCODE_5, - /* 7 */ SDL_SCANCODE_6, - /* 8 */ SDL_SCANCODE_7, - /* 9 */ SDL_SCANCODE_8, - /* 10 */ SDL_SCANCODE_9, - /* 11 */ SDL_SCANCODE_0, - /* 12 */ SDL_SCANCODE_MINUS, - /* 13 */ SDL_SCANCODE_EQUALS, - /* 14 */ SDL_SCANCODE_BACKSPACE, - /* 15 */ SDL_SCANCODE_TAB, - /* 16 */ SDL_SCANCODE_Q, - /* 17 */ SDL_SCANCODE_W, - /* 18 */ SDL_SCANCODE_E, - /* 19 */ SDL_SCANCODE_R, - /* 20 */ SDL_SCANCODE_T, - /* 21 */ SDL_SCANCODE_Y, - /* 22 */ SDL_SCANCODE_U, - /* 23 */ SDL_SCANCODE_I, - /* 24 */ SDL_SCANCODE_O, - /* 25 */ SDL_SCANCODE_P, - /* 26 */ SDL_SCANCODE_LEFTBRACKET, - /* 27 */ SDL_SCANCODE_RIGHTBRACKET, - /* 28 */ SDL_SCANCODE_RETURN, - /* 29 */ SDL_SCANCODE_LCTRL, - /* 30 */ SDL_SCANCODE_A, - /* 31 */ SDL_SCANCODE_S, - /* 32 */ SDL_SCANCODE_D, - /* 33 */ SDL_SCANCODE_F, - /* 34 */ SDL_SCANCODE_G, - /* 35 */ SDL_SCANCODE_H, - /* 36 */ SDL_SCANCODE_J, - /* 37 */ SDL_SCANCODE_K, - /* 38 */ SDL_SCANCODE_L, - /* 39 */ SDL_SCANCODE_SEMICOLON, - /* 40 */ SDL_SCANCODE_APOSTROPHE, - /* 41 */ SDL_SCANCODE_GRAVE, - /* 42 */ SDL_SCANCODE_LSHIFT, - /* 43 */ SDL_SCANCODE_BACKSLASH, - /* 44 */ SDL_SCANCODE_Z, - /* 45 */ SDL_SCANCODE_X, - /* 46 */ SDL_SCANCODE_C, - /* 47 */ SDL_SCANCODE_V, - /* 48 */ SDL_SCANCODE_B, - /* 49 */ SDL_SCANCODE_N, - /* 50 */ SDL_SCANCODE_M, - /* 51 */ SDL_SCANCODE_COMMA, - /* 52 */ SDL_SCANCODE_PERIOD, - /* 53 */ SDL_SCANCODE_SLASH, - /* 54 */ SDL_SCANCODE_RSHIFT, - /* 55 */ SDL_SCANCODE_KP_MULTIPLY, - /* 56 */ SDL_SCANCODE_LALT, - /* 57 */ SDL_SCANCODE_SPACE, - /* 58 */ SDL_SCANCODE_CAPSLOCK, - /* 59 */ SDL_SCANCODE_F1, - /* 60 */ SDL_SCANCODE_F2, - /* 61 */ SDL_SCANCODE_F3, - /* 62 */ SDL_SCANCODE_F4, - /* 63 */ SDL_SCANCODE_F5, - /* 64 */ SDL_SCANCODE_F6, - /* 65 */ SDL_SCANCODE_F7, - /* 66 */ SDL_SCANCODE_F8, - /* 67 */ SDL_SCANCODE_F9, - /* 68 */ SDL_SCANCODE_F10, - /* 69 */ SDL_SCANCODE_NUMLOCKCLEAR, - /* 70 */ SDL_SCANCODE_SCROLLLOCK, - /* 71 */ SDL_SCANCODE_KP_7, - /* 72 */ SDL_SCANCODE_KP_8, - /* 73 */ SDL_SCANCODE_KP_9, - /* 74 */ SDL_SCANCODE_KP_MINUS, - /* 75 */ SDL_SCANCODE_KP_4, - /* 76 */ SDL_SCANCODE_KP_5, - /* 77 */ SDL_SCANCODE_KP_6, - /* 78 */ SDL_SCANCODE_KP_PLUS, - /* 79 */ SDL_SCANCODE_KP_1, - /* 80 */ SDL_SCANCODE_KP_2, - /* 81 */ SDL_SCANCODE_KP_3, - /* 82 */ SDL_SCANCODE_KP_0, - /* 83 */ SDL_SCANCODE_KP_PERIOD, - 0, - /* 85 */ SDL_SCANCODE_LANG5, /* KEY_ZENKAKUHANKAKU */ - /* 86 */ SDL_SCANCODE_NONUSBACKSLASH, /* KEY_102ND */ - /* 87 */ SDL_SCANCODE_F11, - /* 88 */ SDL_SCANCODE_F12, - /* 89 */ SDL_SCANCODE_INTERNATIONAL1, /* KEY_RO */ - /* 90 */ SDL_SCANCODE_LANG3, /* KEY_KATAKANA */ - /* 91 */ SDL_SCANCODE_LANG4, /* KEY_HIRAGANA */ - /* 92 */ SDL_SCANCODE_INTERNATIONAL4, /* KEY_HENKAN */ - /* 93 */ SDL_SCANCODE_INTERNATIONAL2, /* KEY_KATAKANAHIRAGANA */ - /* 94 */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_MUHENKAN */ - /* 95 */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_KPJPCOMMA */ - /* 96 */ SDL_SCANCODE_KP_ENTER, - /* 97 */ SDL_SCANCODE_RCTRL, - /* 98 */ SDL_SCANCODE_KP_DIVIDE, - /* 99 */ SDL_SCANCODE_SYSREQ, - /* 100 */ SDL_SCANCODE_RALT, - /* 101 */ SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED */ - /* 102 */ SDL_SCANCODE_HOME, - /* 103 */ SDL_SCANCODE_UP, - /* 104 */ SDL_SCANCODE_PAGEUP, - /* 105 */ SDL_SCANCODE_LEFT, - /* 106 */ SDL_SCANCODE_RIGHT, - /* 107 */ SDL_SCANCODE_END, - /* 108 */ SDL_SCANCODE_DOWN, - /* 109 */ SDL_SCANCODE_PAGEDOWN, - /* 110 */ SDL_SCANCODE_INSERT, - /* 111 */ SDL_SCANCODE_DELETE, - /* 112 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO */ - /* 113 */ SDL_SCANCODE_MUTE, - /* 114 */ SDL_SCANCODE_VOLUMEDOWN, - /* 115 */ SDL_SCANCODE_VOLUMEUP, - /* 116 */ SDL_SCANCODE_POWER, - /* 117 */ SDL_SCANCODE_KP_EQUALS, - /* 118 */ SDL_SCANCODE_KP_PLUSMINUS, - /* 119 */ SDL_SCANCODE_PAUSE, - 0, - /* 121 */ SDL_SCANCODE_KP_COMMA, - /* 122 */ SDL_SCANCODE_LANG1, /* KEY_HANGUEL */ - /* 123 */ SDL_SCANCODE_LANG2, /* KEY_HANJA */ - /* 124 */ SDL_SCANCODE_INTERNATIONAL3, /* KEY_YEN */ - /* 125 */ SDL_SCANCODE_LGUI, - /* 126 */ SDL_SCANCODE_RGUI, - /* 127 */ SDL_SCANCODE_APPLICATION, /* KEY_COMPOSE */ - /* 128 */ SDL_SCANCODE_STOP, - /* 129 */ SDL_SCANCODE_AGAIN, - /* 130 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROPS */ - /* 131 */ SDL_SCANCODE_UNDO, - /* 132 */ SDL_SCANCODE_UNKNOWN, /* KEY_FRONT */ - /* 133 */ SDL_SCANCODE_COPY, - /* 134 */ SDL_SCANCODE_UNKNOWN, /* KEY_OPEN */ - /* 135 */ SDL_SCANCODE_PASTE, - /* 136 */ SDL_SCANCODE_FIND, - /* 137 */ SDL_SCANCODE_CUT, - /* 138 */ SDL_SCANCODE_HELP, - /* 139 */ SDL_SCANCODE_MENU, - /* 140 */ SDL_SCANCODE_CALCULATOR, - /* 141 */ SDL_SCANCODE_UNKNOWN, /* KEY_SETUP */ - /* 142 */ SDL_SCANCODE_SLEEP, - /* 143 */ SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP */ - /* 144 */ SDL_SCANCODE_UNKNOWN, /* KEY_FILE */ - /* 145 */ SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE */ - /* 146 */ SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE */ - /* 147 */ SDL_SCANCODE_UNKNOWN, /* KEY_XFER */ - /* 148 */ SDL_SCANCODE_APP1, /* KEY_PROG1 */ - /* 149 */ SDL_SCANCODE_APP2, /* KEY_PROG2 */ - /* 150 */ SDL_SCANCODE_WWW, /* KEY_WWW */ - /* 151 */ SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS */ - /* 152 */ SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE */ - /* 153 */ SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTION */ - /* 154 */ SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS */ - /* 155 */ SDL_SCANCODE_MAIL, - /* 156 */ SDL_SCANCODE_AC_BOOKMARKS, - /* 157 */ SDL_SCANCODE_COMPUTER, - /* 158 */ SDL_SCANCODE_AC_BACK, - /* 159 */ SDL_SCANCODE_AC_FORWARD, - /* 160 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD */ - /* 161 */ SDL_SCANCODE_EJECT, /* KEY_EJECTCD */ - /* 162 */ SDL_SCANCODE_UNKNOWN, /* KEY_EJECTCLOSECD */ - /* 163 */ SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG */ - /* 164 */ SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE */ - /* 165 */ SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG */ - /* 166 */ SDL_SCANCODE_AUDIOSTOP, /* KEY_STOPCD */ - /* 167 */ SDL_SCANCODE_UNKNOWN, /* KEY_RECORD */ - /* 168 */ SDL_SCANCODE_AUDIOREWIND, /* KEY_REWIND */ - /* 169 */ SDL_SCANCODE_UNKNOWN, /* KEY_PHONE */ - /* 170 */ SDL_SCANCODE_UNKNOWN, /* KEY_ISO */ - /* 171 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG */ - /* 172 */ SDL_SCANCODE_AC_HOME, - /* 173 */ SDL_SCANCODE_AC_REFRESH, - /* 174 */ SDL_SCANCODE_UNKNOWN, /* KEY_EXIT */ - /* 175 */ SDL_SCANCODE_UNKNOWN, /* KEY_MOVE */ - /* 176 */ SDL_SCANCODE_UNKNOWN, /* KEY_EDIT */ - /* 177 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP */ - /* 178 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN */ - /* 179 */ SDL_SCANCODE_KP_LEFTPAREN, - /* 180 */ SDL_SCANCODE_KP_RIGHTPAREN, - /* 181 */ SDL_SCANCODE_UNKNOWN, /* KEY_NEW */ - /* 182 */ SDL_SCANCODE_UNKNOWN, /* KEY_REDO */ - /* 183 */ SDL_SCANCODE_F13, - /* 184 */ SDL_SCANCODE_F14, - /* 185 */ SDL_SCANCODE_F15, - /* 186 */ SDL_SCANCODE_F16, - /* 187 */ SDL_SCANCODE_F17, - /* 188 */ SDL_SCANCODE_F18, - /* 189 */ SDL_SCANCODE_F19, - /* 190 */ SDL_SCANCODE_F20, - /* 191 */ SDL_SCANCODE_F21, - /* 192 */ SDL_SCANCODE_F22, - /* 193 */ SDL_SCANCODE_F23, - /* 194 */ SDL_SCANCODE_F24, - 0, 0, 0, 0, 0, - /* 200 */ SDL_SCANCODE_UNKNOWN, /* KEY_PLAYCD */ - /* 201 */ SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD */ - /* 202 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 */ - /* 203 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 */ - 0, - /* 205 */ SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND */ - /* 206 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE */ - /* 207 */ SDL_SCANCODE_UNKNOWN, /* KEY_PLAY */ - /* 208 */ SDL_SCANCODE_AUDIOFASTFORWARD, /* KEY_FASTFORWARD */ - /* 209 */ SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST */ - /* 210 */ SDL_SCANCODE_UNKNOWN, /* KEY_PRINT */ - /* 211 */ SDL_SCANCODE_UNKNOWN, /* KEY_HP */ - /* 212 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA */ - /* 213 */ SDL_SCANCODE_UNKNOWN, /* KEY_SOUND */ - /* 214 */ SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION */ - /* 215 */ SDL_SCANCODE_UNKNOWN, /* KEY_EMAIL */ - /* 216 */ SDL_SCANCODE_UNKNOWN, /* KEY_CHAT */ - /* 217 */ SDL_SCANCODE_AC_SEARCH, - /* 218 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT */ - /* 219 */ SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE */ - /* 220 */ SDL_SCANCODE_UNKNOWN, /* KEY_SPORT */ - /* 221 */ SDL_SCANCODE_UNKNOWN, /* KEY_SHOP */ - /* 222 */ SDL_SCANCODE_ALTERASE, - /* 223 */ SDL_SCANCODE_CANCEL, - /* 224 */ SDL_SCANCODE_BRIGHTNESSDOWN, - /* 225 */ SDL_SCANCODE_BRIGHTNESSUP, - /* 226 */ SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA */ - /* 227 */ SDL_SCANCODE_DISPLAYSWITCH, /* KEY_SWITCHVIDEOMODE */ - /* 228 */ SDL_SCANCODE_KBDILLUMTOGGLE, - /* 229 */ SDL_SCANCODE_KBDILLUMDOWN, - /* 230 */ SDL_SCANCODE_KBDILLUMUP, - /* 231 */ SDL_SCANCODE_UNKNOWN, /* KEY_SEND */ - /* 232 */ SDL_SCANCODE_UNKNOWN, /* KEY_REPLY */ - /* 233 */ SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL */ - /* 234 */ SDL_SCANCODE_UNKNOWN, /* KEY_SAVE */ - /* 235 */ SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS */ - /* 236 */ SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY */ + /* 0, 0x000 */ SDL_SCANCODE_UNKNOWN, /* KEY_RESERVED */ + /* 1, 0x001 */ SDL_SCANCODE_ESCAPE, /* KEY_ESC */ + /* 2, 0x002 */ SDL_SCANCODE_1, /* KEY_1 */ + /* 3, 0x003 */ SDL_SCANCODE_2, /* KEY_2 */ + /* 4, 0x004 */ SDL_SCANCODE_3, /* KEY_3 */ + /* 5, 0x005 */ SDL_SCANCODE_4, /* KEY_4 */ + /* 6, 0x006 */ SDL_SCANCODE_5, /* KEY_5 */ + /* 7, 0x007 */ SDL_SCANCODE_6, /* KEY_6 */ + /* 8, 0x008 */ SDL_SCANCODE_7, /* KEY_7 */ + /* 9, 0x009 */ SDL_SCANCODE_8, /* KEY_8 */ + /* 10, 0x00a */ SDL_SCANCODE_9, /* KEY_9 */ + /* 11, 0x00b */ SDL_SCANCODE_0, /* KEY_0 */ + /* 12, 0x00c */ SDL_SCANCODE_MINUS, /* KEY_MINUS */ + /* 13, 0x00d */ SDL_SCANCODE_EQUALS, /* KEY_EQUAL */ + /* 14, 0x00e */ SDL_SCANCODE_BACKSPACE, /* KEY_BACKSPACE */ + /* 15, 0x00f */ SDL_SCANCODE_TAB, /* KEY_TAB */ + /* 16, 0x010 */ SDL_SCANCODE_Q, /* KEY_Q */ + /* 17, 0x011 */ SDL_SCANCODE_W, /* KEY_W */ + /* 18, 0x012 */ SDL_SCANCODE_E, /* KEY_E */ + /* 19, 0x013 */ SDL_SCANCODE_R, /* KEY_R */ + /* 20, 0x014 */ SDL_SCANCODE_T, /* KEY_T */ + /* 21, 0x015 */ SDL_SCANCODE_Y, /* KEY_Y */ + /* 22, 0x016 */ SDL_SCANCODE_U, /* KEY_U */ + /* 23, 0x017 */ SDL_SCANCODE_I, /* KEY_I */ + /* 24, 0x018 */ SDL_SCANCODE_O, /* KEY_O */ + /* 25, 0x019 */ SDL_SCANCODE_P, /* KEY_P */ + /* 26, 0x01a */ SDL_SCANCODE_LEFTBRACKET, /* KEY_LEFTBRACE */ + /* 27, 0x01b */ SDL_SCANCODE_RIGHTBRACKET, /* KEY_RIGHTBRACE */ + /* 28, 0x01c */ SDL_SCANCODE_RETURN, /* KEY_ENTER */ + /* 29, 0x01d */ SDL_SCANCODE_LCTRL, /* KEY_LEFTCTRL */ + /* 30, 0x01e */ SDL_SCANCODE_A, /* KEY_A */ + /* 31, 0x01f */ SDL_SCANCODE_S, /* KEY_S */ + /* 32, 0x020 */ SDL_SCANCODE_D, /* KEY_D */ + /* 33, 0x021 */ SDL_SCANCODE_F, /* KEY_F */ + /* 34, 0x022 */ SDL_SCANCODE_G, /* KEY_G */ + /* 35, 0x023 */ SDL_SCANCODE_H, /* KEY_H */ + /* 36, 0x024 */ SDL_SCANCODE_J, /* KEY_J */ + /* 37, 0x025 */ SDL_SCANCODE_K, /* KEY_K */ + /* 38, 0x026 */ SDL_SCANCODE_L, /* KEY_L */ + /* 39, 0x027 */ SDL_SCANCODE_SEMICOLON, /* KEY_SEMICOLON */ + /* 40, 0x028 */ SDL_SCANCODE_APOSTROPHE, /* KEY_APOSTROPHE */ + /* 41, 0x029 */ SDL_SCANCODE_GRAVE, /* KEY_GRAVE */ + /* 42, 0x02a */ SDL_SCANCODE_LSHIFT, /* KEY_LEFTSHIFT */ + /* 43, 0x02b */ SDL_SCANCODE_BACKSLASH, /* KEY_BACKSLASH */ + /* 44, 0x02c */ SDL_SCANCODE_Z, /* KEY_Z */ + /* 45, 0x02d */ SDL_SCANCODE_X, /* KEY_X */ + /* 46, 0x02e */ SDL_SCANCODE_C, /* KEY_C */ + /* 47, 0x02f */ SDL_SCANCODE_V, /* KEY_V */ + /* 48, 0x030 */ SDL_SCANCODE_B, /* KEY_B */ + /* 49, 0x031 */ SDL_SCANCODE_N, /* KEY_N */ + /* 50, 0x032 */ SDL_SCANCODE_M, /* KEY_M */ + /* 51, 0x033 */ SDL_SCANCODE_COMMA, /* KEY_COMMA */ + /* 52, 0x034 */ SDL_SCANCODE_PERIOD, /* KEY_DOT */ + /* 53, 0x035 */ SDL_SCANCODE_SLASH, /* KEY_SLASH */ + /* 54, 0x036 */ SDL_SCANCODE_RSHIFT, /* KEY_RIGHTSHIFT */ + /* 55, 0x037 */ SDL_SCANCODE_KP_MULTIPLY, /* KEY_KPASTERISK */ + /* 56, 0x038 */ SDL_SCANCODE_LALT, /* KEY_LEFTALT */ + /* 57, 0x039 */ SDL_SCANCODE_SPACE, /* KEY_SPACE */ + /* 58, 0x03a */ SDL_SCANCODE_CAPSLOCK, /* KEY_CAPSLOCK */ + /* 59, 0x03b */ SDL_SCANCODE_F1, /* KEY_F1 */ + /* 60, 0x03c */ SDL_SCANCODE_F2, /* KEY_F2 */ + /* 61, 0x03d */ SDL_SCANCODE_F3, /* KEY_F3 */ + /* 62, 0x03e */ SDL_SCANCODE_F4, /* KEY_F4 */ + /* 63, 0x03f */ SDL_SCANCODE_F5, /* KEY_F5 */ + /* 64, 0x040 */ SDL_SCANCODE_F6, /* KEY_F6 */ + /* 65, 0x041 */ SDL_SCANCODE_F7, /* KEY_F7 */ + /* 66, 0x042 */ SDL_SCANCODE_F8, /* KEY_F8 */ + /* 67, 0x043 */ SDL_SCANCODE_F9, /* KEY_F9 */ + /* 68, 0x044 */ SDL_SCANCODE_F10, /* KEY_F10 */ + /* 69, 0x045 */ SDL_SCANCODE_NUMLOCKCLEAR, /* KEY_NUMLOCK */ + /* 70, 0x046 */ SDL_SCANCODE_SCROLLLOCK, /* KEY_SCROLLLOCK */ + /* 71, 0x047 */ SDL_SCANCODE_KP_7, /* KEY_KP7 */ + /* 72, 0x048 */ SDL_SCANCODE_KP_8, /* KEY_KP8 */ + /* 73, 0x049 */ SDL_SCANCODE_KP_9, /* KEY_KP9 */ + /* 74, 0x04a */ SDL_SCANCODE_KP_MINUS, /* KEY_KPMINUS */ + /* 75, 0x04b */ SDL_SCANCODE_KP_4, /* KEY_KP4 */ + /* 76, 0x04c */ SDL_SCANCODE_KP_5, /* KEY_KP5 */ + /* 77, 0x04d */ SDL_SCANCODE_KP_6, /* KEY_KP6 */ + /* 78, 0x04e */ SDL_SCANCODE_KP_PLUS, /* KEY_KPPLUS */ + /* 79, 0x04f */ SDL_SCANCODE_KP_1, /* KEY_KP1 */ + /* 80, 0x050 */ SDL_SCANCODE_KP_2, /* KEY_KP2 */ + /* 81, 0x051 */ SDL_SCANCODE_KP_3, /* KEY_KP3 */ + /* 82, 0x052 */ SDL_SCANCODE_KP_0, /* KEY_KP0 */ + /* 83, 0x053 */ SDL_SCANCODE_KP_PERIOD, /* KEY_KPDOT */ + /* 84, 0x054 */ SDL_SCANCODE_UNKNOWN, + /* 85, 0x055 */ SDL_SCANCODE_LANG5, /* KEY_ZENKAKUHANKAKU */ + /* 86, 0x056 */ SDL_SCANCODE_NONUSBACKSLASH, /* KEY_102ND */ + /* 87, 0x057 */ SDL_SCANCODE_F11, /* KEY_F11 */ + /* 88, 0x058 */ SDL_SCANCODE_F12, /* KEY_F12 */ + /* 89, 0x059 */ SDL_SCANCODE_INTERNATIONAL1, /* KEY_RO */ + /* 90, 0x05a */ SDL_SCANCODE_LANG3, /* KEY_KATAKANA */ + /* 91, 0x05b */ SDL_SCANCODE_LANG4, /* KEY_HIRAGANA */ + /* 92, 0x05c */ SDL_SCANCODE_INTERNATIONAL4, /* KEY_HENKAN */ + /* 93, 0x05d */ SDL_SCANCODE_INTERNATIONAL2, /* KEY_KATAKANAHIRAGANA */ + /* 94, 0x05e */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_MUHENKAN */ + /* 95, 0x05f */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_KPJPCOMMA */ + /* 96, 0x060 */ SDL_SCANCODE_KP_ENTER, /* KEY_KPENTER */ + /* 97, 0x061 */ SDL_SCANCODE_RCTRL, /* KEY_RIGHTCTRL */ + /* 98, 0x062 */ SDL_SCANCODE_KP_DIVIDE, /* KEY_KPSLASH */ + /* 99, 0x063 */ SDL_SCANCODE_SYSREQ, /* KEY_SYSRQ */ + /* 100, 0x064 */ SDL_SCANCODE_RALT, /* KEY_RIGHTALT */ + /* 101, 0x065 */ SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED */ + /* 102, 0x066 */ SDL_SCANCODE_HOME, /* KEY_HOME */ + /* 103, 0x067 */ SDL_SCANCODE_UP, /* KEY_UP */ + /* 104, 0x068 */ SDL_SCANCODE_PAGEUP, /* KEY_PAGEUP */ + /* 105, 0x069 */ SDL_SCANCODE_LEFT, /* KEY_LEFT */ + /* 106, 0x06a */ SDL_SCANCODE_RIGHT, /* KEY_RIGHT */ + /* 107, 0x06b */ SDL_SCANCODE_END, /* KEY_END */ + /* 108, 0x06c */ SDL_SCANCODE_DOWN, /* KEY_DOWN */ + /* 109, 0x06d */ SDL_SCANCODE_PAGEDOWN, /* KEY_PAGEDOWN */ + /* 110, 0x06e */ SDL_SCANCODE_INSERT, /* KEY_INSERT */ + /* 111, 0x06f */ SDL_SCANCODE_DELETE, /* KEY_DELETE */ + /* 112, 0x070 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO */ + /* 113, 0x071 */ SDL_SCANCODE_MUTE, /* KEY_MUTE */ + /* 114, 0x072 */ SDL_SCANCODE_VOLUMEDOWN, /* KEY_VOLUMEDOWN */ + /* 115, 0x073 */ SDL_SCANCODE_VOLUMEUP, /* KEY_VOLUMEUP */ + /* 116, 0x074 */ SDL_SCANCODE_POWER, /* KEY_POWER */ + /* 117, 0x075 */ SDL_SCANCODE_KP_EQUALS, /* KEY_KPEQUAL */ + /* 118, 0x076 */ SDL_SCANCODE_KP_PLUSMINUS, /* KEY_KPPLUSMINUS */ + /* 119, 0x077 */ SDL_SCANCODE_PAUSE, /* KEY_PAUSE */ + /* 120, 0x078 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCALE */ + /* 121, 0x079 */ SDL_SCANCODE_KP_COMMA, /* KEY_KPCOMMA */ + /* 122, 0x07a */ SDL_SCANCODE_LANG1, /* KEY_HANGEUL */ + /* 123, 0x07b */ SDL_SCANCODE_LANG2, /* KEY_HANJA */ + /* 124, 0x07c */ SDL_SCANCODE_INTERNATIONAL3, /* KEY_YEN */ + /* 125, 0x07d */ SDL_SCANCODE_LGUI, /* KEY_LEFTMETA */ + /* 126, 0x07e */ SDL_SCANCODE_RGUI, /* KEY_RIGHTMETA */ + /* 127, 0x07f */ SDL_SCANCODE_APPLICATION, /* KEY_COMPOSE */ + /* 128, 0x080 */ SDL_SCANCODE_STOP, /* KEY_STOP */ + /* 129, 0x081 */ SDL_SCANCODE_AGAIN, /* KEY_AGAIN */ + /* 130, 0x082 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROPS */ + /* 131, 0x083 */ SDL_SCANCODE_UNDO, /* KEY_UNDO */ + /* 132, 0x084 */ SDL_SCANCODE_UNKNOWN, /* KEY_FRONT */ + /* 133, 0x085 */ SDL_SCANCODE_COPY, /* KEY_COPY */ + /* 134, 0x086 */ SDL_SCANCODE_UNKNOWN, /* KEY_OPEN */ + /* 135, 0x087 */ SDL_SCANCODE_PASTE, /* KEY_PASTE */ + /* 136, 0x088 */ SDL_SCANCODE_FIND, /* KEY_FIND */ + /* 137, 0x089 */ SDL_SCANCODE_CUT, /* KEY_CUT */ + /* 138, 0x08a */ SDL_SCANCODE_HELP, /* KEY_HELP */ + /* 139, 0x08b */ SDL_SCANCODE_MENU, /* KEY_MENU */ + /* 140, 0x08c */ SDL_SCANCODE_CALCULATOR, /* KEY_CALC */ + /* 141, 0x08d */ SDL_SCANCODE_UNKNOWN, /* KEY_SETUP */ + /* 142, 0x08e */ SDL_SCANCODE_SLEEP, /* KEY_SLEEP */ + /* 143, 0x08f */ SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP */ + /* 144, 0x090 */ SDL_SCANCODE_UNKNOWN, /* KEY_FILE */ + /* 145, 0x091 */ SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE */ + /* 146, 0x092 */ SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE */ + /* 147, 0x093 */ SDL_SCANCODE_UNKNOWN, /* KEY_XFER */ + /* 148, 0x094 */ SDL_SCANCODE_APP1, /* KEY_PROG1 */ + /* 149, 0x095 */ SDL_SCANCODE_APP2, /* KEY_PROG2 */ + /* 150, 0x096 */ SDL_SCANCODE_WWW, /* KEY_WWW */ + /* 151, 0x097 */ SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS */ + /* 152, 0x098 */ SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE */ + /* 153, 0x099 */ SDL_SCANCODE_UNKNOWN, /* KEY_ROTATE_DISPLAY */ + /* 154, 0x09a */ SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS */ + /* 155, 0x09b */ SDL_SCANCODE_MAIL, /* KEY_MAIL */ + /* 156, 0x09c */ SDL_SCANCODE_AC_BOOKMARKS, /* KEY_BOOKMARKS */ + /* 157, 0x09d */ SDL_SCANCODE_COMPUTER, /* KEY_COMPUTER */ + /* 158, 0x09e */ SDL_SCANCODE_AC_BACK, /* KEY_BACK */ + /* 159, 0x09f */ SDL_SCANCODE_AC_FORWARD, /* KEY_FORWARD */ + /* 160, 0x0a0 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD */ + /* 161, 0x0a1 */ SDL_SCANCODE_EJECT, /* KEY_EJECTCD */ + /* 162, 0x0a2 */ SDL_SCANCODE_EJECT, /* KEY_EJECTCLOSECD */ + /* 163, 0x0a3 */ SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG */ + /* 164, 0x0a4 */ SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE */ + /* 165, 0x0a5 */ SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG */ + /* 166, 0x0a6 */ SDL_SCANCODE_AUDIOSTOP, /* KEY_STOPCD */ + /* 167, 0x0a7 */ SDL_SCANCODE_UNKNOWN, /* KEY_RECORD */ + /* 168, 0x0a8 */ SDL_SCANCODE_AUDIOREWIND, /* KEY_REWIND */ + /* 169, 0x0a9 */ SDL_SCANCODE_UNKNOWN, /* KEY_PHONE */ + /* 170, 0x0aa */ SDL_SCANCODE_UNKNOWN, /* KEY_ISO */ + /* 171, 0x0ab */ SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG */ + /* 172, 0x0ac */ SDL_SCANCODE_AC_HOME, /* KEY_HOMEPAGE */ + /* 173, 0x0ad */ SDL_SCANCODE_AC_REFRESH, /* KEY_REFRESH */ + /* 174, 0x0ae */ SDL_SCANCODE_UNKNOWN, /* KEY_EXIT */ + /* 175, 0x0af */ SDL_SCANCODE_UNKNOWN, /* KEY_MOVE */ + /* 176, 0x0b0 */ SDL_SCANCODE_UNKNOWN, /* KEY_EDIT */ + /* 177, 0x0b1 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP */ + /* 178, 0x0b2 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN */ + /* 179, 0x0b3 */ SDL_SCANCODE_KP_LEFTPAREN, /* KEY_KPLEFTPAREN */ + /* 180, 0x0b4 */ SDL_SCANCODE_KP_RIGHTPAREN, /* KEY_KPRIGHTPAREN */ + /* 181, 0x0b5 */ SDL_SCANCODE_UNKNOWN, /* KEY_NEW */ + /* 182, 0x0b6 */ SDL_SCANCODE_AGAIN, /* KEY_REDO */ + /* 183, 0x0b7 */ SDL_SCANCODE_F13, /* KEY_F13 */ + /* 184, 0x0b8 */ SDL_SCANCODE_F14, /* KEY_F14 */ + /* 185, 0x0b9 */ SDL_SCANCODE_F15, /* KEY_F15 */ + /* 186, 0x0ba */ SDL_SCANCODE_F16, /* KEY_F16 */ + /* 187, 0x0bb */ SDL_SCANCODE_F17, /* KEY_F17 */ + /* 188, 0x0bc */ SDL_SCANCODE_F18, /* KEY_F18 */ + /* 189, 0x0bd */ SDL_SCANCODE_F19, /* KEY_F19 */ + /* 190, 0x0be */ SDL_SCANCODE_F20, /* KEY_F20 */ + /* 191, 0x0bf */ SDL_SCANCODE_F21, /* KEY_F21 */ + /* 192, 0x0c0 */ SDL_SCANCODE_F22, /* KEY_F22 */ + /* 193, 0x0c1 */ SDL_SCANCODE_F23, /* KEY_F23 */ + /* 194, 0x0c2 */ SDL_SCANCODE_F24, /* KEY_F24 */ + /* 195, 0x0c3 */ SDL_SCANCODE_UNKNOWN, + /* 196, 0x0c4 */ SDL_SCANCODE_UNKNOWN, + /* 197, 0x0c5 */ SDL_SCANCODE_UNKNOWN, + /* 198, 0x0c6 */ SDL_SCANCODE_UNKNOWN, + /* 199, 0x0c7 */ SDL_SCANCODE_UNKNOWN, + /* 200, 0x0c8 */ SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYCD */ + /* 201, 0x0c9 */ SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD */ + /* 202, 0x0ca */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 */ + /* 203, 0x0cb */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 */ + /* 204, 0x0cc */ SDL_SCANCODE_UNKNOWN, /* KEY_ALL_APPLICATIONS */ + /* 205, 0x0cd */ SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND */ + /* 206, 0x0ce */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE */ + /* 207, 0x0cf */ SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAY */ + /* 208, 0x0d0 */ SDL_SCANCODE_AUDIOFASTFORWARD, /* KEY_FASTFORWARD */ + /* 209, 0x0d1 */ SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST */ + /* 210, 0x0d2 */ SDL_SCANCODE_PRINTSCREEN, /* KEY_PRINT */ + /* 211, 0x0d3 */ SDL_SCANCODE_UNKNOWN, /* KEY_HP */ + /* 212, 0x0d4 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA */ + /* 213, 0x0d5 */ SDL_SCANCODE_UNKNOWN, /* KEY_SOUND */ + /* 214, 0x0d6 */ SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION */ + /* 215, 0x0d7 */ SDL_SCANCODE_MAIL, /* KEY_EMAIL */ + /* 216, 0x0d8 */ SDL_SCANCODE_UNKNOWN, /* KEY_CHAT */ + /* 217, 0x0d9 */ SDL_SCANCODE_AC_SEARCH, /* KEY_SEARCH */ + /* 218, 0x0da */ SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT */ + /* 219, 0x0db */ SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE */ + /* 220, 0x0dc */ SDL_SCANCODE_UNKNOWN, /* KEY_SPORT */ + /* 221, 0x0dd */ SDL_SCANCODE_UNKNOWN, /* KEY_SHOP */ + /* 222, 0x0de */ SDL_SCANCODE_ALTERASE, /* KEY_ALTERASE */ + /* 223, 0x0df */ SDL_SCANCODE_CANCEL, /* KEY_CANCEL */ + /* 224, 0x0e0 */ SDL_SCANCODE_BRIGHTNESSDOWN, /* KEY_BRIGHTNESSDOWN */ + /* 225, 0x0e1 */ SDL_SCANCODE_BRIGHTNESSUP, /* KEY_BRIGHTNESSUP */ + /* 226, 0x0e2 */ SDL_SCANCODE_MEDIASELECT, /* KEY_MEDIA */ + /* 227, 0x0e3 */ SDL_SCANCODE_DISPLAYSWITCH, /* KEY_SWITCHVIDEOMODE */ + /* 228, 0x0e4 */ SDL_SCANCODE_KBDILLUMTOGGLE, /* KEY_KBDILLUMTOGGLE */ + /* 229, 0x0e5 */ SDL_SCANCODE_KBDILLUMDOWN, /* KEY_KBDILLUMDOWN */ + /* 230, 0x0e6 */ SDL_SCANCODE_KBDILLUMUP, /* KEY_KBDILLUMUP */ + /* 231, 0x0e7 */ SDL_SCANCODE_UNKNOWN, /* KEY_SEND */ + /* 232, 0x0e8 */ SDL_SCANCODE_UNKNOWN, /* KEY_REPLY */ + /* 233, 0x0e9 */ SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL */ + /* 234, 0x0ea */ SDL_SCANCODE_UNKNOWN, /* KEY_SAVE */ + /* 235, 0x0eb */ SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS */ + /* 236, 0x0ec */ SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY */ + /* 237, 0x0ed */ SDL_SCANCODE_UNKNOWN, /* KEY_BLUETOOTH */ + /* 238, 0x0ee */ SDL_SCANCODE_UNKNOWN, /* KEY_WLAN */ + /* 239, 0x0ef */ SDL_SCANCODE_UNKNOWN, /* KEY_UWB */ + /* 240, 0x0f0 */ SDL_SCANCODE_UNKNOWN, /* KEY_UNKNOWN */ + /* 241, 0x0f1 */ SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_NEXT */ + /* 242, 0x0f2 */ SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_PREV */ + /* 243, 0x0f3 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_CYCLE */ + /* 244, 0x0f4 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_AUTO */ + /* 245, 0x0f5 */ SDL_SCANCODE_UNKNOWN, /* KEY_DISPLAY_OFF */ + /* 246, 0x0f6 */ SDL_SCANCODE_UNKNOWN, /* KEY_WWAN */ + /* 247, 0x0f7 */ SDL_SCANCODE_UNKNOWN, /* KEY_RFKILL */ + /* 248, 0x0f8 */ SDL_SCANCODE_UNKNOWN, /* KEY_MICMUTE */ + /* 249, 0x0f9 */ SDL_SCANCODE_UNKNOWN, + /* 250, 0x0fa */ SDL_SCANCODE_UNKNOWN, + /* 251, 0x0fb */ SDL_SCANCODE_UNKNOWN, + /* 252, 0x0fc */ SDL_SCANCODE_UNKNOWN, + /* 253, 0x0fd */ SDL_SCANCODE_UNKNOWN, + /* 254, 0x0fe */ SDL_SCANCODE_UNKNOWN, + /* 255, 0x0ff */ SDL_SCANCODE_UNKNOWN, +#if 0 /* We don't have any mapped scancodes after this point (yet) */ + /* 256, 0x100 */ SDL_SCANCODE_UNKNOWN, + /* 257, 0x101 */ SDL_SCANCODE_UNKNOWN, + /* 258, 0x102 */ SDL_SCANCODE_UNKNOWN, + /* 259, 0x103 */ SDL_SCANCODE_UNKNOWN, + /* 260, 0x104 */ SDL_SCANCODE_UNKNOWN, + /* 261, 0x105 */ SDL_SCANCODE_UNKNOWN, + /* 262, 0x106 */ SDL_SCANCODE_UNKNOWN, + /* 263, 0x107 */ SDL_SCANCODE_UNKNOWN, + /* 264, 0x108 */ SDL_SCANCODE_UNKNOWN, + /* 265, 0x109 */ SDL_SCANCODE_UNKNOWN, + /* 266, 0x10a */ SDL_SCANCODE_UNKNOWN, + /* 267, 0x10b */ SDL_SCANCODE_UNKNOWN, + /* 268, 0x10c */ SDL_SCANCODE_UNKNOWN, + /* 269, 0x10d */ SDL_SCANCODE_UNKNOWN, + /* 270, 0x10e */ SDL_SCANCODE_UNKNOWN, + /* 271, 0x10f */ SDL_SCANCODE_UNKNOWN, + /* 272, 0x110 */ SDL_SCANCODE_UNKNOWN, + /* 273, 0x111 */ SDL_SCANCODE_UNKNOWN, + /* 274, 0x112 */ SDL_SCANCODE_UNKNOWN, + /* 275, 0x113 */ SDL_SCANCODE_UNKNOWN, + /* 276, 0x114 */ SDL_SCANCODE_UNKNOWN, + /* 277, 0x115 */ SDL_SCANCODE_UNKNOWN, + /* 278, 0x116 */ SDL_SCANCODE_UNKNOWN, + /* 279, 0x117 */ SDL_SCANCODE_UNKNOWN, + /* 280, 0x118 */ SDL_SCANCODE_UNKNOWN, + /* 281, 0x119 */ SDL_SCANCODE_UNKNOWN, + /* 282, 0x11a */ SDL_SCANCODE_UNKNOWN, + /* 283, 0x11b */ SDL_SCANCODE_UNKNOWN, + /* 284, 0x11c */ SDL_SCANCODE_UNKNOWN, + /* 285, 0x11d */ SDL_SCANCODE_UNKNOWN, + /* 286, 0x11e */ SDL_SCANCODE_UNKNOWN, + /* 287, 0x11f */ SDL_SCANCODE_UNKNOWN, + /* 288, 0x120 */ SDL_SCANCODE_UNKNOWN, + /* 289, 0x121 */ SDL_SCANCODE_UNKNOWN, + /* 290, 0x122 */ SDL_SCANCODE_UNKNOWN, + /* 291, 0x123 */ SDL_SCANCODE_UNKNOWN, + /* 292, 0x124 */ SDL_SCANCODE_UNKNOWN, + /* 293, 0x125 */ SDL_SCANCODE_UNKNOWN, + /* 294, 0x126 */ SDL_SCANCODE_UNKNOWN, + /* 295, 0x127 */ SDL_SCANCODE_UNKNOWN, + /* 296, 0x128 */ SDL_SCANCODE_UNKNOWN, + /* 297, 0x129 */ SDL_SCANCODE_UNKNOWN, + /* 298, 0x12a */ SDL_SCANCODE_UNKNOWN, + /* 299, 0x12b */ SDL_SCANCODE_UNKNOWN, + /* 300, 0x12c */ SDL_SCANCODE_UNKNOWN, + /* 301, 0x12d */ SDL_SCANCODE_UNKNOWN, + /* 302, 0x12e */ SDL_SCANCODE_UNKNOWN, + /* 303, 0x12f */ SDL_SCANCODE_UNKNOWN, + /* 304, 0x130 */ SDL_SCANCODE_UNKNOWN, + /* 305, 0x131 */ SDL_SCANCODE_UNKNOWN, + /* 306, 0x132 */ SDL_SCANCODE_UNKNOWN, + /* 307, 0x133 */ SDL_SCANCODE_UNKNOWN, + /* 308, 0x134 */ SDL_SCANCODE_UNKNOWN, + /* 309, 0x135 */ SDL_SCANCODE_UNKNOWN, + /* 310, 0x136 */ SDL_SCANCODE_UNKNOWN, + /* 311, 0x137 */ SDL_SCANCODE_UNKNOWN, + /* 312, 0x138 */ SDL_SCANCODE_UNKNOWN, + /* 313, 0x139 */ SDL_SCANCODE_UNKNOWN, + /* 314, 0x13a */ SDL_SCANCODE_UNKNOWN, + /* 315, 0x13b */ SDL_SCANCODE_UNKNOWN, + /* 316, 0x13c */ SDL_SCANCODE_UNKNOWN, + /* 317, 0x13d */ SDL_SCANCODE_UNKNOWN, + /* 318, 0x13e */ SDL_SCANCODE_UNKNOWN, + /* 319, 0x13f */ SDL_SCANCODE_UNKNOWN, + /* 320, 0x140 */ SDL_SCANCODE_UNKNOWN, + /* 321, 0x141 */ SDL_SCANCODE_UNKNOWN, + /* 322, 0x142 */ SDL_SCANCODE_UNKNOWN, + /* 323, 0x143 */ SDL_SCANCODE_UNKNOWN, + /* 324, 0x144 */ SDL_SCANCODE_UNKNOWN, + /* 325, 0x145 */ SDL_SCANCODE_UNKNOWN, + /* 326, 0x146 */ SDL_SCANCODE_UNKNOWN, + /* 327, 0x147 */ SDL_SCANCODE_UNKNOWN, + /* 328, 0x148 */ SDL_SCANCODE_UNKNOWN, + /* 329, 0x149 */ SDL_SCANCODE_UNKNOWN, + /* 330, 0x14a */ SDL_SCANCODE_UNKNOWN, + /* 331, 0x14b */ SDL_SCANCODE_UNKNOWN, + /* 332, 0x14c */ SDL_SCANCODE_UNKNOWN, + /* 333, 0x14d */ SDL_SCANCODE_UNKNOWN, + /* 334, 0x14e */ SDL_SCANCODE_UNKNOWN, + /* 335, 0x14f */ SDL_SCANCODE_UNKNOWN, + /* 336, 0x150 */ SDL_SCANCODE_UNKNOWN, + /* 337, 0x151 */ SDL_SCANCODE_UNKNOWN, + /* 338, 0x152 */ SDL_SCANCODE_UNKNOWN, + /* 339, 0x153 */ SDL_SCANCODE_UNKNOWN, + /* 340, 0x154 */ SDL_SCANCODE_UNKNOWN, + /* 341, 0x155 */ SDL_SCANCODE_UNKNOWN, + /* 342, 0x156 */ SDL_SCANCODE_UNKNOWN, + /* 343, 0x157 */ SDL_SCANCODE_UNKNOWN, + /* 344, 0x158 */ SDL_SCANCODE_UNKNOWN, + /* 345, 0x159 */ SDL_SCANCODE_UNKNOWN, + /* 346, 0x15a */ SDL_SCANCODE_UNKNOWN, + /* 347, 0x15b */ SDL_SCANCODE_UNKNOWN, + /* 348, 0x15c */ SDL_SCANCODE_UNKNOWN, + /* 349, 0x15d */ SDL_SCANCODE_UNKNOWN, + /* 350, 0x15e */ SDL_SCANCODE_UNKNOWN, + /* 351, 0x15f */ SDL_SCANCODE_UNKNOWN, + /* 352, 0x160 */ SDL_SCANCODE_UNKNOWN, /* KEY_OK */ + /* 353, 0x161 */ SDL_SCANCODE_UNKNOWN, /* KEY_SELECT */ + /* 354, 0x162 */ SDL_SCANCODE_UNKNOWN, /* KEY_GOTO */ + /* 355, 0x163 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLEAR */ + /* 356, 0x164 */ SDL_SCANCODE_UNKNOWN, /* KEY_POWER2 */ + /* 357, 0x165 */ SDL_SCANCODE_UNKNOWN, /* KEY_OPTION */ + /* 358, 0x166 */ SDL_SCANCODE_UNKNOWN, /* KEY_INFO */ + /* 359, 0x167 */ SDL_SCANCODE_UNKNOWN, /* KEY_TIME */ + /* 360, 0x168 */ SDL_SCANCODE_UNKNOWN, /* KEY_VENDOR */ + /* 361, 0x169 */ SDL_SCANCODE_UNKNOWN, /* KEY_ARCHIVE */ + /* 362, 0x16a */ SDL_SCANCODE_UNKNOWN, /* KEY_PROGRAM */ + /* 363, 0x16b */ SDL_SCANCODE_UNKNOWN, /* KEY_CHANNEL */ + /* 364, 0x16c */ SDL_SCANCODE_UNKNOWN, /* KEY_FAVORITES */ + /* 365, 0x16d */ SDL_SCANCODE_UNKNOWN, /* KEY_EPG */ + /* 366, 0x16e */ SDL_SCANCODE_UNKNOWN, /* KEY_PVR */ + /* 367, 0x16f */ SDL_SCANCODE_UNKNOWN, /* KEY_MHP */ + /* 368, 0x170 */ SDL_SCANCODE_UNKNOWN, /* KEY_LANGUAGE */ + /* 369, 0x171 */ SDL_SCANCODE_UNKNOWN, /* KEY_TITLE */ + /* 370, 0x172 */ SDL_SCANCODE_UNKNOWN, /* KEY_SUBTITLE */ + /* 371, 0x173 */ SDL_SCANCODE_UNKNOWN, /* KEY_ANGLE */ + /* 372, 0x174 */ SDL_SCANCODE_UNKNOWN, /* KEY_FULL_SCREEN */ + /* 373, 0x175 */ SDL_SCANCODE_UNKNOWN, /* KEY_MODE */ + /* 374, 0x176 */ SDL_SCANCODE_UNKNOWN, /* KEY_KEYBOARD */ + /* 375, 0x177 */ SDL_SCANCODE_UNKNOWN, /* KEY_ASPECT_RATIO */ + /* 376, 0x178 */ SDL_SCANCODE_UNKNOWN, /* KEY_PC */ + /* 377, 0x179 */ SDL_SCANCODE_UNKNOWN, /* KEY_TV */ + /* 378, 0x17a */ SDL_SCANCODE_UNKNOWN, /* KEY_TV2 */ + /* 379, 0x17b */ SDL_SCANCODE_UNKNOWN, /* KEY_VCR */ + /* 380, 0x17c */ SDL_SCANCODE_UNKNOWN, /* KEY_VCR2 */ + /* 381, 0x17d */ SDL_SCANCODE_UNKNOWN, /* KEY_SAT */ + /* 382, 0x17e */ SDL_SCANCODE_UNKNOWN, /* KEY_SAT2 */ + /* 383, 0x17f */ SDL_SCANCODE_UNKNOWN, /* KEY_CD */ + /* 384, 0x180 */ SDL_SCANCODE_UNKNOWN, /* KEY_TAPE */ + /* 385, 0x181 */ SDL_SCANCODE_UNKNOWN, /* KEY_RADIO */ + /* 386, 0x182 */ SDL_SCANCODE_UNKNOWN, /* KEY_TUNER */ + /* 387, 0x183 */ SDL_SCANCODE_UNKNOWN, /* KEY_PLAYER */ + /* 388, 0x184 */ SDL_SCANCODE_UNKNOWN, /* KEY_TEXT */ + /* 389, 0x185 */ SDL_SCANCODE_UNKNOWN, /* KEY_DVD */ + /* 390, 0x186 */ SDL_SCANCODE_UNKNOWN, /* KEY_AUX */ + /* 391, 0x187 */ SDL_SCANCODE_UNKNOWN, /* KEY_MP3 */ + /* 392, 0x188 */ SDL_SCANCODE_UNKNOWN, /* KEY_AUDIO */ + /* 393, 0x189 */ SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO */ + /* 394, 0x18a */ SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTORY */ + /* 395, 0x18b */ SDL_SCANCODE_UNKNOWN, /* KEY_LIST */ + /* 396, 0x18c */ SDL_SCANCODE_UNKNOWN, /* KEY_MEMO */ + /* 397, 0x18d */ SDL_SCANCODE_UNKNOWN, /* KEY_CALENDAR */ + /* 398, 0x18e */ SDL_SCANCODE_UNKNOWN, /* KEY_RED */ + /* 399, 0x18f */ SDL_SCANCODE_UNKNOWN, /* KEY_GREEN */ + /* 400, 0x190 */ SDL_SCANCODE_UNKNOWN, /* KEY_YELLOW */ + /* 401, 0x191 */ SDL_SCANCODE_UNKNOWN, /* KEY_BLUE */ + /* 402, 0x192 */ SDL_SCANCODE_UNKNOWN, /* KEY_CHANNELUP */ + /* 403, 0x193 */ SDL_SCANCODE_UNKNOWN, /* KEY_CHANNELDOWN */ + /* 404, 0x194 */ SDL_SCANCODE_UNKNOWN, /* KEY_FIRST */ + /* 405, 0x195 */ SDL_SCANCODE_UNKNOWN, /* KEY_LAST */ + /* 406, 0x196 */ SDL_SCANCODE_UNKNOWN, /* KEY_AB */ + /* 407, 0x197 */ SDL_SCANCODE_UNKNOWN, /* KEY_NEXT */ + /* 408, 0x198 */ SDL_SCANCODE_UNKNOWN, /* KEY_RESTART */ + /* 409, 0x199 */ SDL_SCANCODE_UNKNOWN, /* KEY_SLOW */ + /* 410, 0x19a */ SDL_SCANCODE_UNKNOWN, /* KEY_SHUFFLE */ + /* 411, 0x19b */ SDL_SCANCODE_UNKNOWN, /* KEY_BREAK */ + /* 412, 0x19c */ SDL_SCANCODE_UNKNOWN, /* KEY_PREVIOUS */ + /* 413, 0x19d */ SDL_SCANCODE_UNKNOWN, /* KEY_DIGITS */ + /* 414, 0x19e */ SDL_SCANCODE_UNKNOWN, /* KEY_TEEN */ + /* 415, 0x19f */ SDL_SCANCODE_UNKNOWN, /* KEY_TWEN */ + /* 416, 0x1a0 */ SDL_SCANCODE_UNKNOWN, /* KEY_VIDEOPHONE */ + /* 417, 0x1a1 */ SDL_SCANCODE_UNKNOWN, /* KEY_GAMES */ + /* 418, 0x1a2 */ SDL_SCANCODE_UNKNOWN, /* KEY_ZOOMIN */ + /* 419, 0x1a3 */ SDL_SCANCODE_UNKNOWN, /* KEY_ZOOMOUT */ + /* 420, 0x1a4 */ SDL_SCANCODE_UNKNOWN, /* KEY_ZOOMRESET */ + /* 421, 0x1a5 */ SDL_SCANCODE_UNKNOWN, /* KEY_WORDPROCESSOR */ + /* 422, 0x1a6 */ SDL_SCANCODE_UNKNOWN, /* KEY_EDITOR */ + /* 423, 0x1a7 */ SDL_SCANCODE_UNKNOWN, /* KEY_SPREADSHEET */ + /* 424, 0x1a8 */ SDL_SCANCODE_UNKNOWN, /* KEY_GRAPHICSEDITOR */ + /* 425, 0x1a9 */ SDL_SCANCODE_UNKNOWN, /* KEY_PRESENTATION */ + /* 426, 0x1aa */ SDL_SCANCODE_UNKNOWN, /* KEY_DATABASE */ + /* 427, 0x1ab */ SDL_SCANCODE_UNKNOWN, /* KEY_NEWS */ + /* 428, 0x1ac */ SDL_SCANCODE_UNKNOWN, /* KEY_VOICEMAIL */ + /* 429, 0x1ad */ SDL_SCANCODE_UNKNOWN, /* KEY_ADDRESSBOOK */ + /* 430, 0x1ae */ SDL_SCANCODE_UNKNOWN, /* KEY_MESSENGER */ + /* 431, 0x1af */ SDL_SCANCODE_UNKNOWN, /* KEY_DISPLAYTOGGLE */ + /* 432, 0x1b0 */ SDL_SCANCODE_UNKNOWN, /* KEY_SPELLCHECK */ + /* 433, 0x1b1 */ SDL_SCANCODE_UNKNOWN, /* KEY_LOGOFF */ + /* 434, 0x1b2 */ SDL_SCANCODE_UNKNOWN, /* KEY_DOLLAR */ + /* 435, 0x1b3 */ SDL_SCANCODE_UNKNOWN, /* KEY_EURO */ + /* 436, 0x1b4 */ SDL_SCANCODE_UNKNOWN, /* KEY_FRAMEBACK */ + /* 437, 0x1b5 */ SDL_SCANCODE_UNKNOWN, /* KEY_FRAMEFORWARD */ + /* 438, 0x1b6 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONTEXT_MENU */ + /* 439, 0x1b7 */ SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA_REPEAT */ + /* 440, 0x1b8 */ SDL_SCANCODE_UNKNOWN, /* KEY_10CHANNELSUP */ + /* 441, 0x1b9 */ SDL_SCANCODE_UNKNOWN, /* KEY_10CHANNELSDOWN */ + /* 442, 0x1ba */ SDL_SCANCODE_UNKNOWN, /* KEY_IMAGES */ + /* 443, 0x1bb */ SDL_SCANCODE_UNKNOWN, + /* 444, 0x1bc */ SDL_SCANCODE_UNKNOWN, /* KEY_NOTIFICATION_CENTER */ + /* 445, 0x1bd */ SDL_SCANCODE_UNKNOWN, /* KEY_PICKUP_PHONE */ + /* 446, 0x1be */ SDL_SCANCODE_UNKNOWN, /* KEY_HANGUP_PHONE */ + /* 447, 0x1bf */ SDL_SCANCODE_UNKNOWN, + /* 448, 0x1c0 */ SDL_SCANCODE_UNKNOWN, /* KEY_DEL_EOL */ + /* 449, 0x1c1 */ SDL_SCANCODE_UNKNOWN, /* KEY_DEL_EOS */ + /* 450, 0x1c2 */ SDL_SCANCODE_UNKNOWN, /* KEY_INS_LINE */ + /* 451, 0x1c3 */ SDL_SCANCODE_UNKNOWN, /* KEY_DEL_LINE */ + /* 452, 0x1c4 */ SDL_SCANCODE_UNKNOWN, + /* 453, 0x1c5 */ SDL_SCANCODE_UNKNOWN, + /* 454, 0x1c6 */ SDL_SCANCODE_UNKNOWN, + /* 455, 0x1c7 */ SDL_SCANCODE_UNKNOWN, + /* 456, 0x1c8 */ SDL_SCANCODE_UNKNOWN, + /* 457, 0x1c9 */ SDL_SCANCODE_UNKNOWN, + /* 458, 0x1ca */ SDL_SCANCODE_UNKNOWN, + /* 459, 0x1cb */ SDL_SCANCODE_UNKNOWN, + /* 460, 0x1cc */ SDL_SCANCODE_UNKNOWN, + /* 461, 0x1cd */ SDL_SCANCODE_UNKNOWN, + /* 462, 0x1ce */ SDL_SCANCODE_UNKNOWN, + /* 463, 0x1cf */ SDL_SCANCODE_UNKNOWN, + /* 464, 0x1d0 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN */ + /* 465, 0x1d1 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_ESC */ + /* 466, 0x1d2 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F1 */ + /* 467, 0x1d3 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F2 */ + /* 468, 0x1d4 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F3 */ + /* 469, 0x1d5 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F4 */ + /* 470, 0x1d6 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F5 */ + /* 471, 0x1d7 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F6 */ + /* 472, 0x1d8 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F7 */ + /* 473, 0x1d9 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F8 */ + /* 474, 0x1da */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F9 */ + /* 475, 0x1db */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F10 */ + /* 476, 0x1dc */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F11 */ + /* 477, 0x1dd */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F12 */ + /* 478, 0x1de */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_1 */ + /* 479, 0x1df */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_2 */ + /* 480, 0x1e0 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_D */ + /* 481, 0x1e1 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_E */ + /* 482, 0x1e2 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_F */ + /* 483, 0x1e3 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_S */ + /* 484, 0x1e4 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_B */ + /* 485, 0x1e5 */ SDL_SCANCODE_UNKNOWN, /* KEY_FN_RIGHT_SHIFT */ + /* 486, 0x1e6 */ SDL_SCANCODE_UNKNOWN, + /* 487, 0x1e7 */ SDL_SCANCODE_UNKNOWN, + /* 488, 0x1e8 */ SDL_SCANCODE_UNKNOWN, + /* 489, 0x1e9 */ SDL_SCANCODE_UNKNOWN, + /* 490, 0x1ea */ SDL_SCANCODE_UNKNOWN, + /* 491, 0x1eb */ SDL_SCANCODE_UNKNOWN, + /* 492, 0x1ec */ SDL_SCANCODE_UNKNOWN, + /* 493, 0x1ed */ SDL_SCANCODE_UNKNOWN, + /* 494, 0x1ee */ SDL_SCANCODE_UNKNOWN, + /* 495, 0x1ef */ SDL_SCANCODE_UNKNOWN, + /* 496, 0x1f0 */ SDL_SCANCODE_UNKNOWN, + /* 497, 0x1f1 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT1 */ + /* 498, 0x1f2 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT2 */ + /* 499, 0x1f3 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT3 */ + /* 500, 0x1f4 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT4 */ + /* 501, 0x1f5 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT5 */ + /* 502, 0x1f6 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT6 */ + /* 503, 0x1f7 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT7 */ + /* 504, 0x1f8 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT8 */ + /* 505, 0x1f9 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT9 */ + /* 506, 0x1fa */ SDL_SCANCODE_UNKNOWN, /* KEY_BRL_DOT10 */ + /* 507, 0x1fb */ SDL_SCANCODE_UNKNOWN, + /* 508, 0x1fc */ SDL_SCANCODE_UNKNOWN, + /* 509, 0x1fd */ SDL_SCANCODE_UNKNOWN, + /* 510, 0x1fe */ SDL_SCANCODE_UNKNOWN, + /* 511, 0x1ff */ SDL_SCANCODE_UNKNOWN, + /* 512, 0x200 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_0 */ + /* 513, 0x201 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_1 */ + /* 514, 0x202 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_2 */ + /* 515, 0x203 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_3 */ + /* 516, 0x204 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_4 */ + /* 517, 0x205 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_5 */ + /* 518, 0x206 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_6 */ + /* 519, 0x207 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_7 */ + /* 520, 0x208 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_8 */ + /* 521, 0x209 */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_9 */ + /* 522, 0x20a */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_STAR */ + /* 523, 0x20b */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_POUND */ + /* 524, 0x20c */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_A */ + /* 525, 0x20d */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_B */ + /* 526, 0x20e */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_C */ + /* 527, 0x20f */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_D */ + /* 528, 0x210 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_FOCUS */ + /* 529, 0x211 */ SDL_SCANCODE_UNKNOWN, /* KEY_WPS_BUTTON */ + /* 530, 0x212 */ SDL_SCANCODE_UNKNOWN, /* KEY_TOUCHPAD_TOGGLE */ + /* 531, 0x213 */ SDL_SCANCODE_UNKNOWN, /* KEY_TOUCHPAD_ON */ + /* 532, 0x214 */ SDL_SCANCODE_UNKNOWN, /* KEY_TOUCHPAD_OFF */ + /* 533, 0x215 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_ZOOMIN */ + /* 534, 0x216 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_ZOOMOUT */ + /* 535, 0x217 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_UP */ + /* 536, 0x218 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_DOWN */ + /* 537, 0x219 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_LEFT */ + /* 538, 0x21a */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA_RIGHT */ + /* 539, 0x21b */ SDL_SCANCODE_UNKNOWN, /* KEY_ATTENDANT_ON */ + /* 540, 0x21c */ SDL_SCANCODE_UNKNOWN, /* KEY_ATTENDANT_OFF */ + /* 541, 0x21d */ SDL_SCANCODE_UNKNOWN, /* KEY_ATTENDANT_TOGGLE */ + /* 542, 0x21e */ SDL_SCANCODE_UNKNOWN, /* KEY_LIGHTS_TOGGLE */ + /* 543, 0x21f */ SDL_SCANCODE_UNKNOWN, + /* 544, 0x220 */ SDL_SCANCODE_UNKNOWN, + /* 545, 0x221 */ SDL_SCANCODE_UNKNOWN, + /* 546, 0x222 */ SDL_SCANCODE_UNKNOWN, + /* 547, 0x223 */ SDL_SCANCODE_UNKNOWN, + /* 548, 0x224 */ SDL_SCANCODE_UNKNOWN, + /* 549, 0x225 */ SDL_SCANCODE_UNKNOWN, + /* 550, 0x226 */ SDL_SCANCODE_UNKNOWN, + /* 551, 0x227 */ SDL_SCANCODE_UNKNOWN, + /* 552, 0x228 */ SDL_SCANCODE_UNKNOWN, + /* 553, 0x229 */ SDL_SCANCODE_UNKNOWN, + /* 554, 0x22a */ SDL_SCANCODE_UNKNOWN, + /* 555, 0x22b */ SDL_SCANCODE_UNKNOWN, + /* 556, 0x22c */ SDL_SCANCODE_UNKNOWN, + /* 557, 0x22d */ SDL_SCANCODE_UNKNOWN, + /* 558, 0x22e */ SDL_SCANCODE_UNKNOWN, + /* 559, 0x22f */ SDL_SCANCODE_UNKNOWN, + /* 560, 0x230 */ SDL_SCANCODE_UNKNOWN, /* KEY_ALS_TOGGLE */ + /* 561, 0x231 */ SDL_SCANCODE_UNKNOWN, /* KEY_ROTATE_LOCK_TOGGLE */ + /* 562, 0x232 */ SDL_SCANCODE_UNKNOWN, + /* 563, 0x233 */ SDL_SCANCODE_UNKNOWN, + /* 564, 0x234 */ SDL_SCANCODE_UNKNOWN, + /* 565, 0x235 */ SDL_SCANCODE_UNKNOWN, + /* 566, 0x236 */ SDL_SCANCODE_UNKNOWN, + /* 567, 0x237 */ SDL_SCANCODE_UNKNOWN, + /* 568, 0x238 */ SDL_SCANCODE_UNKNOWN, + /* 569, 0x239 */ SDL_SCANCODE_UNKNOWN, + /* 570, 0x23a */ SDL_SCANCODE_UNKNOWN, + /* 571, 0x23b */ SDL_SCANCODE_UNKNOWN, + /* 572, 0x23c */ SDL_SCANCODE_UNKNOWN, + /* 573, 0x23d */ SDL_SCANCODE_UNKNOWN, + /* 574, 0x23e */ SDL_SCANCODE_UNKNOWN, + /* 575, 0x23f */ SDL_SCANCODE_UNKNOWN, + /* 576, 0x240 */ SDL_SCANCODE_UNKNOWN, /* KEY_BUTTONCONFIG */ + /* 577, 0x241 */ SDL_SCANCODE_UNKNOWN, /* KEY_TASKMANAGER */ + /* 578, 0x242 */ SDL_SCANCODE_UNKNOWN, /* KEY_JOURNAL */ + /* 579, 0x243 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONTROLPANEL */ + /* 580, 0x244 */ SDL_SCANCODE_UNKNOWN, /* KEY_APPSELECT */ + /* 581, 0x245 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCREENSAVER */ + /* 582, 0x246 */ SDL_SCANCODE_UNKNOWN, /* KEY_VOICECOMMAND */ + /* 583, 0x247 */ SDL_SCANCODE_UNKNOWN, /* KEY_ASSISTANT */ + /* 584, 0x248 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LAYOUT_NEXT */ + /* 585, 0x249 */ SDL_SCANCODE_UNKNOWN, /* KEY_EMOJI_PICKER */ + /* 586, 0x24a */ SDL_SCANCODE_UNKNOWN, /* KEY_DICTATE */ + /* 587, 0x24b */ SDL_SCANCODE_UNKNOWN, + /* 588, 0x24c */ SDL_SCANCODE_UNKNOWN, + /* 589, 0x24d */ SDL_SCANCODE_UNKNOWN, + /* 590, 0x24e */ SDL_SCANCODE_UNKNOWN, + /* 591, 0x24f */ SDL_SCANCODE_UNKNOWN, + /* 592, 0x250 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_MIN */ + /* 593, 0x251 */ SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_MAX */ + /* 594, 0x252 */ SDL_SCANCODE_UNKNOWN, + /* 595, 0x253 */ SDL_SCANCODE_UNKNOWN, + /* 596, 0x254 */ SDL_SCANCODE_UNKNOWN, + /* 597, 0x255 */ SDL_SCANCODE_UNKNOWN, + /* 598, 0x256 */ SDL_SCANCODE_UNKNOWN, + /* 599, 0x257 */ SDL_SCANCODE_UNKNOWN, + /* 600, 0x258 */ SDL_SCANCODE_UNKNOWN, + /* 601, 0x259 */ SDL_SCANCODE_UNKNOWN, + /* 602, 0x25a */ SDL_SCANCODE_UNKNOWN, + /* 603, 0x25b */ SDL_SCANCODE_UNKNOWN, + /* 604, 0x25c */ SDL_SCANCODE_UNKNOWN, + /* 605, 0x25d */ SDL_SCANCODE_UNKNOWN, + /* 606, 0x25e */ SDL_SCANCODE_UNKNOWN, + /* 607, 0x25f */ SDL_SCANCODE_UNKNOWN, + /* 608, 0x260 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_PREV */ + /* 609, 0x261 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_NEXT */ + /* 610, 0x262 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_PREVGROUP */ + /* 611, 0x263 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_NEXTGROUP */ + /* 612, 0x264 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_ACCEPT */ + /* 613, 0x265 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBDINPUTASSIST_CANCEL */ + /* 614, 0x266 */ SDL_SCANCODE_UNKNOWN, /* KEY_RIGHT_UP */ + /* 615, 0x267 */ SDL_SCANCODE_UNKNOWN, /* KEY_RIGHT_DOWN */ + /* 616, 0x268 */ SDL_SCANCODE_UNKNOWN, /* KEY_LEFT_UP */ + /* 617, 0x269 */ SDL_SCANCODE_UNKNOWN, /* KEY_LEFT_DOWN */ + /* 618, 0x26a */ SDL_SCANCODE_UNKNOWN, /* KEY_ROOT_MENU */ + /* 619, 0x26b */ SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA_TOP_MENU */ + /* 620, 0x26c */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_11 */ + /* 621, 0x26d */ SDL_SCANCODE_UNKNOWN, /* KEY_NUMERIC_12 */ + /* 622, 0x26e */ SDL_SCANCODE_UNKNOWN, /* KEY_AUDIO_DESC */ + /* 623, 0x26f */ SDL_SCANCODE_UNKNOWN, /* KEY_3D_MODE */ + /* 624, 0x270 */ SDL_SCANCODE_UNKNOWN, /* KEY_NEXT_FAVORITE */ + /* 625, 0x271 */ SDL_SCANCODE_UNKNOWN, /* KEY_STOP_RECORD */ + /* 626, 0x272 */ SDL_SCANCODE_UNKNOWN, /* KEY_PAUSE_RECORD */ + /* 627, 0x273 */ SDL_SCANCODE_UNKNOWN, /* KEY_VOD */ + /* 628, 0x274 */ SDL_SCANCODE_UNKNOWN, /* KEY_UNMUTE */ + /* 629, 0x275 */ SDL_SCANCODE_UNKNOWN, /* KEY_FASTREVERSE */ + /* 630, 0x276 */ SDL_SCANCODE_UNKNOWN, /* KEY_SLOWREVERSE */ + /* 631, 0x277 */ SDL_SCANCODE_UNKNOWN, /* KEY_DATA */ + /* 632, 0x278 */ SDL_SCANCODE_UNKNOWN, /* KEY_ONSCREEN_KEYBOARD */ + /* 633, 0x279 */ SDL_SCANCODE_UNKNOWN, /* KEY_PRIVACY_SCREEN_TOGGLE */ + /* 634, 0x27a */ SDL_SCANCODE_UNKNOWN, /* KEY_SELECTIVE_SCREENSHOT */ + /* 635, 0x27b */ SDL_SCANCODE_UNKNOWN, + /* 636, 0x27c */ SDL_SCANCODE_UNKNOWN, + /* 637, 0x27d */ SDL_SCANCODE_UNKNOWN, + /* 638, 0x27e */ SDL_SCANCODE_UNKNOWN, + /* 639, 0x27f */ SDL_SCANCODE_UNKNOWN, + /* 640, 0x280 */ SDL_SCANCODE_UNKNOWN, + /* 641, 0x281 */ SDL_SCANCODE_UNKNOWN, + /* 642, 0x282 */ SDL_SCANCODE_UNKNOWN, + /* 643, 0x283 */ SDL_SCANCODE_UNKNOWN, + /* 644, 0x284 */ SDL_SCANCODE_UNKNOWN, + /* 645, 0x285 */ SDL_SCANCODE_UNKNOWN, + /* 646, 0x286 */ SDL_SCANCODE_UNKNOWN, + /* 647, 0x287 */ SDL_SCANCODE_UNKNOWN, + /* 648, 0x288 */ SDL_SCANCODE_UNKNOWN, + /* 649, 0x289 */ SDL_SCANCODE_UNKNOWN, + /* 650, 0x28a */ SDL_SCANCODE_UNKNOWN, + /* 651, 0x28b */ SDL_SCANCODE_UNKNOWN, + /* 652, 0x28c */ SDL_SCANCODE_UNKNOWN, + /* 653, 0x28d */ SDL_SCANCODE_UNKNOWN, + /* 654, 0x28e */ SDL_SCANCODE_UNKNOWN, + /* 655, 0x28f */ SDL_SCANCODE_UNKNOWN, + /* 656, 0x290 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO1 */ + /* 657, 0x291 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO2 */ + /* 658, 0x292 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO3 */ + /* 659, 0x293 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO4 */ + /* 660, 0x294 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO5 */ + /* 661, 0x295 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO6 */ + /* 662, 0x296 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO7 */ + /* 663, 0x297 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO8 */ + /* 664, 0x298 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO9 */ + /* 665, 0x299 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO10 */ + /* 666, 0x29a */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO11 */ + /* 667, 0x29b */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO12 */ + /* 668, 0x29c */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO13 */ + /* 669, 0x29d */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO14 */ + /* 670, 0x29e */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO15 */ + /* 671, 0x29f */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO16 */ + /* 672, 0x2a0 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO17 */ + /* 673, 0x2a1 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO18 */ + /* 674, 0x2a2 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO19 */ + /* 675, 0x2a3 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO20 */ + /* 676, 0x2a4 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO21 */ + /* 677, 0x2a5 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO22 */ + /* 678, 0x2a6 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO23 */ + /* 679, 0x2a7 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO24 */ + /* 680, 0x2a8 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO25 */ + /* 681, 0x2a9 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO26 */ + /* 682, 0x2aa */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO27 */ + /* 683, 0x2ab */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO28 */ + /* 684, 0x2ac */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO29 */ + /* 685, 0x2ad */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO30 */ + /* 686, 0x2ae */ SDL_SCANCODE_UNKNOWN, + /* 687, 0x2af */ SDL_SCANCODE_UNKNOWN, + /* 688, 0x2b0 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_RECORD_START */ + /* 689, 0x2b1 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_RECORD_STOP */ + /* 690, 0x2b2 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_PRESET_CYCLE */ + /* 691, 0x2b3 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_PRESET1 */ + /* 692, 0x2b4 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_PRESET2 */ + /* 693, 0x2b5 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO_PRESET3 */ + /* 694, 0x2b6 */ SDL_SCANCODE_UNKNOWN, + /* 695, 0x2b7 */ SDL_SCANCODE_UNKNOWN, + /* 696, 0x2b8 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LCD_MENU1 */ + /* 697, 0x2b9 */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LCD_MENU2 */ + /* 698, 0x2ba */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LCD_MENU3 */ + /* 699, 0x2bb */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LCD_MENU4 */ + /* 700, 0x2bc */ SDL_SCANCODE_UNKNOWN, /* KEY_KBD_LCD_MENU5 */ + /* 701, 0x2bd */ SDL_SCANCODE_UNKNOWN, + /* 702, 0x2be */ SDL_SCANCODE_UNKNOWN, + /* 703, 0x2bf */ SDL_SCANCODE_UNKNOWN, + /* 704, 0x2c0 */ SDL_SCANCODE_UNKNOWN, + /* 705, 0x2c1 */ SDL_SCANCODE_UNKNOWN, + /* 706, 0x2c2 */ SDL_SCANCODE_UNKNOWN, + /* 707, 0x2c3 */ SDL_SCANCODE_UNKNOWN, + /* 708, 0x2c4 */ SDL_SCANCODE_UNKNOWN, + /* 709, 0x2c5 */ SDL_SCANCODE_UNKNOWN, + /* 710, 0x2c6 */ SDL_SCANCODE_UNKNOWN, + /* 711, 0x2c7 */ SDL_SCANCODE_UNKNOWN, + /* 712, 0x2c8 */ SDL_SCANCODE_UNKNOWN, + /* 713, 0x2c9 */ SDL_SCANCODE_UNKNOWN, + /* 714, 0x2ca */ SDL_SCANCODE_UNKNOWN, + /* 715, 0x2cb */ SDL_SCANCODE_UNKNOWN, + /* 716, 0x2cc */ SDL_SCANCODE_UNKNOWN, + /* 717, 0x2cd */ SDL_SCANCODE_UNKNOWN, + /* 718, 0x2ce */ SDL_SCANCODE_UNKNOWN, + /* 719, 0x2cf */ SDL_SCANCODE_UNKNOWN, + /* 720, 0x2d0 */ SDL_SCANCODE_UNKNOWN, + /* 721, 0x2d1 */ SDL_SCANCODE_UNKNOWN, + /* 722, 0x2d2 */ SDL_SCANCODE_UNKNOWN, + /* 723, 0x2d3 */ SDL_SCANCODE_UNKNOWN, + /* 724, 0x2d4 */ SDL_SCANCODE_UNKNOWN, + /* 725, 0x2d5 */ SDL_SCANCODE_UNKNOWN, + /* 726, 0x2d6 */ SDL_SCANCODE_UNKNOWN, + /* 727, 0x2d7 */ SDL_SCANCODE_UNKNOWN, + /* 728, 0x2d8 */ SDL_SCANCODE_UNKNOWN, + /* 729, 0x2d9 */ SDL_SCANCODE_UNKNOWN, + /* 730, 0x2da */ SDL_SCANCODE_UNKNOWN, + /* 731, 0x2db */ SDL_SCANCODE_UNKNOWN, + /* 732, 0x2dc */ SDL_SCANCODE_UNKNOWN, + /* 733, 0x2dd */ SDL_SCANCODE_UNKNOWN, + /* 734, 0x2de */ SDL_SCANCODE_UNKNOWN, + /* 735, 0x2df */ SDL_SCANCODE_UNKNOWN, + /* 736, 0x2e0 */ SDL_SCANCODE_UNKNOWN, + /* 737, 0x2e1 */ SDL_SCANCODE_UNKNOWN, + /* 738, 0x2e2 */ SDL_SCANCODE_UNKNOWN, + /* 739, 0x2e3 */ SDL_SCANCODE_UNKNOWN, + /* 740, 0x2e4 */ SDL_SCANCODE_UNKNOWN, + /* 741, 0x2e5 */ SDL_SCANCODE_UNKNOWN, + /* 742, 0x2e6 */ SDL_SCANCODE_UNKNOWN, + /* 743, 0x2e7 */ SDL_SCANCODE_UNKNOWN, + /* 744, 0x2e8 */ SDL_SCANCODE_UNKNOWN, + /* 745, 0x2e9 */ SDL_SCANCODE_UNKNOWN, + /* 746, 0x2ea */ SDL_SCANCODE_UNKNOWN, + /* 747, 0x2eb */ SDL_SCANCODE_UNKNOWN, + /* 748, 0x2ec */ SDL_SCANCODE_UNKNOWN, + /* 749, 0x2ed */ SDL_SCANCODE_UNKNOWN, + /* 750, 0x2ee */ SDL_SCANCODE_UNKNOWN, + /* 751, 0x2ef */ SDL_SCANCODE_UNKNOWN, + /* 752, 0x2f0 */ SDL_SCANCODE_UNKNOWN, + /* 753, 0x2f1 */ SDL_SCANCODE_UNKNOWN, + /* 754, 0x2f2 */ SDL_SCANCODE_UNKNOWN, + /* 755, 0x2f3 */ SDL_SCANCODE_UNKNOWN, + /* 756, 0x2f4 */ SDL_SCANCODE_UNKNOWN, + /* 757, 0x2f5 */ SDL_SCANCODE_UNKNOWN, + /* 758, 0x2f6 */ SDL_SCANCODE_UNKNOWN, + /* 759, 0x2f7 */ SDL_SCANCODE_UNKNOWN, + /* 760, 0x2f8 */ SDL_SCANCODE_UNKNOWN, + /* 761, 0x2f9 */ SDL_SCANCODE_UNKNOWN, + /* 762, 0x2fa */ SDL_SCANCODE_UNKNOWN, + /* 763, 0x2fb */ SDL_SCANCODE_UNKNOWN, + /* 764, 0x2fc */ SDL_SCANCODE_UNKNOWN, + /* 765, 0x2fd */ SDL_SCANCODE_UNKNOWN, + /* 766, 0x2fe */ SDL_SCANCODE_UNKNOWN, + /* 767, 0x2ff */ SDL_SCANCODE_UNKNOWN, /* KEY_MAX */ +#endif /* 0 */ }; + +#if 0 /* A shell script to update the Linux key names in this file */ +#!/bin/bash + +function get_keyname +{ + value=$(echo "$1" | awk '{print $3}') + fgrep KEY_ /usr/include/linux/input-event-codes.h | while read line; do + read -ra fields <<<"$line" + if [ "${fields[2]}" = "$value" ]; then + echo "${fields[1]}" + return + fi + done +} + +fgrep SDL_SCANCODE scancodes_linux.h | while read line; do + if [ $(echo "$line" | awk '{print NF}') -eq 5 ]; then + name=$(get_keyname "$line") + if [ "$name" != "" ]; then + echo " $line /* $name */" + continue + fi + fi + echo " $line" +done +#endif /* end script */ + /* *INDENT-ON* */ /* clang-format on */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/scancodes_windows.h b/src/events/scancodes_windows.h index 9fc7067a2..fc3e3db66 100644 --- a/src/events/scancodes_windows.h +++ b/src/events/scancodes_windows.h @@ -53,3 +53,5 @@ static const SDL_Scancode windows_scancode_table[] = SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL4, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL5, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL3, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN /* 7 */ }; /* *INDENT-ON* */ /* clang-format on */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/scancodes_xfree86.h b/src/events/scancodes_xfree86.h index 1ce2a8c57..605a657f1 100644 --- a/src/events/scancodes_xfree86.h +++ b/src/events/scancodes_xfree86.h @@ -179,247 +179,256 @@ static const SDL_Scancode xfree86_scancode_table[] = { /* 146 */ SDL_SCANCODE_CUT, }; -/* for wireless usb keyboard (manufacturer TRUST) without numpad. */ +/* This is largely identical to the Linux keycode mapping */ static const SDL_Scancode xfree86_scancode_table2[] = { - /* 0 */ SDL_SCANCODE_UNKNOWN, - /* 1 */ SDL_SCANCODE_ESCAPE, - /* 2 */ SDL_SCANCODE_1, - /* 3 */ SDL_SCANCODE_2, - /* 4 */ SDL_SCANCODE_3, - /* 5 */ SDL_SCANCODE_4, - /* 6 */ SDL_SCANCODE_5, - /* 7 */ SDL_SCANCODE_6, - /* 8 */ SDL_SCANCODE_7, - /* 9 */ SDL_SCANCODE_8, - /* 10 */ SDL_SCANCODE_9, - /* 11 */ SDL_SCANCODE_0, - /* 12 */ SDL_SCANCODE_MINUS, - /* 13 */ SDL_SCANCODE_EQUALS, - /* 14 */ SDL_SCANCODE_BACKSPACE, - /* 15 */ SDL_SCANCODE_TAB, - /* 16 */ SDL_SCANCODE_Q, - /* 17 */ SDL_SCANCODE_W, - /* 18 */ SDL_SCANCODE_E, - /* 19 */ SDL_SCANCODE_R, - /* 20 */ SDL_SCANCODE_T, - /* 21 */ SDL_SCANCODE_Y, - /* 22 */ SDL_SCANCODE_U, - /* 23 */ SDL_SCANCODE_I, - /* 24 */ SDL_SCANCODE_O, - /* 25 */ SDL_SCANCODE_P, - /* 26 */ SDL_SCANCODE_LEFTBRACKET, - /* 27 */ SDL_SCANCODE_RIGHTBRACKET, - /* 28 */ SDL_SCANCODE_RETURN, - /* 29 */ SDL_SCANCODE_LCTRL, - /* 30 */ SDL_SCANCODE_A, - /* 31 */ SDL_SCANCODE_S, - /* 32 */ SDL_SCANCODE_D, - /* 33 */ SDL_SCANCODE_F, - /* 34 */ SDL_SCANCODE_G, - /* 35 */ SDL_SCANCODE_H, - /* 36 */ SDL_SCANCODE_J, - /* 37 */ SDL_SCANCODE_K, - /* 38 */ SDL_SCANCODE_L, - /* 39 */ SDL_SCANCODE_SEMICOLON, - /* 40 */ SDL_SCANCODE_APOSTROPHE, - /* 41 */ SDL_SCANCODE_GRAVE, - /* 42 */ SDL_SCANCODE_LSHIFT, - /* 43 */ SDL_SCANCODE_BACKSLASH, - /* 44 */ SDL_SCANCODE_Z, - /* 45 */ SDL_SCANCODE_X, - /* 46 */ SDL_SCANCODE_C, - /* 47 */ SDL_SCANCODE_V, - /* 48 */ SDL_SCANCODE_B, - /* 49 */ SDL_SCANCODE_N, - /* 50 */ SDL_SCANCODE_M, - /* 51 */ SDL_SCANCODE_COMMA, - /* 52 */ SDL_SCANCODE_PERIOD, - /* 53 */ SDL_SCANCODE_SLASH, - /* 54 */ SDL_SCANCODE_RSHIFT, - /* 55 */ SDL_SCANCODE_KP_MULTIPLY, - /* 56 */ SDL_SCANCODE_LALT, - /* 57 */ SDL_SCANCODE_SPACE, - /* 58 */ SDL_SCANCODE_CAPSLOCK, - /* 59 */ SDL_SCANCODE_F1, - /* 60 */ SDL_SCANCODE_F2, - /* 61 */ SDL_SCANCODE_F3, - /* 62 */ SDL_SCANCODE_F4, - /* 63 */ SDL_SCANCODE_F5, - /* 64 */ SDL_SCANCODE_F6, - /* 65 */ SDL_SCANCODE_F7, - /* 66 */ SDL_SCANCODE_F8, - /* 67 */ SDL_SCANCODE_F9, - /* 68 */ SDL_SCANCODE_F10, - /* 69 */ SDL_SCANCODE_NUMLOCKCLEAR, - /* 70 */ SDL_SCANCODE_SCROLLLOCK, - /* 71 */ SDL_SCANCODE_KP_7, - /* 72 */ SDL_SCANCODE_KP_8, - /* 73 */ SDL_SCANCODE_KP_9, - /* 74 */ SDL_SCANCODE_KP_MINUS, - /* 75 */ SDL_SCANCODE_KP_4, - /* 76 */ SDL_SCANCODE_KP_5, - /* 77 */ SDL_SCANCODE_KP_6, - /* 78 */ SDL_SCANCODE_KP_PLUS, - /* 79 */ SDL_SCANCODE_KP_1, - /* 80 */ SDL_SCANCODE_KP_2, - /* 81 */ SDL_SCANCODE_KP_3, - /* 82 */ SDL_SCANCODE_KP_0, - /* 83 */ SDL_SCANCODE_KP_PERIOD, - /* 84 */ SDL_SCANCODE_SYSREQ, /* ???? */ - /* 85 */ SDL_SCANCODE_MODE, /* ???? */ - /* 86 */ SDL_SCANCODE_NONUSBACKSLASH, - /* 87 */ SDL_SCANCODE_F11, - /* 88 */ SDL_SCANCODE_F12, - /* 89 */ SDL_SCANCODE_INTERNATIONAL1, /* \_ */ - /* 90 */ SDL_SCANCODE_UNKNOWN, /* Katakana */ - /* 91 */ SDL_SCANCODE_UNKNOWN, /* Hiragana */ - /* 92 */ SDL_SCANCODE_INTERNATIONAL4, /* Henkan_Mode */ - /* 93 */ SDL_SCANCODE_INTERNATIONAL2, /* Hiragana_Katakana */ - /* 94 */ SDL_SCANCODE_INTERNATIONAL5, /* Muhenkan */ - /* 95 */ SDL_SCANCODE_UNKNOWN, - /* 96 */ SDL_SCANCODE_KP_ENTER, - /* 97 */ SDL_SCANCODE_RCTRL, - /* 98 */ SDL_SCANCODE_KP_DIVIDE, - /* 99 */ SDL_SCANCODE_PRINTSCREEN, - /* 100 */ SDL_SCANCODE_RALT, /* ISO_Level3_Shift, ALTGR, RALT */ - /* 101 */ SDL_SCANCODE_UNKNOWN, /* Linefeed */ - /* 102 */ SDL_SCANCODE_HOME, - /* 103 */ SDL_SCANCODE_UP, - /* 104 */ SDL_SCANCODE_PAGEUP, - /* 105 */ SDL_SCANCODE_LEFT, - /* 106 */ SDL_SCANCODE_RIGHT, - /* 107 */ SDL_SCANCODE_END, - /* 108 */ SDL_SCANCODE_DOWN, - /* 109 */ SDL_SCANCODE_PAGEDOWN, - /* 110 */ SDL_SCANCODE_INSERT, - /* 111 */ SDL_SCANCODE_DELETE, - /* 112 */ SDL_SCANCODE_UNKNOWN, - /* 113 */ SDL_SCANCODE_MUTE, - /* 114 */ SDL_SCANCODE_VOLUMEDOWN, - /* 115 */ SDL_SCANCODE_VOLUMEUP, - /* 116 */ SDL_SCANCODE_POWER, - /* 117 */ SDL_SCANCODE_KP_EQUALS, - /* 118 */ SDL_SCANCODE_KP_PLUSMINUS, /* plusminus */ - /* 119 */ SDL_SCANCODE_PAUSE, - /* 120 */ SDL_SCANCODE_UNKNOWN, /* XF86LaunchA */ - /* 121 */ SDL_SCANCODE_KP_COMMA, /* KP_Decimal */ - /* 122 */ SDL_SCANCODE_LANG1, /* Hangul */ - /* 123 */ SDL_SCANCODE_LANG2, /* Hangul_Hanja */ - /* 124 */ SDL_SCANCODE_INTERNATIONAL3, /* Yen */ - /* 125 */ SDL_SCANCODE_LGUI, - /* 126 */ SDL_SCANCODE_RGUI, - /* 127 */ SDL_SCANCODE_APPLICATION, - /* 128 */ SDL_SCANCODE_CANCEL, - /* 129 */ SDL_SCANCODE_AGAIN, - /* 130 */ SDL_SCANCODE_UNKNOWN, /* SunProps */ - /* 131 */ SDL_SCANCODE_UNDO, - /* 132 */ SDL_SCANCODE_UNKNOWN, /* SunFront */ - /* 133 */ SDL_SCANCODE_COPY, - /* 134 */ SDL_SCANCODE_UNKNOWN, /* SunOpen */ - /* 135 */ SDL_SCANCODE_PASTE, - /* 136 */ SDL_SCANCODE_FIND, - /* 137 */ SDL_SCANCODE_CUT, - /* 138 */ SDL_SCANCODE_HELP, - /* 139 */ SDL_SCANCODE_MENU, /* XF86MenuKB */ - /* 140 */ SDL_SCANCODE_CALCULATOR, - /* 141 */ SDL_SCANCODE_UNKNOWN, - /* 142 */ SDL_SCANCODE_SLEEP, - /* 143 */ SDL_SCANCODE_UNKNOWN, /* XF86WakeUp */ - /* 144 */ SDL_SCANCODE_UNKNOWN, /* XF86Explorer */ - /* 145 */ SDL_SCANCODE_UNKNOWN, /* XF86Send */ - /* 146 */ SDL_SCANCODE_UNKNOWN, - /* 147 */ SDL_SCANCODE_UNKNOWN, /* XF86Xfer */ - /* 148 */ SDL_SCANCODE_APP1, /* XF86Launch1 */ - /* 149 */ SDL_SCANCODE_APP2, /* XF86Launch2 */ - /* 150 */ SDL_SCANCODE_WWW, - /* 151 */ SDL_SCANCODE_UNKNOWN, /* XF86DOS */ - /* 152 */ SDL_SCANCODE_UNKNOWN, /* XF86ScreenSaver */ - /* 153 */ SDL_SCANCODE_UNKNOWN, - /* 154 */ SDL_SCANCODE_UNKNOWN, /* XF86RotateWindows */ - /* 155 */ SDL_SCANCODE_MAIL, - /* 156 */ SDL_SCANCODE_AC_BOOKMARKS, /* XF86Favorites */ - /* 157 */ SDL_SCANCODE_COMPUTER, - /* 158 */ SDL_SCANCODE_AC_BACK, - /* 159 */ SDL_SCANCODE_AC_FORWARD, - /* 160 */ SDL_SCANCODE_UNKNOWN, - /* 161 */ SDL_SCANCODE_EJECT, - /* 162 */ SDL_SCANCODE_EJECT, - /* 163 */ SDL_SCANCODE_AUDIONEXT, - /* 164 */ SDL_SCANCODE_AUDIOPLAY, - /* 165 */ SDL_SCANCODE_AUDIOPREV, - /* 166 */ SDL_SCANCODE_AUDIOSTOP, - /* 167 */ SDL_SCANCODE_UNKNOWN, /* XF86AudioRecord */ - /* 168 */ SDL_SCANCODE_AUDIOREWIND, /* XF86AudioRewind */ - /* 169 */ SDL_SCANCODE_UNKNOWN, /* XF86Phone */ - /* 170 */ SDL_SCANCODE_UNKNOWN, - /* 171 */ SDL_SCANCODE_F13, /* XF86Tools */ - /* 172 */ SDL_SCANCODE_AC_HOME, - /* 173 */ SDL_SCANCODE_AC_REFRESH, - /* 174 */ SDL_SCANCODE_UNKNOWN, /* XF86Close */ - /* 175 */ SDL_SCANCODE_UNKNOWN, - /* 176 */ SDL_SCANCODE_UNKNOWN, - /* 177 */ SDL_SCANCODE_UNKNOWN, /* XF86ScrollUp */ - /* 178 */ SDL_SCANCODE_UNKNOWN, /* XF86ScrollDown */ - /* 179 */ SDL_SCANCODE_KP_LEFTPAREN, /* parenleft */ - /* 180 */ SDL_SCANCODE_KP_RIGHTPAREN, /* parenright */ - /* 181 */ SDL_SCANCODE_UNKNOWN, /* XF86New */ - /* 182 */ SDL_SCANCODE_AGAIN, - /* 183 */ SDL_SCANCODE_F13, /* XF86Tools */ - /* 184 */ SDL_SCANCODE_F14, /* XF86Launch5 */ - /* 185 */ SDL_SCANCODE_F15, /* XF86Launch6 */ - /* 186 */ SDL_SCANCODE_F16, /* XF86Launch7 */ - /* 187 */ SDL_SCANCODE_F17, /* XF86Launch8 */ - /* 188 */ SDL_SCANCODE_F18, /* XF86Launch9 */ - /* 189 */ SDL_SCANCODE_F19, /* null keysym */ - /* 190 */ SDL_SCANCODE_F20, - /* 191 */ SDL_SCANCODE_UNKNOWN, - /* 192 */ SDL_SCANCODE_UNKNOWN, /* XF86TouchpadToggle */ - /* 193 */ SDL_SCANCODE_UNKNOWN, - /* 194 */ SDL_SCANCODE_UNKNOWN, - /* 195 */ SDL_SCANCODE_MODE, - /* 196 */ SDL_SCANCODE_UNKNOWN, - /* 197 */ SDL_SCANCODE_UNKNOWN, - /* 198 */ SDL_SCANCODE_UNKNOWN, - /* 199 */ SDL_SCANCODE_UNKNOWN, - /* 200 */ SDL_SCANCODE_AUDIOPLAY, - /* 201 */ SDL_SCANCODE_UNKNOWN, /* XF86AudioPause */ - /* 202 */ SDL_SCANCODE_UNKNOWN, /* XF86Launch3 */ - /* 203 */ SDL_SCANCODE_UNKNOWN, /* XF86Launch4 */ - /* 204 */ SDL_SCANCODE_UNKNOWN, /* XF86LaunchB */ - /* 205 */ SDL_SCANCODE_UNKNOWN, /* XF86Suspend */ - /* 206 */ SDL_SCANCODE_UNKNOWN, /* XF86Close */ - /* 207 */ SDL_SCANCODE_AUDIOPLAY, - /* 208 */ SDL_SCANCODE_AUDIOFASTFORWARD, - /* 209 */ SDL_SCANCODE_UNKNOWN, - /* 210 */ SDL_SCANCODE_PRINTSCREEN, - /* 211 */ SDL_SCANCODE_UNKNOWN, - /* 212 */ SDL_SCANCODE_UNKNOWN, /* XF86WebCam */ - /* 213 */ SDL_SCANCODE_UNKNOWN, - /* 214 */ SDL_SCANCODE_UNKNOWN, - /* 215 */ SDL_SCANCODE_MAIL, - /* 216 */ SDL_SCANCODE_UNKNOWN, - /* 217 */ SDL_SCANCODE_AC_SEARCH, - /* 218 */ SDL_SCANCODE_UNKNOWN, - /* 219 */ SDL_SCANCODE_UNKNOWN, /* XF86Finance */ - /* 220 */ SDL_SCANCODE_UNKNOWN, - /* 221 */ SDL_SCANCODE_UNKNOWN, /* XF86Shop */ - /* 222 */ SDL_SCANCODE_UNKNOWN, - /* 223 */ SDL_SCANCODE_STOP, - /* 224 */ SDL_SCANCODE_BRIGHTNESSDOWN, - /* 225 */ SDL_SCANCODE_BRIGHTNESSUP, - /* 226 */ SDL_SCANCODE_MEDIASELECT, - /* 227 */ SDL_SCANCODE_DISPLAYSWITCH, - /* 228 */ SDL_SCANCODE_KBDILLUMTOGGLE, - /* 229 */ SDL_SCANCODE_KBDILLUMDOWN, - /* 230 */ SDL_SCANCODE_KBDILLUMUP, - /* 231 */ SDL_SCANCODE_UNKNOWN, /* XF86Send */ - /* 232 */ SDL_SCANCODE_UNKNOWN, /* XF86Reply */ - /* 233 */ SDL_SCANCODE_UNKNOWN, /* XF86MailForward */ - /* 234 */ SDL_SCANCODE_UNKNOWN, /* XF86Save */ - /* 235 */ SDL_SCANCODE_UNKNOWN, /* XF86Documents */ - /* 236 */ SDL_SCANCODE_UNKNOWN, /* XF86Battery */ - /* 237 */ SDL_SCANCODE_UNKNOWN, /* XF86Bluetooth */ - /* 238 */ SDL_SCANCODE_UNKNOWN, /* XF86WLAN */ + /* 0, 0x000 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 1, 0x001 */ SDL_SCANCODE_ESCAPE, /* Escape */ + /* 2, 0x002 */ SDL_SCANCODE_1, /* 1 */ + /* 3, 0x003 */ SDL_SCANCODE_2, /* 2 */ + /* 4, 0x004 */ SDL_SCANCODE_3, /* 3 */ + /* 5, 0x005 */ SDL_SCANCODE_4, /* 4 */ + /* 6, 0x006 */ SDL_SCANCODE_5, /* 5 */ + /* 7, 0x007 */ SDL_SCANCODE_6, /* 6 */ + /* 8, 0x008 */ SDL_SCANCODE_7, /* 7 */ + /* 9, 0x009 */ SDL_SCANCODE_8, /* 8 */ + /* 10, 0x00a */ SDL_SCANCODE_9, /* 9 */ + /* 11, 0x00b */ SDL_SCANCODE_0, /* 0 */ + /* 12, 0x00c */ SDL_SCANCODE_MINUS, /* minus */ + /* 13, 0x00d */ SDL_SCANCODE_EQUALS, /* equal */ + /* 14, 0x00e */ SDL_SCANCODE_BACKSPACE, /* BackSpace */ + /* 15, 0x00f */ SDL_SCANCODE_TAB, /* Tab */ + /* 16, 0x010 */ SDL_SCANCODE_Q, /* q */ + /* 17, 0x011 */ SDL_SCANCODE_W, /* w */ + /* 18, 0x012 */ SDL_SCANCODE_E, /* e */ + /* 19, 0x013 */ SDL_SCANCODE_R, /* r */ + /* 20, 0x014 */ SDL_SCANCODE_T, /* t */ + /* 21, 0x015 */ SDL_SCANCODE_Y, /* y */ + /* 22, 0x016 */ SDL_SCANCODE_U, /* u */ + /* 23, 0x017 */ SDL_SCANCODE_I, /* i */ + /* 24, 0x018 */ SDL_SCANCODE_O, /* o */ + /* 25, 0x019 */ SDL_SCANCODE_P, /* p */ + /* 26, 0x01a */ SDL_SCANCODE_LEFTBRACKET, /* bracketleft */ + /* 27, 0x01b */ SDL_SCANCODE_RIGHTBRACKET, /* bracketright */ + /* 28, 0x01c */ SDL_SCANCODE_RETURN, /* Return */ + /* 29, 0x01d */ SDL_SCANCODE_LCTRL, /* Control_L */ + /* 30, 0x01e */ SDL_SCANCODE_A, /* a */ + /* 31, 0x01f */ SDL_SCANCODE_S, /* s */ + /* 32, 0x020 */ SDL_SCANCODE_D, /* d */ + /* 33, 0x021 */ SDL_SCANCODE_F, /* f */ + /* 34, 0x022 */ SDL_SCANCODE_G, /* g */ + /* 35, 0x023 */ SDL_SCANCODE_H, /* h */ + /* 36, 0x024 */ SDL_SCANCODE_J, /* j */ + /* 37, 0x025 */ SDL_SCANCODE_K, /* k */ + /* 38, 0x026 */ SDL_SCANCODE_L, /* l */ + /* 39, 0x027 */ SDL_SCANCODE_SEMICOLON, /* semicolon */ + /* 40, 0x028 */ SDL_SCANCODE_APOSTROPHE, /* apostrophe */ + /* 41, 0x029 */ SDL_SCANCODE_GRAVE, /* grave */ + /* 42, 0x02a */ SDL_SCANCODE_LSHIFT, /* Shift_L */ + /* 43, 0x02b */ SDL_SCANCODE_BACKSLASH, /* backslash */ + /* 44, 0x02c */ SDL_SCANCODE_Z, /* z */ + /* 45, 0x02d */ SDL_SCANCODE_X, /* x */ + /* 46, 0x02e */ SDL_SCANCODE_C, /* c */ + /* 47, 0x02f */ SDL_SCANCODE_V, /* v */ + /* 48, 0x030 */ SDL_SCANCODE_B, /* b */ + /* 49, 0x031 */ SDL_SCANCODE_N, /* n */ + /* 50, 0x032 */ SDL_SCANCODE_M, /* m */ + /* 51, 0x033 */ SDL_SCANCODE_COMMA, /* comma */ + /* 52, 0x034 */ SDL_SCANCODE_PERIOD, /* period */ + /* 53, 0x035 */ SDL_SCANCODE_SLASH, /* slash */ + /* 54, 0x036 */ SDL_SCANCODE_RSHIFT, /* Shift_R */ + /* 55, 0x037 */ SDL_SCANCODE_KP_MULTIPLY, /* KP_Multiply */ + /* 56, 0x038 */ SDL_SCANCODE_LALT, /* Alt_L */ + /* 57, 0x039 */ SDL_SCANCODE_SPACE, /* space */ + /* 58, 0x03a */ SDL_SCANCODE_CAPSLOCK, /* Caps_Lock */ + /* 59, 0x03b */ SDL_SCANCODE_F1, /* F1 */ + /* 60, 0x03c */ SDL_SCANCODE_F2, /* F2 */ + /* 61, 0x03d */ SDL_SCANCODE_F3, /* F3 */ + /* 62, 0x03e */ SDL_SCANCODE_F4, /* F4 */ + /* 63, 0x03f */ SDL_SCANCODE_F5, /* F5 */ + /* 64, 0x040 */ SDL_SCANCODE_F6, /* F6 */ + /* 65, 0x041 */ SDL_SCANCODE_F7, /* F7 */ + /* 66, 0x042 */ SDL_SCANCODE_F8, /* F8 */ + /* 67, 0x043 */ SDL_SCANCODE_F9, /* F9 */ + /* 68, 0x044 */ SDL_SCANCODE_F10, /* F10 */ + /* 69, 0x045 */ SDL_SCANCODE_NUMLOCKCLEAR, /* Num_Lock */ + /* 70, 0x046 */ SDL_SCANCODE_SCROLLLOCK, /* Scroll_Lock */ + /* 71, 0x047 */ SDL_SCANCODE_KP_7, /* KP_Home */ + /* 72, 0x048 */ SDL_SCANCODE_KP_8, /* KP_Up */ + /* 73, 0x049 */ SDL_SCANCODE_KP_9, /* KP_Prior */ + /* 74, 0x04a */ SDL_SCANCODE_KP_MINUS, /* KP_Subtract */ + /* 75, 0x04b */ SDL_SCANCODE_KP_4, /* KP_Left */ + /* 76, 0x04c */ SDL_SCANCODE_KP_5, /* KP_Begin */ + /* 77, 0x04d */ SDL_SCANCODE_KP_6, /* KP_Right */ + /* 78, 0x04e */ SDL_SCANCODE_KP_PLUS, /* KP_Add */ + /* 79, 0x04f */ SDL_SCANCODE_KP_1, /* KP_End */ + /* 80, 0x050 */ SDL_SCANCODE_KP_2, /* KP_Down */ + /* 81, 0x051 */ SDL_SCANCODE_KP_3, /* KP_Next */ + /* 82, 0x052 */ SDL_SCANCODE_KP_0, /* KP_Insert */ + /* 83, 0x053 */ SDL_SCANCODE_KP_PERIOD, /* KP_Delete */ + /* 84, 0x054 */ SDL_SCANCODE_RALT, /* ISO_Level3_Shift */ + /* 85, 0x055 */ SDL_SCANCODE_MODE, /* ???? */ + /* 86, 0x056 */ SDL_SCANCODE_NONUSBACKSLASH, /* less */ + /* 87, 0x057 */ SDL_SCANCODE_F11, /* F11 */ + /* 88, 0x058 */ SDL_SCANCODE_F12, /* F12 */ + /* 89, 0x059 */ SDL_SCANCODE_INTERNATIONAL1, /* \_ */ + /* 90, 0x05a */ SDL_SCANCODE_LANG3, /* Katakana */ + /* 91, 0x05b */ SDL_SCANCODE_LANG4, /* Hiragana */ + /* 92, 0x05c */ SDL_SCANCODE_INTERNATIONAL4, /* Henkan_Mode */ + /* 93, 0x05d */ SDL_SCANCODE_INTERNATIONAL2, /* Hiragana_Katakana */ + /* 94, 0x05e */ SDL_SCANCODE_INTERNATIONAL5, /* Muhenkan */ + /* 95, 0x05f */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 96, 0x060 */ SDL_SCANCODE_KP_ENTER, /* KP_Enter */ + /* 97, 0x061 */ SDL_SCANCODE_RCTRL, /* Control_R */ + /* 98, 0x062 */ SDL_SCANCODE_KP_DIVIDE, /* KP_Divide */ + /* 99, 0x063 */ SDL_SCANCODE_PRINTSCREEN, /* Print */ + /* 100, 0x064 */ SDL_SCANCODE_RALT, /* ISO_Level3_Shift, ALTGR, RALT */ + /* 101, 0x065 */ SDL_SCANCODE_UNKNOWN, /* Linefeed */ + /* 102, 0x066 */ SDL_SCANCODE_HOME, /* Home */ + /* 103, 0x067 */ SDL_SCANCODE_UP, /* Up */ + /* 104, 0x068 */ SDL_SCANCODE_PAGEUP, /* Prior */ + /* 105, 0x069 */ SDL_SCANCODE_LEFT, /* Left */ + /* 106, 0x06a */ SDL_SCANCODE_RIGHT, /* Right */ + /* 107, 0x06b */ SDL_SCANCODE_END, /* End */ + /* 108, 0x06c */ SDL_SCANCODE_DOWN, /* Down */ + /* 109, 0x06d */ SDL_SCANCODE_PAGEDOWN, /* Next */ + /* 110, 0x06e */ SDL_SCANCODE_INSERT, /* Insert */ + /* 111, 0x06f */ SDL_SCANCODE_DELETE, /* Delete */ + /* 112, 0x070 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 113, 0x071 */ SDL_SCANCODE_MUTE, /* XF86AudioMute */ + /* 114, 0x072 */ SDL_SCANCODE_VOLUMEDOWN, /* XF86AudioLowerVolume */ + /* 115, 0x073 */ SDL_SCANCODE_VOLUMEUP, /* XF86AudioRaiseVolume */ + /* 116, 0x074 */ SDL_SCANCODE_POWER, /* XF86PowerOff */ + /* 117, 0x075 */ SDL_SCANCODE_KP_EQUALS, /* KP_Equal */ + /* 118, 0x076 */ SDL_SCANCODE_KP_PLUSMINUS, /* plusminus */ + /* 119, 0x077 */ SDL_SCANCODE_PAUSE, /* Pause */ + /* 120, 0x078 */ SDL_SCANCODE_UNKNOWN, /* XF86LaunchA */ + /* 121, 0x079 */ SDL_SCANCODE_KP_PERIOD, /* KP_Decimal */ + /* 122, 0x07a */ SDL_SCANCODE_LANG1, /* Hangul */ + /* 123, 0x07b */ SDL_SCANCODE_LANG2, /* Hangul_Hanja */ + /* 124, 0x07c */ SDL_SCANCODE_INTERNATIONAL3, /* Yen */ + /* 125, 0x07d */ SDL_SCANCODE_LGUI, /* Super_L */ + /* 126, 0x07e */ SDL_SCANCODE_RGUI, /* Super_R */ + /* 127, 0x07f */ SDL_SCANCODE_APPLICATION, /* Menu */ + /* 128, 0x080 */ SDL_SCANCODE_CANCEL, /* Cancel */ + /* 129, 0x081 */ SDL_SCANCODE_AGAIN, /* Redo */ + /* 130, 0x082 */ SDL_SCANCODE_UNKNOWN, /* SunProps */ + /* 131, 0x083 */ SDL_SCANCODE_UNDO, /* Undo */ + /* 132, 0x084 */ SDL_SCANCODE_UNKNOWN, /* SunFront */ + /* 133, 0x085 */ SDL_SCANCODE_COPY, /* XF86Copy */ + /* 134, 0x086 */ SDL_SCANCODE_UNKNOWN, /* SunOpen, XF86Open */ + /* 135, 0x087 */ SDL_SCANCODE_PASTE, /* XF86Paste */ + /* 136, 0x088 */ SDL_SCANCODE_FIND, /* Find */ + /* 137, 0x089 */ SDL_SCANCODE_CUT, /* XF86Cut */ + /* 138, 0x08a */ SDL_SCANCODE_HELP, /* Help */ + /* 139, 0x08b */ SDL_SCANCODE_MENU, /* XF86MenuKB */ + /* 140, 0x08c */ SDL_SCANCODE_CALCULATOR, /* XF86Calculator */ + /* 141, 0x08d */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 142, 0x08e */ SDL_SCANCODE_SLEEP, /* XF86Sleep */ + /* 143, 0x08f */ SDL_SCANCODE_UNKNOWN, /* XF86WakeUp */ + /* 144, 0x090 */ SDL_SCANCODE_UNKNOWN, /* XF86Explorer */ + /* 145, 0x091 */ SDL_SCANCODE_UNKNOWN, /* XF86Send */ + /* 146, 0x092 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 147, 0x093 */ SDL_SCANCODE_UNKNOWN, /* XF86Xfer */ + /* 148, 0x094 */ SDL_SCANCODE_APP1, /* XF86Launch1 */ + /* 149, 0x095 */ SDL_SCANCODE_APP2, /* XF86Launch2 */ + /* 150, 0x096 */ SDL_SCANCODE_WWW, /* XF86WWW */ + /* 151, 0x097 */ SDL_SCANCODE_UNKNOWN, /* XF86DOS */ + /* 152, 0x098 */ SDL_SCANCODE_UNKNOWN, /* XF86ScreenSaver */ + /* 153, 0x099 */ SDL_SCANCODE_UNKNOWN, /* XF86RotateWindows */ + /* 154, 0x09a */ SDL_SCANCODE_UNKNOWN, /* XF86TaskPane */ + /* 155, 0x09b */ SDL_SCANCODE_MAIL, /* XF86Mail */ + /* 156, 0x09c */ SDL_SCANCODE_AC_BOOKMARKS, /* XF86Favorites */ + /* 157, 0x09d */ SDL_SCANCODE_COMPUTER, /* XF86MyComputer */ + /* 158, 0x09e */ SDL_SCANCODE_AC_BACK, /* XF86Back */ + /* 159, 0x09f */ SDL_SCANCODE_AC_FORWARD, /* XF86Forward */ + /* 160, 0x0a0 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 161, 0x0a1 */ SDL_SCANCODE_EJECT, /* XF86Eject */ + /* 162, 0x0a2 */ SDL_SCANCODE_EJECT, /* XF86Eject */ + /* 163, 0x0a3 */ SDL_SCANCODE_AUDIONEXT, /* XF86AudioNext */ + /* 164, 0x0a4 */ SDL_SCANCODE_AUDIOPLAY, /* XF86AudioPlay */ + /* 165, 0x0a5 */ SDL_SCANCODE_AUDIOPREV, /* XF86AudioPrev */ + /* 166, 0x0a6 */ SDL_SCANCODE_AUDIOSTOP, /* XF86AudioStop */ + /* 167, 0x0a7 */ SDL_SCANCODE_UNKNOWN, /* XF86AudioRecord */ + /* 168, 0x0a8 */ SDL_SCANCODE_AUDIOREWIND, /* XF86AudioRewind */ + /* 169, 0x0a9 */ SDL_SCANCODE_UNKNOWN, /* XF86Phone */ + /* 170, 0x0aa */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 171, 0x0ab */ SDL_SCANCODE_F13, /* XF86Tools */ + /* 172, 0x0ac */ SDL_SCANCODE_AC_HOME, /* XF86HomePage */ + /* 173, 0x0ad */ SDL_SCANCODE_AC_REFRESH, /* XF86Reload */ + /* 174, 0x0ae */ SDL_SCANCODE_UNKNOWN, /* XF86Close */ + /* 175, 0x0af */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 176, 0x0b0 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 177, 0x0b1 */ SDL_SCANCODE_UNKNOWN, /* XF86ScrollUp */ + /* 178, 0x0b2 */ SDL_SCANCODE_UNKNOWN, /* XF86ScrollDown */ + /* 179, 0x0b3 */ SDL_SCANCODE_KP_LEFTPAREN, /* parenleft */ + /* 180, 0x0b4 */ SDL_SCANCODE_KP_RIGHTPAREN, /* parenright */ + /* 181, 0x0b5 */ SDL_SCANCODE_UNKNOWN, /* XF86New */ + /* 182, 0x0b6 */ SDL_SCANCODE_AGAIN, /* Redo */ + /* 183, 0x0b7 */ SDL_SCANCODE_F13, /* XF86Tools */ + /* 184, 0x0b8 */ SDL_SCANCODE_F14, /* XF86Launch5 */ + /* 185, 0x0b9 */ SDL_SCANCODE_F15, /* XF86Launch6 */ + /* 186, 0x0ba */ SDL_SCANCODE_F16, /* XF86Launch7 */ + /* 187, 0x0bb */ SDL_SCANCODE_F17, /* XF86Launch8 */ + /* 188, 0x0bc */ SDL_SCANCODE_F18, /* XF86Launch9 */ + /* 189, 0x0bd */ SDL_SCANCODE_F19, /* NoSymbol */ + /* 190, 0x0be */ SDL_SCANCODE_F20, /* XF86AudioMicMute */ + /* 191, 0x0bf */ SDL_SCANCODE_UNKNOWN, /* XF86TouchpadToggle */ + /* 192, 0x0c0 */ SDL_SCANCODE_UNKNOWN, /* XF86TouchpadOn */ + /* 193, 0x0c1 */ SDL_SCANCODE_UNKNOWN, /* XF86TouchpadOff */ + /* 194, 0x0c2 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 195, 0x0c3 */ SDL_SCANCODE_MODE, /* Mode_switch */ + /* 196, 0x0c4 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 197, 0x0c5 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 198, 0x0c6 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 199, 0x0c7 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 200, 0x0c8 */ SDL_SCANCODE_AUDIOPLAY, /* XF86AudioPlay */ + /* 201, 0x0c9 */ SDL_SCANCODE_UNKNOWN, /* XF86AudioPause */ + /* 202, 0x0ca */ SDL_SCANCODE_UNKNOWN, /* XF86Launch3 */ + /* 203, 0x0cb */ SDL_SCANCODE_UNKNOWN, /* XF86Launch4 */ + /* 204, 0x0cc */ SDL_SCANCODE_UNKNOWN, /* XF86LaunchB */ + /* 205, 0x0cd */ SDL_SCANCODE_UNKNOWN, /* XF86Suspend */ + /* 206, 0x0ce */ SDL_SCANCODE_UNKNOWN, /* XF86Close */ + /* 207, 0x0cf */ SDL_SCANCODE_AUDIOPLAY, /* XF86AudioPlay */ + /* 208, 0x0d0 */ SDL_SCANCODE_AUDIOFASTFORWARD, /* XF86AudioForward */ + /* 209, 0x0d1 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 210, 0x0d2 */ SDL_SCANCODE_PRINTSCREEN, /* Print */ + /* 211, 0x0d3 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 212, 0x0d4 */ SDL_SCANCODE_UNKNOWN, /* XF86WebCam */ + /* 213, 0x0d5 */ SDL_SCANCODE_UNKNOWN, /* XF86AudioPreset */ + /* 214, 0x0d6 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 215, 0x0d7 */ SDL_SCANCODE_MAIL, /* XF86Mail */ + /* 216, 0x0d8 */ SDL_SCANCODE_UNKNOWN, /* XF86Messenger */ + /* 217, 0x0d9 */ SDL_SCANCODE_AC_SEARCH, /* XF86Search */ + /* 218, 0x0da */ SDL_SCANCODE_UNKNOWN, /* XF86Go */ + /* 219, 0x0db */ SDL_SCANCODE_UNKNOWN, /* XF86Finance */ + /* 220, 0x0dc */ SDL_SCANCODE_UNKNOWN, /* XF86Game */ + /* 221, 0x0dd */ SDL_SCANCODE_UNKNOWN, /* XF86Shop */ + /* 222, 0x0de */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 223, 0x0df */ SDL_SCANCODE_CANCEL, /* Cancel */ + /* 224, 0x0e0 */ SDL_SCANCODE_BRIGHTNESSDOWN, /* XF86MonBrightnessDown */ + /* 225, 0x0e1 */ SDL_SCANCODE_BRIGHTNESSUP, /* XF86MonBrightnessUp */ + /* 226, 0x0e2 */ SDL_SCANCODE_MEDIASELECT, /* XF86AudioMedia */ + /* 227, 0x0e3 */ SDL_SCANCODE_DISPLAYSWITCH, /* XF86Display */ + /* 228, 0x0e4 */ SDL_SCANCODE_KBDILLUMTOGGLE, /* XF86KbdLightOnOff */ + /* 229, 0x0e5 */ SDL_SCANCODE_KBDILLUMDOWN, /* XF86KbdBrightnessDown */ + /* 230, 0x0e6 */ SDL_SCANCODE_KBDILLUMUP, /* XF86KbdBrightnessUp */ + /* 231, 0x0e7 */ SDL_SCANCODE_UNKNOWN, /* XF86Send */ + /* 232, 0x0e8 */ SDL_SCANCODE_UNKNOWN, /* XF86Reply */ + /* 233, 0x0e9 */ SDL_SCANCODE_UNKNOWN, /* XF86MailForward */ + /* 234, 0x0ea */ SDL_SCANCODE_UNKNOWN, /* XF86Save */ + /* 235, 0x0eb */ SDL_SCANCODE_UNKNOWN, /* XF86Documents */ + /* 236, 0x0ec */ SDL_SCANCODE_UNKNOWN, /* XF86Battery */ + /* 237, 0x0ed */ SDL_SCANCODE_UNKNOWN, /* XF86Bluetooth */ + /* 238, 0x0ee */ SDL_SCANCODE_UNKNOWN, /* XF86WLAN */ + /* 239, 0x0ef */ SDL_SCANCODE_UNKNOWN, /* XF86UWB */ + /* 240, 0x0f0 */ SDL_SCANCODE_UNKNOWN, /* NoSymbol */ + /* 241, 0x0f1 */ SDL_SCANCODE_UNKNOWN, /* XF86Next_VMode */ + /* 242, 0x0f2 */ SDL_SCANCODE_UNKNOWN, /* XF86Prev_VMode */ + /* 243, 0x0f3 */ SDL_SCANCODE_UNKNOWN, /* XF86MonBrightnessCycle */ + /* 244, 0x0f4 */ SDL_SCANCODE_UNKNOWN, /* XF86BrightnessAuto */ + /* 245, 0x0f5 */ SDL_SCANCODE_UNKNOWN, /* XF86DisplayOff */ + /* 246, 0x0f6 */ SDL_SCANCODE_UNKNOWN, /* XF86WWAN */ + /* 247, 0x0f7 */ SDL_SCANCODE_UNKNOWN, /* XF86RFKill */ }; /* Xvnc / Xtightvnc scancodes from xmodmap -pk */ @@ -510,3 +519,5 @@ static const SDL_Scancode xvnc_scancode_table[] = { #endif /* scancodes_xfree86_h_ */ /* *INDENT-ON* */ /* clang-format on */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/directfb/SDL_DirectFB_events.c b/src/video/directfb/SDL_DirectFB_events.c index 9351b5b1c..897a1687d 100644 --- a/src/video/directfb/SDL_DirectFB_events.c +++ b/src/video/directfb/SDL_DirectFB_events.c @@ -34,8 +34,7 @@ #include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_windowevents_c.h" #include "../../events/SDL_events_c.h" -#include "../../events/scancodes_linux.h" -#include "../../events/scancodes_xfree86.h" +#include "../../events/SDL_scancode_tables_c.h" #include "SDL_DirectFB_events.h" @@ -684,12 +683,10 @@ EnumKeyboards(DFBInputDeviceID device_id, devdata->keyboard[devdata->num_keyboard].is_generic = 0; if (!SDL_strncmp("X11", desc.name, 3)) { - devdata->keyboard[devdata->num_keyboard].map = xfree86_scancode_table2; - devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(xfree86_scancode_table2); + devdata->keyboard[devdata->num_keyboard].map = SDL_GetScancodeTable(SDL_SCANCODE_TABLE_XFREE86_2, &devdata->keyboard[devdata->num_keyboard].map_size); devdata->keyboard[devdata->num_keyboard].map_adjust = 8; } else { - devdata->keyboard[devdata->num_keyboard].map = linux_scancode_table; - devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(linux_scancode_table); + devdata->keyboard[devdata->num_keyboard].map = SDL_GetScancodeTable(SDL_SCANCODE_TABLE_EVDEV, &devdata->keyboard[devdata->num_keyboard].map_size); devdata->keyboard[devdata->num_keyboard].map_adjust = 0; } diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c index 54ffdaf04..57914877d 100644 --- a/src/video/wayland/SDL_waylandevents.c +++ b/src/video/wayland/SDL_waylandevents.c @@ -29,7 +29,7 @@ #include "../../core/unix/SDL_poll.h" #include "../../events/SDL_events_c.h" -#include "../../events/scancodes_xfree86.h" +#include "../../events/SDL_scancode_tables_c.h" #include "../SDL_sysvideo.h" #include "SDL_waylandvideo.h" @@ -1125,9 +1125,8 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard, keyboard_input_get_text(text, input, key, SDL_RELEASED, &handled_by_ime); } - if (!handled_by_ime && key < SDL_arraysize(xfree86_scancode_table2)) { - scancode = xfree86_scancode_table2[key]; - + if (!handled_by_ime) { + scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, key); if (scancode != SDL_SCANCODE_UNKNOWN) { SDL_SendKeyboardKey(state == WL_KEYBOARD_KEY_STATE_PRESSED ? SDL_PRESSED : SDL_RELEASED, scancode); @@ -1159,43 +1158,42 @@ Wayland_keymap_iter(struct xkb_keymap *keymap, xkb_keycode_t key, void *data) { const xkb_keysym_t *syms; Wayland_Keymap *sdlKeymap = (Wayland_Keymap *)data; + SDL_Scancode scancode; - if ((key - 8) < SDL_arraysize(xfree86_scancode_table2)) { - SDL_Scancode scancode = xfree86_scancode_table2[key - 8]; - if (scancode == SDL_SCANCODE_UNKNOWN) { - return; + scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, (key - 8)); + if (scancode == SDL_SCANCODE_UNKNOWN) { + return; + } + + if (WAYLAND_xkb_keymap_key_get_syms_by_level(keymap, key, sdlKeymap->layout, 0, &syms) > 0) { + uint32_t keycode = SDL_KeySymToUcs4(syms[0]); + + if (!keycode) { + keycode = Wayland_KeySymToSDLKeyCode(syms[0]); } - if (WAYLAND_xkb_keymap_key_get_syms_by_level(keymap, key, sdlKeymap->layout, 0, &syms) > 0) { - uint32_t keycode = SDL_KeySymToUcs4(syms[0]); - - if (!keycode) { - keycode = Wayland_KeySymToSDLKeyCode(syms[0]); - } - - if (keycode) { - sdlKeymap->keymap[scancode] = keycode; - } else { - switch (scancode) { - case SDL_SCANCODE_RETURN: - sdlKeymap->keymap[scancode] = SDLK_RETURN; - break; - case SDL_SCANCODE_ESCAPE: - sdlKeymap->keymap[scancode] = SDLK_ESCAPE; - break; - case SDL_SCANCODE_BACKSPACE: - sdlKeymap->keymap[scancode] = SDLK_BACKSPACE; - break; - case SDL_SCANCODE_TAB: - sdlKeymap->keymap[scancode] = SDLK_TAB; - break; - case SDL_SCANCODE_DELETE: - sdlKeymap->keymap[scancode] = SDLK_DELETE; - break; - default: - sdlKeymap->keymap[scancode] = SDL_SCANCODE_TO_KEYCODE(scancode); - break; - } + if (keycode) { + sdlKeymap->keymap[scancode] = keycode; + } else { + switch (scancode) { + case SDL_SCANCODE_RETURN: + sdlKeymap->keymap[scancode] = SDLK_RETURN; + break; + case SDL_SCANCODE_ESCAPE: + sdlKeymap->keymap[scancode] = SDLK_ESCAPE; + break; + case SDL_SCANCODE_BACKSPACE: + sdlKeymap->keymap[scancode] = SDLK_BACKSPACE; + break; + case SDL_SCANCODE_TAB: + sdlKeymap->keymap[scancode] = SDLK_TAB; + break; + case SDL_SCANCODE_DELETE: + sdlKeymap->keymap[scancode] = SDLK_DELETE; + break; + default: + sdlKeymap->keymap[scancode] = SDL_SCANCODE_TO_KEYCODE(scancode); + break; } } } diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 5c99a65d6..6e584f275 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -402,7 +402,7 @@ X11_ReconcileKeyboardState(_THIS) } keyboardState = SDL_GetKeyboardState(0); - for (keycode = 0; keycode < 256; ++keycode) { + for (keycode = 0; keycode < SDL_arraysize(viddata->key_layout); ++keycode) { SDL_Scancode scancode = viddata->key_layout[keycode]; SDL_bool x11KeyPressed = (keys[keycode / 8] & (1 << (keycode % 8))) != 0; SDL_bool sdlKeyPressed = keyboardState[scancode] == SDL_PRESSED; @@ -1046,18 +1046,17 @@ X11_DispatchEvent(_THIS, XEvent *xevent) #ifdef DEBUG_XEVENTS printf("window %p: %s (X11 keycode = 0x%X)\n", data, (xevent->type == KeyPress ? "KeyPress" : "KeyRelease"), xevent->xkey.keycode); #endif -#if 1 +#ifdef DEBUG_SCANCODES if (videodata->key_layout[keycode] == SDL_SCANCODE_UNKNOWN && keycode) { int min_keycode, max_keycode; X11_XDisplayKeycodes(display, &min_keycode, &max_keycode); keysym = X11_KeyCodeToSym(_this, keycode, xevent->xkey.state >> 13); - fprintf(stderr, - "The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL forums/mailing list X11 KeyCode %d (%d), X11 KeySym 0x%lX (%s).\n", + SDL_Log("The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL forums/mailing list X11 KeyCode %d (%d), X11 KeySym 0x%lX (%s).\n", keycode, keycode - min_keycode, keysym, X11_XKeysymToString(keysym)); } -#endif - /* */ +#endif /* DEBUG SCANCODES */ + SDL_zeroa(text); #ifdef X_HAVE_UTF8_STRING if (data->ic && xevent->type == KeyPress) { diff --git a/src/video/x11/SDL_x11keyboard.c b/src/video/x11/SDL_x11keyboard.c index c14e13d1c..1e46f5a4f 100644 --- a/src/video/x11/SDL_x11keyboard.c +++ b/src/video/x11/SDL_x11keyboard.c @@ -25,8 +25,7 @@ #include "SDL_x11video.h" #include "../../events/SDL_keyboard_c.h" -#include "../../events/scancodes_darwin.h" -#include "../../events/scancodes_xfree86.h" +#include "../../events/SDL_scancode_tables_c.h" #include #include @@ -42,43 +41,6 @@ static const struct { KeySym keysym; SDL_Scancode scancode; } KeySymToSDLScancode[] = { - { XK_Return, SDL_SCANCODE_RETURN }, - { XK_Escape, SDL_SCANCODE_ESCAPE }, - { XK_BackSpace, SDL_SCANCODE_BACKSPACE }, - { XK_Tab, SDL_SCANCODE_TAB }, - { XK_Caps_Lock, SDL_SCANCODE_CAPSLOCK }, - { XK_F1, SDL_SCANCODE_F1 }, - { XK_F2, SDL_SCANCODE_F2 }, - { XK_F3, SDL_SCANCODE_F3 }, - { XK_F4, SDL_SCANCODE_F4 }, - { XK_F5, SDL_SCANCODE_F5 }, - { XK_F6, SDL_SCANCODE_F6 }, - { XK_F7, SDL_SCANCODE_F7 }, - { XK_F8, SDL_SCANCODE_F8 }, - { XK_F9, SDL_SCANCODE_F9 }, - { XK_F10, SDL_SCANCODE_F10 }, - { XK_F11, SDL_SCANCODE_F11 }, - { XK_F12, SDL_SCANCODE_F12 }, - { XK_Print, SDL_SCANCODE_PRINTSCREEN }, - { XK_Scroll_Lock, SDL_SCANCODE_SCROLLLOCK }, - { XK_Pause, SDL_SCANCODE_PAUSE }, - { XK_Insert, SDL_SCANCODE_INSERT }, - { XK_Home, SDL_SCANCODE_HOME }, - { XK_Prior, SDL_SCANCODE_PAGEUP }, - { XK_Delete, SDL_SCANCODE_DELETE }, - { XK_End, SDL_SCANCODE_END }, - { XK_Next, SDL_SCANCODE_PAGEDOWN }, - { XK_Right, SDL_SCANCODE_RIGHT }, - { XK_Left, SDL_SCANCODE_LEFT }, - { XK_Down, SDL_SCANCODE_DOWN }, - { XK_Up, SDL_SCANCODE_UP }, - { XK_Num_Lock, SDL_SCANCODE_NUMLOCKCLEAR }, - { XK_KP_Divide, SDL_SCANCODE_KP_DIVIDE }, - { XK_KP_Multiply, SDL_SCANCODE_KP_MULTIPLY }, - { XK_KP_Subtract, SDL_SCANCODE_KP_MINUS }, - { XK_KP_Add, SDL_SCANCODE_KP_PLUS }, - { XK_KP_Enter, SDL_SCANCODE_KP_ENTER }, - { XK_KP_Delete, SDL_SCANCODE_KP_PERIOD }, { XK_KP_End, SDL_SCANCODE_KP_1 }, { XK_KP_Down, SDL_SCANCODE_KP_2 }, { XK_KP_Next, SDL_SCANCODE_KP_3 }, @@ -89,111 +51,409 @@ static const struct { { XK_KP_Up, SDL_SCANCODE_KP_8 }, { XK_KP_Prior, SDL_SCANCODE_KP_9 }, { XK_KP_Insert, SDL_SCANCODE_KP_0 }, - { XK_KP_Decimal, SDL_SCANCODE_KP_PERIOD }, - { XK_KP_1, SDL_SCANCODE_KP_1 }, - { XK_KP_2, SDL_SCANCODE_KP_2 }, - { XK_KP_3, SDL_SCANCODE_KP_3 }, - { XK_KP_4, SDL_SCANCODE_KP_4 }, - { XK_KP_5, SDL_SCANCODE_KP_5 }, - { XK_KP_6, SDL_SCANCODE_KP_6 }, - { XK_KP_7, SDL_SCANCODE_KP_7 }, - { XK_KP_8, SDL_SCANCODE_KP_8 }, - { XK_KP_9, SDL_SCANCODE_KP_9 }, - { XK_KP_0, SDL_SCANCODE_KP_0 }, - { XK_KP_Decimal, SDL_SCANCODE_KP_PERIOD }, - { XK_Hyper_R, SDL_SCANCODE_APPLICATION }, - { XK_KP_Equal, SDL_SCANCODE_KP_EQUALS }, - { XK_F13, SDL_SCANCODE_F13 }, - { XK_F14, SDL_SCANCODE_F14 }, - { XK_F15, SDL_SCANCODE_F15 }, - { XK_F16, SDL_SCANCODE_F16 }, - { XK_F17, SDL_SCANCODE_F17 }, - { XK_F18, SDL_SCANCODE_F18 }, - { XK_F19, SDL_SCANCODE_F19 }, - { XK_F20, SDL_SCANCODE_F20 }, - { XK_F21, SDL_SCANCODE_F21 }, - { XK_F22, SDL_SCANCODE_F22 }, - { XK_F23, SDL_SCANCODE_F23 }, - { XK_F24, SDL_SCANCODE_F24 }, + { XK_KP_Delete, SDL_SCANCODE_KP_PERIOD }, { XK_Execute, SDL_SCANCODE_EXECUTE }, - { XK_Help, SDL_SCANCODE_HELP }, - { XK_Menu, SDL_SCANCODE_MENU }, - { XK_Select, SDL_SCANCODE_SELECT }, - { XK_Cancel, SDL_SCANCODE_STOP }, - { XK_Redo, SDL_SCANCODE_AGAIN }, - { XK_Undo, SDL_SCANCODE_UNDO }, - { XK_Find, SDL_SCANCODE_FIND }, - { XK_KP_Separator, SDL_SCANCODE_KP_COMMA }, - { XK_Sys_Req, SDL_SCANCODE_SYSREQ }, - { XK_Control_L, SDL_SCANCODE_LCTRL }, - { XK_Shift_L, SDL_SCANCODE_LSHIFT }, - { XK_Alt_L, SDL_SCANCODE_LALT }, - { XK_Meta_L, SDL_SCANCODE_LGUI }, - { XK_Super_L, SDL_SCANCODE_LGUI }, - { XK_Control_R, SDL_SCANCODE_RCTRL }, - { XK_Shift_R, SDL_SCANCODE_RSHIFT }, - { XK_Alt_R, SDL_SCANCODE_RALT }, + { XK_Hyper_R, SDL_SCANCODE_APPLICATION }, { XK_ISO_Level3_Shift, SDL_SCANCODE_RALT }, - { XK_Meta_R, SDL_SCANCODE_RGUI }, + { XK_Super_L, SDL_SCANCODE_LGUI }, { XK_Super_R, SDL_SCANCODE_RGUI }, { XK_Mode_switch, SDL_SCANCODE_MODE }, - { XK_period, SDL_SCANCODE_PERIOD }, - { XK_comma, SDL_SCANCODE_COMMA }, - { XK_slash, SDL_SCANCODE_SLASH }, - { XK_backslash, SDL_SCANCODE_BACKSLASH }, - { XK_minus, SDL_SCANCODE_MINUS }, - { XK_equal, SDL_SCANCODE_EQUALS }, - { XK_space, SDL_SCANCODE_SPACE }, - { XK_grave, SDL_SCANCODE_GRAVE }, - { XK_apostrophe, SDL_SCANCODE_APOSTROPHE }, - { XK_bracketleft, SDL_SCANCODE_LEFTBRACKET }, - { XK_bracketright, SDL_SCANCODE_RIGHTBRACKET }, + { 0x1008FF65, SDL_SCANCODE_MENU }, /* XF86MenuKB */ + { 0x1008FF81, SDL_SCANCODE_F13 }, /* XF86Tools */ + { 0x1008FF45, SDL_SCANCODE_F14 }, /* XF86Launch5 */ + { 0x1008FF46, SDL_SCANCODE_F15 }, /* XF86Launch6 */ + { 0x1008FF47, SDL_SCANCODE_F16 }, /* XF86Launch7 */ + { 0x1008FF48, SDL_SCANCODE_F17 }, /* XF86Launch8 */ + { 0x1008FF49, SDL_SCANCODE_F18 }, /* XF86Launch9 */ }; -static const struct +/* This is a mapping from X keysym to Linux keycode */ +static const KeySym LinuxKeycodeKeysyms[] = { + /* 0, 0x000 */ 0x0, /* NoSymbol */ + /* 1, 0x001 */ 0xFF1B, /* Escape */ + /* 2, 0x002 */ 0x31, /* 1 */ + /* 3, 0x003 */ 0x32, /* 2 */ + /* 4, 0x004 */ 0x33, /* 3 */ + /* 5, 0x005 */ 0x34, /* 4 */ + /* 6, 0x006 */ 0x35, /* 5 */ + /* 7, 0x007 */ 0x36, /* 6 */ + /* 8, 0x008 */ 0x37, /* 7 */ + /* 9, 0x009 */ 0x38, /* 8 */ + /* 10, 0x00a */ 0x39, /* 9 */ + /* 11, 0x00b */ 0x30, /* 0 */ + /* 12, 0x00c */ 0x2D, /* minus */ + /* 13, 0x00d */ 0x3D, /* equal */ + /* 14, 0x00e */ 0xFF08, /* BackSpace */ + /* 15, 0x00f */ 0xFF09, /* Tab */ + /* 16, 0x010 */ 0x71, /* q */ + /* 17, 0x011 */ 0x77, /* w */ + /* 18, 0x012 */ 0x65, /* e */ + /* 19, 0x013 */ 0x72, /* r */ + /* 20, 0x014 */ 0x74, /* t */ + /* 21, 0x015 */ 0x79, /* y */ + /* 22, 0x016 */ 0x75, /* u */ + /* 23, 0x017 */ 0x69, /* i */ + /* 24, 0x018 */ 0x6F, /* o */ + /* 25, 0x019 */ 0x70, /* p */ + /* 26, 0x01a */ 0x5B, /* bracketleft */ + /* 27, 0x01b */ 0x5D, /* bracketright */ + /* 28, 0x01c */ 0xFF0D, /* Return */ + /* 29, 0x01d */ 0xFFE3, /* Control_L */ + /* 30, 0x01e */ 0x61, /* a */ + /* 31, 0x01f */ 0x73, /* s */ + /* 32, 0x020 */ 0x64, /* d */ + /* 33, 0x021 */ 0x66, /* f */ + /* 34, 0x022 */ 0x67, /* g */ + /* 35, 0x023 */ 0x68, /* h */ + /* 36, 0x024 */ 0x6A, /* j */ + /* 37, 0x025 */ 0x6B, /* k */ + /* 38, 0x026 */ 0x6C, /* l */ + /* 39, 0x027 */ 0x3B, /* semicolon */ + /* 40, 0x028 */ 0x27, /* apostrophe */ + /* 41, 0x029 */ 0x60, /* grave */ + /* 42, 0x02a */ 0xFFE1, /* Shift_L */ + /* 43, 0x02b */ 0x5C, /* backslash */ + /* 44, 0x02c */ 0x7A, /* z */ + /* 45, 0x02d */ 0x78, /* x */ + /* 46, 0x02e */ 0x63, /* c */ + /* 47, 0x02f */ 0x76, /* v */ + /* 48, 0x030 */ 0x62, /* b */ + /* 49, 0x031 */ 0x6E, /* n */ + /* 50, 0x032 */ 0x6D, /* m */ + /* 51, 0x033 */ 0x2C, /* comma */ + /* 52, 0x034 */ 0x2E, /* period */ + /* 53, 0x035 */ 0x2F, /* slash */ + /* 54, 0x036 */ 0xFFE2, /* Shift_R */ + /* 55, 0x037 */ 0xFFAA, /* KP_Multiply */ + /* 56, 0x038 */ 0xFFE9, /* Alt_L */ + /* 57, 0x039 */ 0x20, /* space */ + /* 58, 0x03a */ 0xFFE5, /* Caps_Lock */ + /* 59, 0x03b */ 0xFFBE, /* F1 */ + /* 60, 0x03c */ 0xFFBF, /* F2 */ + /* 61, 0x03d */ 0xFFC0, /* F3 */ + /* 62, 0x03e */ 0xFFC1, /* F4 */ + /* 63, 0x03f */ 0xFFC2, /* F5 */ + /* 64, 0x040 */ 0xFFC3, /* F6 */ + /* 65, 0x041 */ 0xFFC4, /* F7 */ + /* 66, 0x042 */ 0xFFC5, /* F8 */ + /* 67, 0x043 */ 0xFFC6, /* F9 */ + /* 68, 0x044 */ 0xFFC7, /* F10 */ + /* 69, 0x045 */ 0xFF7F, /* Num_Lock */ + /* 70, 0x046 */ 0xFF14, /* Scroll_Lock */ + /* 71, 0x047 */ 0xFFB7, /* KP_7 */ + /* 72, 0x048 */ 0XFFB8, /* KP_8 */ + /* 73, 0x049 */ 0XFFB9, /* KP_9 */ + /* 74, 0x04a */ 0xFFAD, /* KP_Subtract */ + /* 75, 0x04b */ 0xFFB4, /* KP_4 */ + /* 76, 0x04c */ 0xFFB5, /* KP_5 */ + /* 77, 0x04d */ 0xFFB6, /* KP_6 */ + /* 78, 0x04e */ 0xFFAB, /* KP_Add */ + /* 79, 0x04f */ 0xFFB1, /* KP_1 */ + /* 80, 0x050 */ 0xFFB2, /* KP_2 */ + /* 81, 0x051 */ 0xFFB3, /* KP_3 */ + /* 82, 0x052 */ 0xFFB0, /* KP_0 */ + /* 83, 0x053 */ 0xFFAE, /* KP_Decimal */ + /* 84, 0x054 */ 0x0, /* NoSymbol */ + /* 85, 0x055 */ 0x0, /* NoSymbol */ + /* 86, 0x056 */ 0x3C, /* less */ + /* 87, 0x057 */ 0xFFC8, /* F11 */ + /* 88, 0x058 */ 0xFFC9, /* F12 */ + /* 89, 0x059 */ 0x0, /* NoSymbol */ + /* 90, 0x05a */ 0xFF26, /* Katakana */ + /* 91, 0x05b */ 0xFF25, /* Hiragana */ + /* 92, 0x05c */ 0xFF23, /* Henkan_Mode */ + /* 93, 0x05d */ 0xFF27, /* Hiragana_Katakana */ + /* 94, 0x05e */ 0xFF22, /* Muhenkan */ + /* 95, 0x05f */ 0x0, /* NoSymbol */ + /* 96, 0x060 */ 0xFF8D, /* KP_Enter */ + /* 97, 0x061 */ 0xFFE4, /* Control_R */ + /* 98, 0x062 */ 0xFFAF, /* KP_Divide */ + /* 99, 0x063 */ 0xFF15, /* Sys_Req */ + /* 100, 0x064 */ 0xFFEA, /* Alt_R */ + /* 101, 0x065 */ 0xFF0A, /* Linefeed */ + /* 102, 0x066 */ 0xFF50, /* Home */ + /* 103, 0x067 */ 0xFF52, /* Up */ + /* 104, 0x068 */ 0xFF55, /* Prior */ + /* 105, 0x069 */ 0xFF51, /* Left */ + /* 106, 0x06a */ 0xFF53, /* Right */ + /* 107, 0x06b */ 0xFF57, /* End */ + /* 108, 0x06c */ 0xFF54, /* Down */ + /* 109, 0x06d */ 0xFF56, /* Next */ + /* 110, 0x06e */ 0xFF63, /* Insert */ + /* 111, 0x06f */ 0xFFFF, /* Delete */ + /* 112, 0x070 */ 0x0, /* NoSymbol */ + /* 113, 0x071 */ 0x1008FF12, /* XF86AudioMute */ + /* 114, 0x072 */ 0x1008FF11, /* XF86AudioLowerVolume */ + /* 115, 0x073 */ 0x1008FF13, /* XF86AudioRaiseVolume */ + /* 116, 0x074 */ 0x1008FF2A, /* XF86PowerOff */ + /* 117, 0x075 */ 0xFFBD, /* KP_Equal */ + /* 118, 0x076 */ 0xB1, /* plusminus */ + /* 119, 0x077 */ 0xFF13, /* Pause */ + /* 120, 0x078 */ 0x1008FF4A, /* XF86LaunchA */ + /* 121, 0x079 */ 0xFFAC, /* KP_Separator */ + /* 122, 0x07a */ 0xFF31, /* Hangul */ + /* 123, 0x07b */ 0xFF34, /* Hangul_Hanja */ + /* 124, 0x07c */ 0x0, /* NoSymbol */ + /* 125, 0x07d */ 0xFFE7, /* Meta_L */ + /* 126, 0x07e */ 0xFFE8, /* Meta_R */ + /* 127, 0x07f */ 0xFF67, /* Menu */ + /* 128, 0x080 */ 0x00, /* NoSymbol */ + /* 129, 0x081 */ 0xFF66, /* Redo */ + /* 130, 0x082 */ 0x1005FF70, /* SunProps */ + /* 131, 0x083 */ 0xFF65, /* Undo */ + /* 132, 0x084 */ 0x1005FF71, /* SunFront */ + /* 133, 0x085 */ 0x1008FF57, /* XF86Copy */ + /* 134, 0x086 */ 0x1008FF6B, /* XF86Open */ + /* 135, 0x087 */ 0x1008FF6D, /* XF86Paste */ + /* 136, 0x088 */ 0xFF68, /* Find */ + /* 137, 0x089 */ 0x1008FF58, /* XF86Cut */ + /* 138, 0x08a */ 0xFF6A, /* Help */ + /* 139, 0x08b */ 0xFF67, /* Menu */ + /* 140, 0x08c */ 0x1008FF1D, /* XF86Calculator */ + /* 141, 0x08d */ 0x0, /* NoSymbol */ + /* 142, 0x08e */ 0x1008FF2F, /* XF86Sleep */ + /* 143, 0x08f */ 0x1008FF2B, /* XF86WakeUp */ + /* 144, 0x090 */ 0x1008FF5D, /* XF86Explorer */ + /* 145, 0x091 */ 0x1008FF7B, /* XF86Send */ + /* 146, 0x092 */ 0x0, /* NoSymbol */ + /* 147, 0x093 */ 0x1008FF8A, /* XF86Xfer */ + /* 148, 0x094 */ 0x1008FF41, /* XF86Launch1 */ + /* 149, 0x095 */ 0x1008FF42, /* XF86Launch2 */ + /* 150, 0x096 */ 0x1008FF2E, /* XF86WWW */ + /* 151, 0x097 */ 0x1008FF5A, /* XF86DOS */ + /* 152, 0x098 */ 0x1008FF2D, /* XF86ScreenSaver */ + /* 153, 0x099 */ 0x1008FF74, /* XF86RotateWindows */ + /* 154, 0x09a */ 0x1008FF7F, /* XF86TaskPane */ + /* 155, 0x09b */ 0x1008FF19, /* XF86Mail */ + /* 156, 0x09c */ 0x1008FF30, /* XF86Favorites */ + /* 157, 0x09d */ 0x1008FF33, /* XF86MyComputer */ + /* 158, 0x09e */ 0x1008FF26, /* XF86Back */ + /* 159, 0x09f */ 0x1008FF27, /* XF86Forward */ + /* 160, 0x0a0 */ 0x0, /* NoSymbol */ + /* 161, 0x0a1 */ 0x1008FF2C, /* XF86Eject */ + /* 162, 0x0a2 */ 0x1008FF2C, /* XF86Eject */ + /* 163, 0x0a3 */ 0x1008FF17, /* XF86AudioNext */ + /* 164, 0x0a4 */ 0x1008FF14, /* XF86AudioPlay */ + /* 165, 0x0a5 */ 0x1008FF16, /* XF86AudioPrev */ + /* 166, 0x0a6 */ 0x1008FF15, /* XF86AudioStop */ + /* 167, 0x0a7 */ 0x1008FF1C, /* XF86AudioRecord */ + /* 168, 0x0a8 */ 0x1008FF3E, /* XF86AudioRewind */ + /* 169, 0x0a9 */ 0x1008FF6E, /* XF86Phone */ + /* 170, 0x0aa */ 0x0, /* NoSymbol */ + /* 171, 0x0ab */ 0x1008FF81, /* XF86Tools */ + /* 172, 0x0ac */ 0x1008FF18, /* XF86HomePage */ + /* 173, 0x0ad */ 0x1008FF73, /* XF86Reload */ + /* 174, 0x0ae */ 0x1008FF56, /* XF86Close */ + /* 175, 0x0af */ 0x0, /* NoSymbol */ + /* 176, 0x0b0 */ 0x0, /* NoSymbol */ + /* 177, 0x0b1 */ 0x1008FF78, /* XF86ScrollUp */ + /* 178, 0x0b2 */ 0x1008FF79, /* XF86ScrollDown */ + /* 179, 0x0b3 */ 0x28, /* parenleft */ + /* 180, 0x0b4 */ 0x29, /* parenright */ + /* 181, 0x0b5 */ 0x1008FF68, /* XF86New */ + /* 182, 0x0b6 */ 0xFF66, /* Redo */ + /* 183, 0x0b7 */ 0xFFCA, /* F13 */ + /* 184, 0x0b8 */ 0xFFCB, /* F14 */ + /* 185, 0x0b9 */ 0xFFCC, /* F15 */ + /* 186, 0x0ba */ 0xFFCD, /* F16 */ + /* 187, 0x0bb */ 0xFFCE, /* F17 */ + /* 188, 0x0bc */ 0xFFCF, /* F18 */ + /* 189, 0x0bd */ 0xFFD0, /* F19 */ + /* 190, 0x0be */ 0xFFD1, /* F20 */ + /* 191, 0x0bf */ 0xFFD2, /* F21 */ + /* 192, 0x0c0 */ 0xFFD3, /* F22 */ + /* 193, 0x0c1 */ 0xFFD4, /* F23 */ + /* 194, 0x0c2 */ 0xFFD5, /* F24 */ + /* 195, 0x0c3 */ 0x0, /* NoSymbol */ + /* 196, 0x0c4 */ 0x0, /* NoSymbol */ + /* 197, 0x0c5 */ 0x0, /* NoSymbol */ + /* 198, 0x0c6 */ 0x0, /* NoSymbol */ + /* 199, 0x0c7 */ 0x0, /* NoSymbol */ + /* 200, 0x0c8 */ 0x1008FF14, /* XF86AudioPlay */ + /* 201, 0x0c9 */ 0x1008FF31, /* XF86AudioPause */ + /* 202, 0x0ca */ 0x1008FF43, /* XF86Launch3 */ + /* 203, 0x0cb */ 0x1008FF44, /* XF86Launch4 */ + /* 204, 0x0cc */ 0x1008FF4B, /* XF86LaunchB */ + /* 205, 0x0cd */ 0x1008FFA7, /* XF86Suspend */ + /* 206, 0x0ce */ 0x1008FF56, /* XF86Close */ + /* 207, 0x0cf */ 0x1008FF14, /* XF86AudioPlay */ + /* 208, 0x0d0 */ 0x1008FF97, /* XF86AudioForward */ + /* 209, 0x0d1 */ 0x0, /* NoSymbol */ + /* 210, 0x0d2 */ 0xFF61, /* Print */ + /* 211, 0x0d3 */ 0x0, /* NoSymbol */ + /* 212, 0x0d4 */ 0x1008FF8F, /* XF86WebCam */ + /* 213, 0x0d5 */ 0x1008FFB6, /* XF86AudioPreset */ + /* 214, 0x0d6 */ 0x0, /* NoSymbol */ + /* 215, 0x0d7 */ 0x1008FF19, /* XF86Mail */ + /* 216, 0x0d8 */ 0x1008FF8E, /* XF86Messenger */ + /* 217, 0x0d9 */ 0x1008FF1B, /* XF86Search */ + /* 218, 0x0da */ 0x1008FF5F, /* XF86Go */ + /* 219, 0x0db */ 0x1008FF3C, /* XF86Finance */ + /* 220, 0x0dc */ 0x1008FF5E, /* XF86Game */ + /* 221, 0x0dd */ 0x1008FF36, /* XF86Shop */ + /* 222, 0x0de */ 0x0, /* NoSymbol */ + /* 223, 0x0df */ 0xFF69, /* Cancel */ + /* 224, 0x0e0 */ 0x1008FF03, /* XF86MonBrightnessDown */ + /* 225, 0x0e1 */ 0x1008FF02, /* XF86MonBrightnessUp */ + /* 226, 0x0e2 */ 0x1008FF32, /* XF86AudioMedia */ + /* 227, 0x0e3 */ 0x1008FF59, /* XF86Display */ + /* 228, 0x0e4 */ 0x1008FF04, /* XF86KbdLightOnOff */ + /* 229, 0x0e5 */ 0x1008FF06, /* XF86KbdBrightnessDown */ + /* 230, 0x0e6 */ 0x1008FF05, /* XF86KbdBrightnessUp */ + /* 231, 0x0e7 */ 0x1008FF7B, /* XF86Send */ + /* 232, 0x0e8 */ 0x1008FF72, /* XF86Reply */ + /* 233, 0x0e9 */ 0x1008FF90, /* XF86MailForward */ + /* 234, 0x0ea */ 0x1008FF77, /* XF86Save */ + /* 235, 0x0eb */ 0x1008FF5B, /* XF86Documents */ + /* 236, 0x0ec */ 0x1008FF93, /* XF86Battery */ + /* 237, 0x0ed */ 0x1008FF94, /* XF86Bluetooth */ + /* 238, 0x0ee */ 0x1008FF95, /* XF86WLAN */ + /* 239, 0x0ef */ 0x1008FF96, /* XF86UWB */ + /* 240, 0x0f0 */ 0x0, /* NoSymbol */ + /* 241, 0x0f1 */ 0x1008FE22, /* XF86Next_VMode */ + /* 242, 0x0f2 */ 0x1008FE23, /* XF86Prev_VMode */ + /* 243, 0x0f3 */ 0x1008FF07, /* XF86MonBrightnessCycle */ + /* 244, 0x0f4 */ 0x100810F4, /* XF86BrightnessAuto */ + /* 245, 0x0f5 */ 0x100810F5, /* XF86DisplayOff */ + /* 246, 0x0f6 */ 0x1008FFB4, /* XF86WWAN */ + /* 247, 0x0f7 */ 0x1008FFB5, /* XF86RFKill */ +}; + +#if 0 /* Here is a script to generate the ExtendedLinuxKeycodeKeysyms table */ +#!/bin/bash + +function process_line { - SDL_Scancode const *table; - int table_size; -} scancode_set[] = { - { darwin_scancode_table, SDL_arraysize(darwin_scancode_table) }, - { xfree86_scancode_table, SDL_arraysize(xfree86_scancode_table) }, - { xfree86_scancode_table2, SDL_arraysize(xfree86_scancode_table2) }, - { xvnc_scancode_table, SDL_arraysize(xvnc_scancode_table) }, + sym=$(echo "$1" | awk '{print $3}') + code=$(echo "$1" | sed 's,.*_EVDEVK(\(0x[0-9A-Fa-f]*\)).*,\1,') + value=$(egrep "#define ${sym}\s" -R /usr/include/X11 | awk '{print $3}') + printf " { 0x%.8X, 0x%.3x }, /* $sym */\n" $value $code +} + +fgrep "/* Use: " /usr/include/xkbcommon/xkbcommon-keysyms.h | fgrep _EVDEVK | while read line; do + process_line "$line" +done +#endif + +static const struct { + KeySym keysym; + int linux_keycode; +} ExtendedLinuxKeycodeKeysyms[] = { + { 0x1008FF2C, 0x0a2 }, /* XF86XK_Eject */ + { 0x1008FF68, 0x0b5 }, /* XF86XK_New */ + { 0x0000FF66, 0x0b6 }, /* XK_Redo */ + { 0x1008FF4B, 0x0cc }, /* XF86XK_LaunchB */ + { 0x1008FF59, 0x0e3 }, /* XF86XK_Display */ + { 0x1008FF04, 0x0e4 }, /* XF86XK_KbdLightOnOff */ + { 0x1008FF06, 0x0e5 }, /* XF86XK_KbdBrightnessDown */ + { 0x1008FF05, 0x0e6 }, /* XF86XK_KbdBrightnessUp */ + { 0x1008FF7B, 0x0e7 }, /* XF86XK_Send */ + { 0x1008FF72, 0x0e8 }, /* XF86XK_Reply */ + { 0x1008FF90, 0x0e9 }, /* XF86XK_MailForward */ + { 0x1008FF77, 0x0ea }, /* XF86XK_Save */ + { 0x1008FF5B, 0x0eb }, /* XF86XK_Documents */ + { 0x1008FF93, 0x0ec }, /* XF86XK_Battery */ + { 0x1008FF94, 0x0ed }, /* XF86XK_Bluetooth */ + { 0x1008FF95, 0x0ee }, /* XF86XK_WLAN */ + { 0x1008FF96, 0x0ef }, /* XF86XK_UWB */ + { 0x1008FE22, 0x0f1 }, /* XF86XK_Next_VMode */ + { 0x1008FE23, 0x0f2 }, /* XF86XK_Prev_VMode */ + { 0x1008FF07, 0x0f3 }, /* XF86XK_MonBrightnessCycle */ + { 0x1008FFB4, 0x0f6 }, /* XF86XK_WWAN */ + { 0x1008FFB5, 0x0f7 }, /* XF86XK_RFKill */ + { 0x1008FFB2, 0x0f8 }, /* XF86XK_AudioMicMute */ + { 0x1008FF9C, 0x173 }, /* XF86XK_CycleAngle */ + { 0x1008FFB8, 0x174 }, /* XF86XK_FullScreen */ + { 0x1008FF87, 0x189 }, /* XF86XK_Video */ + { 0x1008FF20, 0x18d }, /* XF86XK_Calendar */ + { 0x1008FF99, 0x19a }, /* XF86XK_AudioRandomPlay */ + { 0x1008FF5E, 0x1a1 }, /* XF86XK_Game */ + { 0x1008FF8B, 0x1a2 }, /* XF86XK_ZoomIn */ + { 0x1008FF8C, 0x1a3 }, /* XF86XK_ZoomOut */ + { 0x1008FF89, 0x1a5 }, /* XF86XK_Word */ + { 0x1008FF5C, 0x1a7 }, /* XF86XK_Excel */ + { 0x1008FF69, 0x1ab }, /* XF86XK_News */ + { 0x1008FF8E, 0x1ae }, /* XF86XK_Messenger */ + { 0x1008FF61, 0x1b1 }, /* XF86XK_LogOff */ + { 0x00000024, 0x1b2 }, /* XK_dollar */ + { 0x000020AC, 0x1b3 }, /* XK_EuroSign */ + { 0x1008FF9D, 0x1b4 }, /* XF86XK_FrameBack */ + { 0x1008FF9E, 0x1b5 }, /* XF86XK_FrameForward */ + { 0x0000FFF1, 0x1f1 }, /* XK_braille_dot_1 */ + { 0x0000FFF2, 0x1f2 }, /* XK_braille_dot_2 */ + { 0x0000FFF3, 0x1f3 }, /* XK_braille_dot_3 */ + { 0x0000FFF4, 0x1f4 }, /* XK_braille_dot_4 */ + { 0x0000FFF5, 0x1f5 }, /* XK_braille_dot_5 */ + { 0x0000FFF6, 0x1f6 }, /* XK_braille_dot_6 */ + { 0x0000FFF7, 0x1f7 }, /* XK_braille_dot_7 */ + { 0x0000FFF8, 0x1f8 }, /* XK_braille_dot_8 */ + { 0x0000FFF9, 0x1f9 }, /* XK_braille_dot_9 */ + { 0x0000FFF1, 0x1fa }, /* XK_braille_dot_1 */ + { 0x1008FFA9, 0x212 }, /* XF86XK_TouchpadToggle */ + { 0x1008FFB0, 0x213 }, /* XF86XK_TouchpadOn */ + { 0x1008FFB1, 0x214 }, /* XF86XK_TouchpadOff */ + { 0x1008FFB7, 0x231 }, /* XF86XK_RotationLockToggle */ + { 0x0000FE08, 0x248 }, /* XK_ISO_Next_Group */ +}; + +static SDL_ScancodeTable scancode_set[] = { + SDL_SCANCODE_TABLE_DARWIN, + SDL_SCANCODE_TABLE_XFREE86_1, + SDL_SCANCODE_TABLE_XFREE86_2, + SDL_SCANCODE_TABLE_XVNC, }; /* *INDENT-OFF* */ /* clang-format off */ -/* This function only works for keyboards in US QWERTY layout */ +/* This function only correctly maps letters and numbers for keyboards in US QWERTY layout */ static SDL_Scancode X11_KeyCodeToSDLScancode(_THIS, KeyCode keycode) { KeySym keysym; int i; + int linux_keycode = 0; keysym = X11_KeyCodeToSym(_this, keycode, 0); if (keysym == NoSymbol) { return SDL_SCANCODE_UNKNOWN; } - if (keysym >= XK_a && keysym <= XK_z) { - return SDL_SCANCODE_A + (keysym - XK_a); - } - if (keysym >= XK_A && keysym <= XK_Z) { - return SDL_SCANCODE_A + (keysym - XK_A); - } - - if (keysym == XK_0) { - return SDL_SCANCODE_0; - } - if (keysym >= XK_1 && keysym <= XK_9) { - return SDL_SCANCODE_1 + (keysym - XK_1); - } - + /* First check our custom list */ for (i = 0; i < SDL_arraysize(KeySymToSDLScancode); ++i) { if (keysym == KeySymToSDLScancode[i].keysym) { return KeySymToSDLScancode[i].scancode; } } - return SDL_SCANCODE_UNKNOWN; + + /* The rest of the keysyms map to Linux keycodes, so use that mapping */ + if (keysym >= 0x10081000 && keysym <= 0x10081FFF) { + /* Per xkbcommon-keysyms.h, this is actually a linux keycode */ + linux_keycode = (keysym - 0x10081000); + } + if (!linux_keycode) { + /* See if this keysym is an exact match in our table */ + i = (keycode - 8); + if (i >= 0 && i < SDL_arraysize(LinuxKeycodeKeysyms) && keysym == LinuxKeycodeKeysyms[i]) { + linux_keycode = i; + } else { + /* Scan the table for this keysym */ + for (i = 0; i < SDL_arraysize(LinuxKeycodeKeysyms); ++i) { + if (keysym == LinuxKeycodeKeysyms[i]) { + linux_keycode = i; + break; + } + } + } + } + if (!linux_keycode) { + /* Scan the extended table for this keysym */ + for (i = 0; i < SDL_arraysize(ExtendedLinuxKeycodeKeysyms); ++i) { + if (keysym == ExtendedLinuxKeycodeKeysyms[i].keysym) { + linux_keycode = ExtendedLinuxKeycodeKeysyms[i].linux_keycode; + break; + } + } + } + return SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_LINUX, linux_keycode); } static Uint32 @@ -339,21 +599,21 @@ X11_InitKeyboard(_THIS) best_index = -1; X11_XDisplayKeycodes(data->display, &min_keycode, &max_keycode); for (i = 0; i < SDL_arraysize(fingerprint); ++i) { - fingerprint[i].value = - X11_XKeysymToKeycode(data->display, fingerprint[i].keysym) - - min_keycode; + fingerprint[i].value = X11_XKeysymToKeycode(data->display, fingerprint[i].keysym) - min_keycode; } for (i = 0; i < SDL_arraysize(scancode_set); ++i) { + int table_size; + const SDL_Scancode *table = SDL_GetScancodeTable(scancode_set[i], &table_size); + /* Make sure the scancode set isn't too big */ - if ((max_keycode - min_keycode + 1) <= scancode_set[i].table_size) { + if (table_size > (max_keycode - min_keycode + 1)) { continue; } distance = 0; for (j = 0; j < SDL_arraysize(fingerprint); ++j) { - if (fingerprint[j].value < 0 - || fingerprint[j].value >= scancode_set[i].table_size) { + if (fingerprint[j].value < 0 || fingerprint[j].value >= table_size) { distance += 1; - } else if (scancode_set[i].table[fingerprint[j].value] != fingerprint[j].scancode) { + } else if (table[fingerprint[j].value] != fingerprint[j].scancode) { distance += 1; } } @@ -363,34 +623,68 @@ X11_InitKeyboard(_THIS) } } if (best_index >= 0 && best_distance <= 2) { -#ifdef DEBUG_KEYBOARD - printf("Using scancode set %d, min_keycode = %d, max_keycode = %d, table_size = %d\n", best_index, min_keycode, max_keycode, scancode_set[best_index].table_size); -#endif - SDL_memcpy(&data->key_layout[min_keycode], scancode_set[best_index].table, - sizeof(SDL_Scancode) * scancode_set[best_index].table_size); - } else { - SDL_Keycode keymap[SDL_NUM_SCANCODES]; + SDL_Keycode default_keymap[SDL_NUM_SCANCODES]; + int table_size; + const SDL_Scancode *table = SDL_GetScancodeTable(scancode_set[best_index], &table_size); - printf - ("Keyboard layout unknown, please report the following to the SDL forums/mailing list (https://discourse.libsdl.org/):\n"); +#ifdef DEBUG_KEYBOARD + SDL_Log("Using scancode set %d, min_keycode = %d, max_keycode = %d, table_size = %d\n", best_index, min_keycode, max_keycode, table_size); +#endif + /* This should never happen, but just in case... */ + if (table_size > (SDL_arraysize(data->key_layout) - min_keycode)) { + table_size = (SDL_arraysize(data->key_layout) - min_keycode); + } + SDL_memcpy(&data->key_layout[min_keycode], table, sizeof(SDL_Scancode) * table_size); + + /* Scancodes represent physical locations on the keyboard, unaffected by keyboard mapping. + However, there are a number of extended scancodes that have no standard location, so use + the X11 mapping for all non-character keys. + */ + SDL_GetDefaultKeymap(default_keymap); + + for (i = min_keycode; i <= max_keycode; ++i) { + SDL_Scancode scancode = X11_KeyCodeToSDLScancode(_this, i); +#ifdef DEBUG_KEYBOARD + { + KeySym sym; + sym = X11_KeyCodeToSym(_this, (KeyCode)i, 0); + SDL_Log("code = %d, sym = 0x%X (%s) ", i - min_keycode, + (unsigned int)sym, sym == NoSymbol ? "NoSymbol" : X11_XKeysymToString(sym)); + } +#endif + if (scancode == data->key_layout[i]) { + continue; + } + if (scancode == SDL_SCANCODE_UNKNOWN || default_keymap[scancode] >= SDLK_SCANCODE_MASK) { + /* Not a character key, safe to remap */ +#ifdef DEBUG_KEYBOARD + SDL_Log("Changing scancode, was %d (%s), now %d (%s)\n", data->key_layout[i], SDL_GetScancodeName(data->key_layout[i]), scancode, SDL_GetScancodeName(scancode)); +#endif + data->key_layout[i] = scancode; + } + } + } else { +#ifdef DEBUG_SCANCODES + SDL_Log("Keyboard layout unknown, please report the following to the SDL forums/mailing list (https://discourse.libsdl.org/):\n"); +#endif /* Determine key_layout - only works on US QWERTY layout */ - SDL_GetDefaultKeymap(keymap); for (i = min_keycode; i <= max_keycode; ++i) { - KeySym sym; - sym = X11_KeyCodeToSym(_this, (KeyCode) i, 0); - if (sym != NoSymbol) { - SDL_Scancode scancode; - printf("code = %d, sym = 0x%X (%s) ", i - min_keycode, - (unsigned int) sym, X11_XKeysymToString(sym)); - scancode = X11_KeyCodeToSDLScancode(_this, i); - data->key_layout[i] = scancode; - if (scancode == SDL_SCANCODE_UNKNOWN) { - printf("scancode not found\n"); - } else { - printf("scancode = %d (%s)\n", scancode, SDL_GetScancodeName(scancode)); - } + SDL_Scancode scancode = X11_KeyCodeToSDLScancode(_this, i); +#ifdef DEBUG_SCANCODES + { + KeySym sym; + sym = X11_KeyCodeToSym(_this, (KeyCode)i, 0); + SDL_Log("code = %d, sym = 0x%X (%s) ", i - min_keycode, + (unsigned int)sym, sym == NoSymbol ? "NoSymbol" : X11_XKeysymToString(sym)); } + if (scancode == SDL_SCANCODE_UNKNOWN) { + SDL_Log("scancode not found\n"); + } else { + SDL_Log("scancode = %d (%s)\n", scancode, SDL_GetScancodeName(scancode)); + } +#endif + data->key_layout[i] = scancode; } }