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 "
-                    "<https://discourse.libsdl.org/> 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 "
+                "<https://discourse.libsdl.org/> 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 <slouken@libsdl.org>
+
+  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 <slouken@libsdl.org>
+
+  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 <https://discourse.libsdl.org/> 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 <https://discourse.libsdl.org/> 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 <X11/keysym.h>
 #include <X11/XKBlib.h>
@@ -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;
         }
     }