const char *keyname[] = {
    [SDLK_UNKNOWN] = "<unknown>",
    [SDLK_RETURN] = "<RETURN>",
    [SDLK_ESCAPE] = "<ESC>",
    [SDLK_BACKSPACE] = "<BACKSPACE>",
    [SDLK_TAB] = "<TAB>",
    [SDLK_SPACE] = "<SPACE>",
    [SDLK_EXCLAIM] = "!",
    [SDLK_QUOTEDBL] = "\"",
    [SDLK_HASH] = "#",
    [SDLK_PERCENT] = "%",
    [SDLK_DOLLAR] = "$",
    [SDLK_AMPERSAND] = "&",
    [SDLK_QUOTE] = "'",
    [SDLK_LEFTPAREN] = "(",
    [SDLK_RIGHTPAREN] = ")",
    [SDLK_ASTERISK] = "*",
    [SDLK_PLUS] = "+",
    [SDLK_COMMA] = ",",
    [SDLK_MINUS] = "-",
    [SDLK_PERIOD] = ".",
    [SDLK_SLASH] = "/",
    [SDLK_0] = "0",
    [SDLK_1] = "1",
    [SDLK_2] = "2",
    [SDLK_3] = "3",
    [SDLK_4] = "4",
    [SDLK_5] = "5",
    [SDLK_6] = "6",
    [SDLK_7] = "7",
    [SDLK_8] = "8",
    [SDLK_9] = "9",
    [SDLK_COLON] = ":",
    [SDLK_SEMICOLON] = ";",
    [SDLK_LESS] = "<",
    [SDLK_EQUALS] = "=",
    [SDLK_GREATER] = ">",
    [SDLK_QUESTION] = "?",
    [SDLK_AT] = "@",
    [SDLK_LEFTBRACKET] = "[",
    [SDLK_BACKSLASH] = "\\",
    [SDLK_RIGHTBRACKET] = "]",
    [SDLK_CARET] = "^",
    [SDLK_UNDERSCORE] = "_",
    [SDLK_BACKQUOTE] = "`",
    [SDLK_a] = "a",
    [SDLK_b] = "b",
    [SDLK_c] = "c",
    [SDLK_d] = "d",
    [SDLK_e] = "e",
    [SDLK_f] = "f",
    [SDLK_g] = "g",
    [SDLK_h] = "h",
    [SDLK_i] = "i",
    [SDLK_j] = "j",
    [SDLK_k] = "k",
    [SDLK_l] = "l",
    [SDLK_m] = "m",
    [SDLK_n] = "n",
    [SDLK_o] = "o",
    [SDLK_p] = "p",
    [SDLK_q] = "q",
    [SDLK_r] = "r",
    [SDLK_s] = "s",
    [SDLK_t] = "t",
    [SDLK_u] = "u",
    [SDLK_v] = "v",
    [SDLK_w] = "w",
    [SDLK_x] = "x",
    [SDLK_y] = "y",
    [SDLK_z] = "z",
#ifdef NEVER // Can't happen.  Passed back as sequence of shift press then lower-case letter.
             // programmers have to keep track of multiple SHIFT codes and CAPS_LOCK...
    ['A'] = "A",
    ['B'] = "B",
    ['C'] = "C",
    ['D'] = "D",
    ['E'] = "E",
    ['F'] = "F",
    ['G'] = "G",
    ['H'] = "H",
    ['I'] = "I",
    ['J'] = "J",
    ['K'] = "K",
    ['L'] = "L",
    ['M'] = "M",
    ['N'] = "N",
    ['O'] = "O",
    ['P'] = "P",
    ['Q'] = "Q",
    ['R'] = "R",
    ['S'] = "S",
    ['T'] = "T",
    ['U'] = "U",
    ['V'] = "V",
    ['W'] = "W",
    ['X'] = "X",
    ['Y'] = "Y",
    ['Z'] = "Z",
#endif
    // foreign language keys not listed.  Don't know if they will work or not, I don't have any foreign keyboards.
    // Or even British ones with a real Pound sign.
};
const char *scancodename[] = {
    [SDLK_CAPSLOCK&(SDLK_SCANCODE_MASK-1)] = "SDLK_CAPSLOCK",
    [SDLK_F1&(SDLK_SCANCODE_MASK-1)] = "SDLK_F1",
    [SDLK_F2&(SDLK_SCANCODE_MASK-1)] = "SDLK_F2",
    [SDLK_F3&(SDLK_SCANCODE_MASK-1)] = "SDLK_F3",
    [SDLK_F4&(SDLK_SCANCODE_MASK-1)] = "SDLK_F4",
    [SDLK_F5&(SDLK_SCANCODE_MASK-1)] = "SDLK_F5",
    [SDLK_F6&(SDLK_SCANCODE_MASK-1)] = "SDLK_F6",
    [SDLK_F7&(SDLK_SCANCODE_MASK-1)] = "SDLK_F7",
    [SDLK_F8&(SDLK_SCANCODE_MASK-1)] = "SDLK_F8",
    [SDLK_F9&(SDLK_SCANCODE_MASK-1)] = "SDLK_F9",
    [SDLK_F10&(SDLK_SCANCODE_MASK-1)] = "SDLK_F10",
    [SDLK_F11&(SDLK_SCANCODE_MASK-1)] = "SDLK_F11",
    [SDLK_F12&(SDLK_SCANCODE_MASK-1)] = "SDLK_F12",
    [SDLK_PRINTSCREEN&(SDLK_SCANCODE_MASK-1)] = "SDLK_PRINTSCREEN",
    [SDLK_SCROLLLOCK&(SDLK_SCANCODE_MASK-1)] = "SDLK_SCROLLLOCK",
    [SDLK_PAUSE&(SDLK_SCANCODE_MASK-1)] = "SDLK_PAUSE",
    [SDLK_INSERT&(SDLK_SCANCODE_MASK-1)] = "SDLK_INSERT",
    [SDLK_HOME&(SDLK_SCANCODE_MASK-1)] = "SDLK_HOME",
    [SDLK_PAGEUP&(SDLK_SCANCODE_MASK-1)] = "SDLK_PAGEUP",
    [SDLK_DELETE&(SDLK_SCANCODE_MASK-1)] = "SDLK_DELETE",
    [SDLK_END&(SDLK_SCANCODE_MASK-1)] = "SDLK_END",
    [SDLK_PAGEDOWN&(SDLK_SCANCODE_MASK-1)] = "SDLK_PAGEDOWN",
    [SDLK_RIGHT&(SDLK_SCANCODE_MASK-1)] = "SDLK_RIGHT",
    [SDLK_LEFT&(SDLK_SCANCODE_MASK-1)] = "SDLK_LEFT",
    [SDLK_DOWN&(SDLK_SCANCODE_MASK-1)] = "SDLK_DOWN",
    [SDLK_UP&(SDLK_SCANCODE_MASK-1)] = "SDLK_UP",
    [SDLK_NUMLOCKCLEAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_NUMLOCKCLEAR",
    [SDLK_KP_DIVIDE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_DIVIDE",
    [SDLK_KP_MULTIPLY&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MULTIPLY",
    [SDLK_KP_MINUS&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MINUS",
    [SDLK_KP_PLUS&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_PLUS",
    [SDLK_KP_ENTER&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_ENTER",
    [SDLK_KP_1&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_1",
    [SDLK_KP_2&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_2",
    [SDLK_KP_3&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_3",
    [SDLK_KP_4&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_4",
    [SDLK_KP_5&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_5",
    [SDLK_KP_6&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_6",
    [SDLK_KP_7&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_7",
    [SDLK_KP_8&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_8",
    [SDLK_KP_9&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_9",
    [SDLK_KP_0&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_0",
    [SDLK_KP_PERIOD&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_PERIOD",
    [SDLK_APPLICATION&(SDLK_SCANCODE_MASK-1)] = "SDLK_APPLICATION",
    [SDLK_POWER&(SDLK_SCANCODE_MASK-1)] = "SDLK_POWER",
    [SDLK_KP_EQUALS&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_EQUALS",
    [SDLK_F13&(SDLK_SCANCODE_MASK-1)] = "SDLK_F13",
    [SDLK_F14&(SDLK_SCANCODE_MASK-1)] = "SDLK_F14",
    [SDLK_F15&(SDLK_SCANCODE_MASK-1)] = "SDLK_F15",
    [SDLK_F16&(SDLK_SCANCODE_MASK-1)] = "SDLK_F16",
    [SDLK_F17&(SDLK_SCANCODE_MASK-1)] = "SDLK_F17",
    [SDLK_F18&(SDLK_SCANCODE_MASK-1)] = "SDLK_F18",
    [SDLK_F19&(SDLK_SCANCODE_MASK-1)] = "SDLK_F19",
    [SDLK_F20&(SDLK_SCANCODE_MASK-1)] = "SDLK_F20",
    [SDLK_F21&(SDLK_SCANCODE_MASK-1)] = "SDLK_F21",
    [SDLK_F22&(SDLK_SCANCODE_MASK-1)] = "SDLK_F22",
    [SDLK_F23&(SDLK_SCANCODE_MASK-1)] = "SDLK_F23",
    [SDLK_F24&(SDLK_SCANCODE_MASK-1)] = "SDLK_F24",
    [SDLK_EXECUTE&(SDLK_SCANCODE_MASK-1)] = "SDLK_EXECUTE",
    [SDLK_HELP&(SDLK_SCANCODE_MASK-1)] = "SDLK_HELP",
    [SDLK_MENU&(SDLK_SCANCODE_MASK-1)] = "SDLK_MENU",
    [SDLK_SELECT&(SDLK_SCANCODE_MASK-1)] = "SDLK_SELECT",
    [SDLK_STOP&(SDLK_SCANCODE_MASK-1)] = "SDLK_STOP",
    [SDLK_AGAIN&(SDLK_SCANCODE_MASK-1)] = "SDLK_AGAIN",
    [SDLK_UNDO&(SDLK_SCANCODE_MASK-1)] = "SDLK_UNDO",
    [SDLK_CUT&(SDLK_SCANCODE_MASK-1)] = "SDLK_CUT",
    [SDLK_COPY&(SDLK_SCANCODE_MASK-1)] = "SDLK_COPY",
    [SDLK_PASTE&(SDLK_SCANCODE_MASK-1)] = "SDLK_PASTE",
    [SDLK_FIND&(SDLK_SCANCODE_MASK-1)] = "SDLK_FIND",
    [SDLK_MUTE&(SDLK_SCANCODE_MASK-1)] = "SDLK_MUTE",
    [SDLK_VOLUMEUP&(SDLK_SCANCODE_MASK-1)] = "SDLK_VOLUMEUP",
    [SDLK_VOLUMEDOWN&(SDLK_SCANCODE_MASK-1)] = "SDLK_VOLUMEDOWN",
    [SDLK_KP_COMMA&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_COMMA",
    [SDLK_KP_EQUALSAS400&(SDLK_SCANCODE_MASK-1)] ="SDLK_KP_EQUALSAS400",
    [SDLK_ALTERASE&(SDLK_SCANCODE_MASK-1)] = "SDLK_ALTERASE",
    [SDLK_SYSREQ&(SDLK_SCANCODE_MASK-1)] = "SDLK_SYSREQ",
    [SDLK_CANCEL&(SDLK_SCANCODE_MASK-1)] = "SDLK_CANCEL",
    [SDLK_CLEAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_CLEAR",
    [SDLK_PRIOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_PRIOR",
    [SDLK_RETURN2&(SDLK_SCANCODE_MASK-1)] = "SDLK_RETURN2",
    [SDLK_SEPARATOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_SEPARATOR",
    [SDLK_OUT&(SDLK_SCANCODE_MASK-1)] = "SDLK_OUT",
    [SDLK_OPER&(SDLK_SCANCODE_MASK-1)] = "SDLK_OPER",
    [SDLK_CLEARAGAIN&(SDLK_SCANCODE_MASK-1)] = "SDLK_CLEARAGAIN",
    [SDLK_CRSEL&(SDLK_SCANCODE_MASK-1)] = "SDLK_CRSEL",
    [SDLK_EXSEL&(SDLK_SCANCODE_MASK-1)] = "SDLK_EXSEL",
    [SDLK_KP_00&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_00",
    [SDLK_KP_000&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_000",
    [SDLK_THOUSANDSSEPARATOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_THOUSANDSSEPARATOR",
    [SDLK_DECIMALSEPARATOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_DECIMALSEPARATOR",
    [SDLK_CURRENCYUNIT&(SDLK_SCANCODE_MASK-1)] = "SDLK_CURRENCYUNIT",
    [SDLK_CURRENCYSUBUNIT&(SDLK_SCANCODE_MASK-1)] = "SDLK_CURRENCYSUBUNIT",
    [SDLK_KP_LEFTPAREN&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_LEFTPAREN",
    [SDLK_KP_RIGHTPAREN&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_RIGHTPAREN",
    [SDLK_KP_LEFTBRACE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_LEFTBRACE",
    [SDLK_KP_RIGHTBRACE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_RIGHTBRACE",
    [SDLK_KP_TAB&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_TAB",
    [SDLK_KP_BACKSPACE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_BACKSPACE",
    [SDLK_KP_A&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_A",
    [SDLK_KP_B&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_B",
    [SDLK_KP_C&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_C",
    [SDLK_KP_D&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_D",
    [SDLK_KP_E&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_E",
    [SDLK_KP_F&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_F",
    [SDLK_KP_XOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_XOR",
    [SDLK_KP_POWER&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_POWER",
    [SDLK_KP_PERCENT&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_PERCENT",
    [SDLK_KP_LESS&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_LESS",
    [SDLK_KP_GREATER&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_GREATER",
    [SDLK_KP_AMPERSAND&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_AMPERSAND",
    [SDLK_KP_DBLAMPERSAND&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_DBLAMPERSAND",
    [SDLK_KP_VERTICALBAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_VERTICALBAR",
    [SDLK_KP_DBLVERTICALBAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_DBLVERTICALBAR",
    [SDLK_KP_COLON&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_COLON",
    [SDLK_KP_HASH&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_HASH",
    [SDLK_KP_SPACE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_SPACE",
    [SDLK_KP_AT&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_AT",
    [SDLK_KP_EXCLAM&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_EXCLAM",
    [SDLK_KP_MEMSTORE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMSTORE",
    [SDLK_KP_MEMRECALL&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMRECALL",
    [SDLK_KP_MEMCLEAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMCLEAR",
    [SDLK_KP_MEMADD&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMADD",
    [SDLK_KP_MEMSUBTRACT&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMSUBTRACT",
    [SDLK_KP_MEMMULTIPLY&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMMULTIPLY",
    [SDLK_KP_MEMDIVIDE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_MEMDIVIDE",
    [SDLK_KP_PLUSMINUS&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_PLUSMINUS",
    [SDLK_KP_CLEAR&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_CLEAR",
    [SDLK_KP_CLEARENTRY&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_CLEARENTRY",
    [SDLK_KP_BINARY&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_BINARY",
    [SDLK_KP_OCTAL&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_OCTAL",
    [SDLK_KP_DECIMAL&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_DECIMAL",
    [SDLK_KP_HEXADECIMAL&(SDLK_SCANCODE_MASK-1)] = "SDLK_KP_HEXADECIMAL",
    [SDLK_LCTRL&(SDLK_SCANCODE_MASK-1)] = "SDLK_LCTRL",
    [SDLK_LSHIFT&(SDLK_SCANCODE_MASK-1)] = "SDLK_LSHIFT",
    [SDLK_LALT&(SDLK_SCANCODE_MASK-1)] = "SDLK_LALT",
    [SDLK_LGUI&(SDLK_SCANCODE_MASK-1)] = "SDLK_LGUI",
    [SDLK_RCTRL&(SDLK_SCANCODE_MASK-1)] = "SDLK_RCTRL",
    [SDLK_RSHIFT&(SDLK_SCANCODE_MASK-1)] = "SDLK_RSHIFT",
    [SDLK_RALT&(SDLK_SCANCODE_MASK-1)] = "SDLK_RALT",
    [SDLK_RGUI&(SDLK_SCANCODE_MASK-1)] = "SDLK_RGUI",
    [SDLK_MODE&(SDLK_SCANCODE_MASK-1)] = "SDLK_MODE",
    [SDLK_AUDIONEXT&(SDLK_SCANCODE_MASK-1)] = "SDLK_AUDIONEXT",
    [SDLK_AUDIOPREV&(SDLK_SCANCODE_MASK-1)] = "SDLK_AUDIOPREV",
    [SDLK_AUDIOSTOP&(SDLK_SCANCODE_MASK-1)] = "SDLK_AUDIOSTOP",
    [SDLK_AUDIOPLAY&(SDLK_SCANCODE_MASK-1)] = "SDLK_AUDIOPLAY",
    [SDLK_AUDIOMUTE&(SDLK_SCANCODE_MASK-1)] = "SDLK_AUDIOMUTE",
    [SDLK_MEDIASELECT&(SDLK_SCANCODE_MASK-1)] = "SDLK_MEDIASELECT",
    [SDLK_WWW&(SDLK_SCANCODE_MASK-1)] = "SDLK_WWW",
    [SDLK_MAIL&(SDLK_SCANCODE_MASK-1)] = "SDLK_MAIL",
    [SDLK_CALCULATOR&(SDLK_SCANCODE_MASK-1)] = "SDLK_CALCULATOR",
    [SDLK_COMPUTER&(SDLK_SCANCODE_MASK-1)] = "SDLK_COMPUTER",
    [SDLK_AC_SEARCH&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_SEARCH",
    [SDLK_AC_HOME&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_HOME",
    [SDLK_AC_BACK&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_BACK",
    [SDLK_AC_FORWARD&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_FORWARD",
    [SDLK_AC_STOP&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_STOP",
    [SDLK_AC_REFRESH&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_REFRESH",
    [SDLK_AC_BOOKMARKS&(SDLK_SCANCODE_MASK-1)] = "SDLK_AC_BOOKMARKS",
    [SDLK_BRIGHTNESSDOWN&(SDLK_SCANCODE_MASK-1)] = "SDLK_BRIGHTNESSDOWN",
    [SDLK_BRIGHTNESSUP&(SDLK_SCANCODE_MASK-1)] = "SDLK_BRIGHTNESSUP",
    [SDLK_DISPLAYSWITCH&(SDLK_SCANCODE_MASK-1)] = "SDLK_DISPLAYSWITCH",
    [SDLK_KBDILLUMTOGGLE&(SDLK_SCANCODE_MASK-1)] = "SDLK_KBDILLUMTOGGLE",
    [SDLK_KBDILLUMDOWN&(SDLK_SCANCODE_MASK-1)] = "SDLK_KBDILLUMDOWN",
    [SDLK_KBDILLUMUP&(SDLK_SCANCODE_MASK-1)] = "SDLK_KBDILLUMUP",
    [SDLK_EJECT&(SDLK_SCANCODE_MASK-1)] = "SDLK_EJECT",
    [SDLK_SLEEP&(SDLK_SCANCODE_MASK-1)] = "SDLK_SLEEP",
};
