Skip to content

Instantly share code, notes, and snippets.

@max-m
Last active May 19, 2024 21:09
Show Gist options
  • Save max-m/452a6ade6473b1deaf079c4f78741aaf to your computer and use it in GitHub Desktop.
Save max-m/452a6ade6473b1deaf079c4f78741aaf to your computer and use it in GitHub Desktop.
/**
* See:
* - https://w3c.github.io/uievents-code/#key-code-attribute-value
* - https://github.com/libsdl-org/SDL/blob/4d32f66fe7a1946384b062cea87f520b75139536/src/video/emscripten/SDL_emscriptenevents.c
* - https://chromium.googlesource.com/external/github.com/kripken/emscripten/+/1.38.0/tools/create_dom_pk_codes.py
* - https://wiki.libsdl.org/SDL2/SDL_ScancodeAndKeycode
*/
function sdl_scancode_to_keyboard_event_code(scancode: number) {
// prettier-ignore
switch (scancode) {
case 0x000: return "" /* SDL_SCANCODE_UNKNOWN */
case 0x004: return "KeyA" /* SDL_SCANCODE_A */
case 0x005: return "KeyB" /* SDL_SCANCODE_B */
case 0x006: return "KeyC" /* SDL_SCANCODE_C */
case 0x007: return "KeyD" /* SDL_SCANCODE_D */
case 0x008: return "KeyE" /* SDL_SCANCODE_E */
case 0x009: return "KeyF" /* SDL_SCANCODE_F */
case 0x00A: return "KeyG" /* SDL_SCANCODE_G */
case 0x00B: return "KeyH" /* SDL_SCANCODE_H */
case 0x00C: return "KeyI" /* SDL_SCANCODE_I */
case 0x00D: return "KeyJ" /* SDL_SCANCODE_J */
case 0x00E: return "KeyK" /* SDL_SCANCODE_K */
case 0x00F: return "KeyL" /* SDL_SCANCODE_L */
case 0x010: return "KeyM" /* SDL_SCANCODE_M */
case 0x011: return "KeyN" /* SDL_SCANCODE_N */
case 0x012: return "KeyO" /* SDL_SCANCODE_O */
case 0x013: return "KeyP" /* SDL_SCANCODE_P */
case 0x014: return "KeyQ" /* SDL_SCANCODE_Q */
case 0x015: return "KeyR" /* SDL_SCANCODE_R */
case 0x016: return "KeyS" /* SDL_SCANCODE_S */
case 0x017: return "KeyT" /* SDL_SCANCODE_T */
case 0x018: return "KeyU" /* SDL_SCANCODE_U */
case 0x019: return "KeyV" /* SDL_SCANCODE_V */
case 0x01A: return "KeyW" /* SDL_SCANCODE_W */
case 0x01B: return "KeyX" /* SDL_SCANCODE_X */
case 0x01C: return "KeyY" /* SDL_SCANCODE_Y */
case 0x01D: return "KeyZ" /* SDL_SCANCODE_Z */
case 0x01E: return "Digit1" /* SDL_SCANCODE_1 */
case 0x01F: return "Digit2" /* SDL_SCANCODE_2 */
case 0x020: return "Digit3" /* SDL_SCANCODE_3 */
case 0x021: return "Digit4" /* SDL_SCANCODE_4 */
case 0x022: return "Digit5" /* SDL_SCANCODE_5 */
case 0x023: return "Digit6" /* SDL_SCANCODE_6 */
case 0x024: return "Digit7" /* SDL_SCANCODE_7 */
case 0x025: return "Digit8" /* SDL_SCANCODE_8 */
case 0x026: return "Digit9" /* SDL_SCANCODE_9 */
case 0x027: return "Digit0" /* SDL_SCANCODE_0 */
case 0x028: return "Enter" /* SDL_SCANCODE_RETURN */
case 0x029: return "Escape" /* SDL_SCANCODE_ESCAPE */
case 0x02A: return "Backspace" /* SDL_SCANCODE_BACKSPACE */
case 0x02B: return "Tab" /* SDL_SCANCODE_TAB */
case 0x02C: return "Space" /* SDL_SCANCODE_SPACE */
case 0x02D: return "Minus" /* SDL_SCANCODE_MINUS */
case 0x02E: return "Equal" /* SDL_SCANCODE_EQUALS */
case 0x02F: return "BracketLeft" /* SDL_SCANCODE_LEFTBRACKET */
case 0x030: return "BracketRight" /* SDL_SCANCODE_RIGHTBRACKET */
case 0x031: return "Backslash" /* SDL_SCANCODE_BACKSLASH */
case 0x032: return "Backslash" /* SDL_SCANCODE_NONUSHASH */
case 0x033: return "Semicolon" /* SDL_SCANCODE_SEMICOLON */
case 0x034: return "Quote" /* SDL_SCANCODE_APOSTROPHE */
case 0x035: return "Backquote" /* SDL_SCANCODE_GRAVE */
case 0x036: return "Comma" /* SDL_SCANCODE_COMMA */
case 0x037: return "Period" /* SDL_SCANCODE_PERIOD */
case 0x038: return "Slash" /* SDL_SCANCODE_SLASH */
case 0x039: return "CapsLock" /* SDL_SCANCODE_CAPSLOCK */
case 0x03A: return "F1" /* SDL_SCANCODE_F1 */
case 0x03B: return "F2" /* SDL_SCANCODE_F2 */
case 0x03C: return "F3" /* SDL_SCANCODE_F3 */
case 0x03D: return "F4" /* SDL_SCANCODE_F4 */
case 0x03E: return "F5" /* SDL_SCANCODE_F5 */
case 0x03F: return "F6" /* SDL_SCANCODE_F6 */
case 0x040: return "F7" /* SDL_SCANCODE_F7 */
case 0x041: return "F8" /* SDL_SCANCODE_F8 */
case 0x042: return "F9" /* SDL_SCANCODE_F9 */
case 0x043: return "F10" /* SDL_SCANCODE_F10 */
case 0x044: return "F11" /* SDL_SCANCODE_F11 */
case 0x045: return "F12" /* SDL_SCANCODE_F12 */
case 0x046: return "PrintScreen" /* SDL_SCANCODE_PRINTSCREEN */
case 0x047: return "ScrollLock" /* SDL_SCANCODE_SCROLLLOCK */
case 0x048: return "Pause" /* SDL_SCANCODE_PAUSE */
case 0x049: return "Insert" /* SDL_SCANCODE_INSERT */
case 0x04A: return "Home" /* SDL_SCANCODE_HOME */
case 0x04B: return "PageUp" /* SDL_SCANCODE_PAGEUP */
case 0x04C: return "Delete" /* SDL_SCANCODE_DELETE */
case 0x04D: return "End" /* SDL_SCANCODE_END */
case 0x04E: return "PageDown" /* SDL_SCANCODE_PAGEDOWN */
case 0x04F: return "ArrowRight" /* SDL_SCANCODE_RIGHT */
case 0x050: return "ArrowLeft" /* SDL_SCANCODE_LEFT */
case 0x051: return "ArrowDown" /* SDL_SCANCODE_DOWN */
case 0x052: return "ArrowUp" /* SDL_SCANCODE_UP */
case 0x053: return "NumLock" /* SDL_SCANCODE_NUMLOCKCLEAR */
case 0x054: return "NumpadDivide" /* SDL_SCANCODE_KP_DIVIDE */
case 0x055: return "NumpadMultiply" /* SDL_SCANCODE_KP_MULTIPLY */
case 0x056: return "NumpadSubtract" /* SDL_SCANCODE_KP_MINUS */
case 0x057: return "NumpadAdd" /* SDL_SCANCODE_KP_PLUS */
case 0x058: return "NumpadEnter" /* SDL_SCANCODE_KP_ENTER */
case 0x059: return "Numpad1" /* SDL_SCANCODE_KP_1 */
case 0x05A: return "Numpad2" /* SDL_SCANCODE_KP_2 */
case 0x05B: return "Numpad3" /* SDL_SCANCODE_KP_3 */
case 0x05C: return "Numpad4" /* SDL_SCANCODE_KP_4 */
case 0x05D: return "Numpad5" /* SDL_SCANCODE_KP_5 */
case 0x05E: return "Numpad6" /* SDL_SCANCODE_KP_6 */
case 0x05F: return "Numpad7" /* SDL_SCANCODE_KP_7 */
case 0x060: return "Numpad8" /* SDL_SCANCODE_KP_8 */
case 0x061: return "Numpad9" /* SDL_SCANCODE_KP_9 */
case 0x062: return "Numpad0" /* SDL_SCANCODE_KP_0 */
case 0x063: return "NumpadDecimal" /* SDL_SCANCODE_KP_PERIOD */
case 0x064: return "IntlBackslash" /* SDL_SCANCODE_NONUSBACKSLASH */
case 0x065: return "ContextMenu" /* SDL_SCANCODE_APPLICATION */
case 0x066: return "Power" /* SDL_SCANCODE_POWER */
case 0x067: return "NumpadEqual" /* SDL_SCANCODE_KP_EQUALS */
case 0x068: return "F13" /* SDL_SCANCODE_F13 */
case 0x069: return "F14" /* SDL_SCANCODE_F14 */
case 0x06A: return "F15" /* SDL_SCANCODE_F15 */
case 0x06B: return "F16" /* SDL_SCANCODE_F16 */
case 0x06C: return "F17" /* SDL_SCANCODE_F17 */
case 0x06D: return "F18" /* SDL_SCANCODE_F18 */
case 0x06E: return "F19" /* SDL_SCANCODE_F19 */
case 0x06F: return "F20" /* SDL_SCANCODE_F20 */
case 0x070: return "F21" /* SDL_SCANCODE_F21 */
case 0x071: return "F22" /* SDL_SCANCODE_F22 */
case 0x072: return "F23" /* SDL_SCANCODE_F23 */
case 0x073: return "F24" /* SDL_SCANCODE_F24 */
case 0x074: return "" /* SDL_SCANCODE_EXECUTE */
case 0x075: return "Help" /* SDL_SCANCODE_HELP */
case 0x076: return "" /* SDL_SCANCODE_MENU */
case 0x077: return "Select" /* SDL_SCANCODE_SELECT */
case 0x078: return "" /* SDL_SCANCODE_STOP */
case 0x079: return "Again" /* SDL_SCANCODE_AGAIN */
case 0x07A: return "Undo" /* SDL_SCANCODE_UNDO */
case 0x07B: return "Cut" /* SDL_SCANCODE_CUT */
case 0x07C: return "Copy" /* SDL_SCANCODE_COPY */
case 0x07D: return "Paste" /* SDL_SCANCODE_PASTE */
case 0x07E: return "Find" /* SDL_SCANCODE_FIND */
case 0x07F: return "AudioVolumeMute" /* SDL_SCANCODE_MUTE */
case 0x080: return "AudioVolumeUp" /* SDL_SCANCODE_VOLUMEUP */
case 0x081: return "AudioVolumeDown" /* SDL_SCANCODE_VOLUMEDOWN */
case 0x085: return "NumpadComma" /* SDL_SCANCODE_KP_COMMA */
case 0x086: return "" /* SDL_SCANCODE_KP_EQUALSAS400 */
case 0x087: return "IntlRo" /* SDL_SCANCODE_INTERNATIONAL1 */
case 0x088: return "KanaMode" /* SDL_SCANCODE_INTERNATIONAL2 */
case 0x089: return "IntlYen" /* SDL_SCANCODE_INTERNATIONAL3 */
case 0x08A: return "Convert" /* SDL_SCANCODE_INTERNATIONAL4 */
case 0x08B: return "NonConvert" /* SDL_SCANCODE_INTERNATIONAL5 */
case 0x08C: return "" /* SDL_SCANCODE_INTERNATIONAL6 */
case 0x08D: return "" /* SDL_SCANCODE_INTERNATIONAL7 */
case 0x08E: return "" /* SDL_SCANCODE_INTERNATIONAL8 */
case 0x08F: return "" /* SDL_SCANCODE_INTERNATIONAL9 */
case 0x090: return "Lang1" /* SDL_SCANCODE_LANG1 */
case 0x091: return "Lang2" /* SDL_SCANCODE_LANG2 */
case 0x092: return "Lang3" /* SDL_SCANCODE_LANG3 */
case 0x093: return "Lang4" /* SDL_SCANCODE_LANG4 */
case 0x094: return "Lang5" /* SDL_SCANCODE_LANG5 */
case 0x095: return "Lang6" /* SDL_SCANCODE_LANG6 */
case 0x096: return "Lang7" /* SDL_SCANCODE_LANG7 */
case 0x097: return "Lang8" /* SDL_SCANCODE_LANG8 */
case 0x098: return "Lang9" /* SDL_SCANCODE_LANG9 */
case 0x099: return "" /* SDL_SCANCODE_ALTERASE */
case 0x09A: return "" /* SDL_SCANCODE_SYSREQ */
case 0x09B: return "" /* SDL_SCANCODE_CANCEL */
case 0x09C: return "" /* SDL_SCANCODE_CLEAR */
case 0x09D: return "" /* SDL_SCANCODE_PRIOR */
case 0x09E: return "Enter" /* SDL_SCANCODE_RETURN2 */
case 0x09F: return "" /* SDL_SCANCODE_SEPARATOR */
case 0x0A0: return "" /* SDL_SCANCODE_OUT */
case 0x0A1: return "" /* SDL_SCANCODE_OPER */
case 0x0A2: return "" /* SDL_SCANCODE_CLEARAGAIN */
case 0x0A3: return "" /* SDL_SCANCODE_CRSEL */
case 0x0A4: return "" /* SDL_SCANCODE_EXSEL */
case 0x0B0: return "" /* SDL_SCANCODE_KP_00 */
case 0x0B1: return "" /* SDL_SCANCODE_KP_000 */
case 0x0B2: return "NumpadComma" /* SDL_SCANCODE_THOUSANDSSEPARATOR */
case 0x0B3: return "NumpadDecimal" /* SDL_SCANCODE_DECIMALSEPARATOR */
case 0x0B4: return "" /* SDL_SCANCODE_CURRENCYUNIT */
case 0x0B5: return "" /* SDL_SCANCODE_CURRENCYSUBUNIT */
case 0x0B6: return "NumpadParenLeft" /* SDL_SCANCODE_KP_LEFTPAREN */
case 0x0B7: return "NumpadParenRight" /* SDL_SCANCODE_KP_RIGHTPAREN */
case 0x0B8: return "" /* SDL_SCANCODE_KP_LEFTBRACE */
case 0x0B9: return "" /* SDL_SCANCODE_KP_RIGHTBRACE */
case 0x0BA: return "" /* SDL_SCANCODE_KP_TAB */
case 0x0BB: return "NumpadBackspace" /* SDL_SCANCODE_KP_BACKSPACE */
case 0x0BC: return "" /* SDL_SCANCODE_KP_A */
case 0x0BD: return "" /* SDL_SCANCODE_KP_B */
case 0x0BE: return "" /* SDL_SCANCODE_KP_C */
case 0x0BF: return "" /* SDL_SCANCODE_KP_D */
case 0x0C0: return "" /* SDL_SCANCODE_KP_E */
case 0x0C1: return "" /* SDL_SCANCODE_KP_F */
case 0x0C2: return "" /* SDL_SCANCODE_KP_XOR */
case 0x0C3: return "" /* SDL_SCANCODE_KP_POWER */
case 0x0C4: return "" /* SDL_SCANCODE_KP_PERCENT */
case 0x0C5: return "" /* SDL_SCANCODE_KP_LESS */
case 0x0C6: return "" /* SDL_SCANCODE_KP_GREATER */
case 0x0C7: return "" /* SDL_SCANCODE_KP_AMPERSAND */
case 0x0C8: return "" /* SDL_SCANCODE_KP_DBLAMPERSAND */
case 0x0C9: return "" /* SDL_SCANCODE_KP_VERTICALBAR */
case 0x0CA: return "" /* SDL_SCANCODE_KP_DBLVERTICALBAR */
case 0x0CB: return "" /* SDL_SCANCODE_KP_COLON */
case 0x0CC: return "NumpadHash" /* SDL_SCANCODE_KP_HASH */
case 0x0CD: return "" /* SDL_SCANCODE_KP_SPACE */
case 0x0CE: return "" /* SDL_SCANCODE_KP_AT */
case 0x0CF: return "" /* SDL_SCANCODE_KP_EXCLAM */
case 0x0D0: return "NumpadMemoryStore" /* SDL_SCANCODE_KP_MEMSTORE */
case 0x0D1: return "NumpadMemoryRecall" /* SDL_SCANCODE_KP_MEMRECALL */
case 0x0D2: return "NumpadMemoryClear" /* SDL_SCANCODE_KP_MEMCLEAR */
case 0x0D3: return "NumpadMemoryAdd" /* SDL_SCANCODE_KP_MEMADD */
case 0x0D4: return "NumpadMemorySubtract" /* SDL_SCANCODE_KP_MEMSUBTRACT */
case 0x0D5: return "" /* SDL_SCANCODE_KP_MEMMULTIPLY */
case 0x0D6: return "" /* SDL_SCANCODE_KP_MEMDIVIDE */
case 0x0D7: return "" /* SDL_SCANCODE_KP_PLUSMINUS */
case 0x0D8: return "" /* SDL_SCANCODE_KP_CLEAR */
case 0x0D9: return "NumpadClearEntry" /* SDL_SCANCODE_KP_CLEARENTRY */
case 0x0DA: return "" /* SDL_SCANCODE_KP_BINARY */
case 0x0DB: return "" /* SDL_SCANCODE_KP_OCTAL */
case 0x0DC: return "" /* SDL_SCANCODE_KP_DECIMAL */
case 0x0DD: return "" /* SDL_SCANCODE_KP_HEXADECIMAL */
case 0x0E0: return "ControlLeft" /* SDL_SCANCODE_LCTRL */
case 0x0E1: return "ShiftLeft" /* SDL_SCANCODE_LSHIFT */
case 0x0E2: return "AltLeft" /* SDL_SCANCODE_LALT */
case 0x0E3: return "MetaLeft" /* SDL_SCANCODE_LGUI */
case 0x0E4: return "ControlRight" /* SDL_SCANCODE_RCTRL */
case 0x0E5: return "ShiftRight" /* SDL_SCANCODE_RSHIFT */
case 0x0E6: return "AltRight" /* SDL_SCANCODE_RALT */
case 0x0E7: return "MetaRight" /* SDL_SCANCODE_RGUI */
case 0x101: return "" /* SDL_SCANCODE_MODE */
case 0x102: return "MediaTrackNext" /* SDL_SCANCODE_AUDIONEXT */
case 0x103: return "MediaTrackPrevious" /* SDL_SCANCODE_AUDIOPREV */
case 0x104: return "MediaStop" /* SDL_SCANCODE_AUDIOSTOP */
case 0x105: return "MediaPlayPause" /* SDL_SCANCODE_AUDIOPLAY */
case 0x106: return "AudioVolumeMute" /* SDL_SCANCODE_AUDIOMUTE */
case 0x107: return "MediaSelect" /* SDL_SCANCODE_MEDIASELECT */
case 0x108: return "" /* SDL_SCANCODE_WWW */
case 0x109: return "LaunchMail" /* SDL_SCANCODE_MAIL */
case 0x10A: return "LaunchApp2" /* SDL_SCANCODE_CALCULATOR */
case 0x10B: return "LaunchApp1" /* SDL_SCANCODE_COMPUTER */
case 0x10C: return "" /* SDL_SCANCODE_AC_SEARCH */
case 0x10D: return "" /* SDL_SCANCODE_AC_HOME */
case 0x10E: return "" /* SDL_SCANCODE_AC_BACK */
case 0x10F: return "" /* SDL_SCANCODE_AC_FORWARD */
case 0x110: return "" /* SDL_SCANCODE_AC_STOP */
case 0x111: return "" /* SDL_SCANCODE_AC_REFRESH */
case 0x112: return "" /* SDL_SCANCODE_AC_BOOKMARKS */
case 0x113: return "" /* SDL_SCANCODE_BRIGHTNESSDOWN */
case 0x114: return "" /* SDL_SCANCODE_BRIGHTNESSUP */
case 0x115: return "" /* SDL_SCANCODE_DISPLAYSWITCH */
case 0x116: return "" /* SDL_SCANCODE_KBDILLUMTOGGLE */
case 0x117: return "" /* SDL_SCANCODE_KBDILLUMDOWN */
case 0x118: return "" /* SDL_SCANCODE_KBDILLUMUP */
case 0x119: return "Eject" /* SDL_SCANCODE_EJECT */
case 0x11A: return "Sleep" /* SDL_SCANCODE_SLEEP */
case 0x11B: return "LaunchApp1" /* SDL_SCANCODE_APP1 */
case 0x11C: return "LaunchApp2" /* SDL_SCANCODE_APP2 */
}
return "";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment