SDL_Keycode(3type)
π SDL_Keycode β it's giving SDL3 DATATYPES, bestie π
okay so welcome to the SDL_Keycode page, part one of four, and yes we're starting with the basics because that's how we do. this is a 3type page from the SDL3 DATATYPES collection. iykyk. π
β¨ NAME β¨
SDL_Keycode β the SDL virtual key representation. that's it, that's the whole vibe. it's how SDL talks about keys. π
πΈ SYNOPSIS πΈ
first things first, you gotta pull in the header or nothing works, fr fr:
#include <SDL3/SDL_keycode.h>
and then boom, here's the actual type, no cap:
typedef Uint32 SDL_Keycode;
so SDL_Keycode is literally just a Uint32 wearing a little name tag. unsigned 32-bit integer, that's the whole thing. not me getting emotional over a typedef. π
okay that's the setup, the rest of the pages are coming so don't go anywhere bestie π
Like okay, bestie, we're back and we are knee deep in keycode sauce now π β¨ This is the part where the actual values show up, and yes, every single one matters, so buckle in. π«Ά
First up, the two masks and the macro that glues scancodes into keycodes. These are the β¨ infrastructure β¨, the scaffolding, the bones of the whole thing:
#define SDLK_EXTENDED_MASK (1u << 29)
#define SDLK_SCANCODE_MASK (1u << 30)
#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK)
No cap, that last one is doing so much heavy lifting. SDL_SCANCODE_TO_KEYCODE(X) takes a scancode X and ORs it with SDLK_SCANCODE_MASK, and that's the whole vibe of how scancode-based keycodes get built. π
Then we hit the control crew. The ones you literally cannot live without:
#define SDLK_UNKNOWN 0x00000000u /**< 0 */
#define SDLK_RETURN 0x0000000du /**< '\r' */
#define SDLK_ESCAPE 0x0000001bu /**< '\x1B' */
#define SDLK_BACKSPACE 0x00000008u /**< '\b' */
#define SDLK_TAB 0x00000009u /**< '\t' */
#define SDLK_SPACE 0x00000020u /**< ' ' */
SDLK_UNKNOWN is the "idk her" of keycodes at 0x00000000u, and look at those little comments β each one tells you the character it maps to. '\r', '\x1B', '\b', '\t', ' '. Chef's kiss. π
Now the punctuation era begins and honestly it's giving keyboard asmr:
#define SDLK_EXCLAIM 0x00000021u /**< '!' */
#define SDLK_DBLAPOSTROPHE 0x00000022u /**< '"' */
#define SDLK_HASH 0x00000023u /**< '#' */
#define SDLK_DOLLAR 0x00000024u /**< '$' */
#define SDLK_PERCENT 0x00000025u /**< '%' */
#define SDLK_AMPERSAND 0x00000026u /**< '&' */
#define SDLK_APOSTROPHE 0x00000027u /**< '\'' */
#define SDLK_LEFTPAREN 0x00000028u /**< '(' */
#define SDLK_RIGHTPAREN 0x00000029u /**< ')' */
#define SDLK_ASTERISK 0x0000002au /**< '*' */
#define SDLK_PLUS 0x0000002bu /**< '+' */
#define SDLK_COMMA 0x0000002cu /**< ',' */
#define SDLK_MINUS 0x0000002du /**< '-' */
#define SDLK_PERIOD 0x0000002eu /**< '.' */
#define SDLK_SLASH 0x0000002fu /**< '/' */
Notice SDLK_DBLAPOSTROPHE is the double-quote girly at 0x00000022u while plain SDLK_APOSTROPHE is 0x00000027u β and yes the comment for that one is '\'' because escaping quotes is a lifestyle. π
Digits next, and they are so orderly it's actually soothing:
#define SDLK_0 0x00000030u /**< '0' */
#define SDLK_1 0x00000031u /**< '1' */
#define SDLK_2 0x00000032u /**< '2' */
#define SDLK_3 0x00000033u /**< '3' */
#define SDLK_4 0x00000034u /**< '4' */
#define SDLK_5 0x00000035u /**< '5' */
#define SDLK_6 0x00000036u /**< '6' */
#define SDLK_7 0x00000037u /**< '7' */
#define SDLK_8 0x00000038u /**< '8' */
#define SDLK_9 0x00000039u /**< '9' */
SDLK_0 through SDLK_9, 0x00000030u through 0x00000039u. Straight up marching in a line. π₯
More symbols, we stay winning:
#define SDLK_COLON 0x0000003au /**< ':' */
#define SDLK_SEMICOLON 0x0000003bu /**< ';' */
#define SDLK_LESS 0x0000003cu /**< '<' */
#define SDLK_EQUALS 0x0000003du /**< '=' */
#define SDLK_GREATER 0x0000003eu /**< '>' */
#define SDLK_QUESTION 0x0000003fu /**< '?' */
#define SDLK_AT 0x00000040u /**< '@' */
#define SDLK_LEFTBRACKET 0x0000005bu /**< '[' */
#define SDLK_BACKSLASH 0x0000005cu /**< '\\' */
#define SDLK_RIGHTBRACKET 0x0000005du /**< ']' */
#define SDLK_CARET 0x0000005eu /**< '^' */
#define SDLK_UNDERSCORE 0x0000005fu /**< '_' */
#define SDLK_GRAVE 0x00000060u /**< '`' */
Look at SDLK_BACKSLASH rocking the '\\' comment β double-escaped, unbothered, iconic. And SDLK_GRAVE is your backtick bestie at 0x00000060u. π¦
The alphabet, all lowercase in the comment, all present and accounted for:
#define SDLK_A 0x00000061u /**< 'a' */
#define SDLK_B 0x00000062u /**< 'b' */
#define SDLK_C 0x00000063u /**< 'c' */
#define SDLK_D 0x00000064u /**< 'd' */
#define SDLK_E 0x00000065u /**< 'e' */
#define SDLK_F 0x00000066u /**< 'f' */
#define SDLK_G 0x00000067u /**< 'g' */
#define SDLK_H 0x00000068u /**< 'h' */
#define SDLK_I 0x00000069u /**< 'i' */
#define SDLK_J 0x0000006au /**< 'j' */
#define SDLK_K 0x0000006bu /**< 'k' */
#define SDLK_L 0x0000006cu /**< 'l' */
#define SDLK_M 0x0000006du /**< 'm' */
#define SDLK_N 0x0000006eu /**< 'n' */
#define SDLK_O 0x0000006fu /**< 'o' */
#define SDLK_P 0x00000070u /**< 'p' */
#define SDLK_Q 0x00000071u /**< 'q' */
#define SDLK_R 0x00000072u /**< 'r' */
#define SDLK_S 0x00000073u /**< 's' */
#define SDLK_T 0x00000074u /**< 't' */
#define SDLK_U 0x00000075u /**< 'u' */
#define SDLK_V 0x00000076u /**< 'v' */
#define SDLK_W 0x00000077u /**< 'w' */
#define SDLK_X 0x00000078u /**< 'x' */
#define SDLK_Y 0x00000079u /**< 'y' */
#define SDLK_Z 0x0000007au /**< 'z' */
SDLK_A at 0x00000061u all the way to SDLK_Z at 0x0000007au. So satisfying. π
Wrapping up the plain-ASCII crowd with the brackets, braces, and the delete:
#define SDLK_LEFTBRACE 0x0000007bu /**< '{' */
#define SDLK_PIPE 0x0000007cu /**< '|' */
#define SDLK_RIGHTBRACE 0x0000007du /**< '}' */
#define SDLK_TILDE 0x0000007eu /**< '~' */
#define SDLK_DELETE 0x0000007fu /**< '\x7F' */
#define SDLK_PLUSMINUS 0x000000b1u /**< '\xB1' */
SDLK_PLUSMINUS is the little outlier bestie at 0x000000b1u with the comment '\xB1', and SDLK_DELETE is 0x0000007fu with '\x7F'. Both vibing in hex. π
And NOW. The main event. The extended keys, where the scancode macro really shows out. Every single one of these has a comment that is literally SDL_SCANCODE_TO_KEYCODE(...), so you can see exactly which scancode it's built from:
#define SDLK_CAPSLOCK 0x40000039u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */
#define SDLK_F1 0x4000003au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */
#define SDLK_F2 0x4000003bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */
#define SDLK_F3 0x4000003cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */
#define SDLK_F4 0x4000003du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */
#define SDLK_F5 0x4000003eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */
#define SDLK_F6 0x4000003fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */
#define SDLK_F7 0x40000040u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */
#define SDLK_F8 0x40000041u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */
#define SDLK_F9 0x40000042u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */
#define SDLK_F10 0x40000043u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */
#define SDLK_F11 0x40000044u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */
#define SDLK_F12 0x40000045u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */
#define SDLK_PRINTSCREEN 0x40000046u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */
#define SDLK_SCROLLLOCK 0x40000047u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */
#define SDLK_PAUSE 0x40000048u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */
#define SDLK_INSERT 0x40000049u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */
#define SDLK_HOME 0x4000004au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */
#define SDLK_PAGEUP 0x4000004bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */
#define SDLK_END 0x4000004du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */
#define SDLK_PAGEDOWN 0x4000004eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */
#define SDLK_RIGHT 0x4000004fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */
#define SDLK_LEFT 0x40000050u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */
#define SDLK_DOWN 0x40000051u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */
#define SDLK_UP 0x40000052u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */
#define SDLK_NUMLOCKCLEAR 0x40000053u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */
#define SDLK_KP_DIVIDE 0x40000054u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */
#define SDLK_KP_MULTIPLY 0x40000055u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */
#define SDLK_KP_MINUS 0x40000056u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */
#define SDLK_KP_PLUS 0x40000057u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */
#define SDLK_KP_ENTER 0x40000058u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */
#define SDLK_KP_1 0x40000059u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */
#define SDLK_KP_2 0x4000005au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */
#define SDLK_KP_3 0x4000005bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */
#define SDLK_KP_4 0x4000005cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */
#define SDLK_KP_5 0x4000005du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */
#define SDLK_KP_6 0x4000005eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */
#define SDLK_KP_7 0x4000005fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */
#define SDLK_KP_8 0x40000060u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */
#define SDLK_KP_9 0x40000061u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */
#define SDLK_KP_0 0x40000062u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */
#define SDLK_KP_PERIOD 0x40000063u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */
#define SDLK_APPLICATION 0x40000065u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */
#define SDLK_POWER 0x40000066u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */
#define SDLK_KP_EQUALS 0x40000067u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */
#define SDLK_F13 0x40000068u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */
#define SDLK_F14 0x40000069u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */
#define SDLK_F15 0x4000006au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */
#define SDLK_F16 0x4000006bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */
#define SDLK_F17 0x4000006cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */
#define SDLK_F18 0x4000006du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */
#define SDLK_F19 0x4000006eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */
#define SDLK_F20 0x4000006fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */
#define SDLK_F21 0x40000070u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */
#define SDLK_F22 0x40000071u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */
#define SDLK_F23 0x40000072u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */
#define SDLK_F24 0x40000073u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */
#define SDLK_EXECUTE 0x40000074u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */
#define SDLK_HELP 0x40000075u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */
#define SDLK_MENU 0x40000076u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */
#define SDLK_SELECT 0x40000077u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */
#define SDLK_STOP 0x40000078u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */
See how they all start with 0x400000? That's SDLK_SCANCODE_MASK doing its thing, bestie β every scancode-based keycode has that high bit set. π The function keys SDLK_F1 through SDLK_F24, the whole keypad situation with SDLK_KP_DIVIDE, SDLK_KP_MULTIPLY, SDLK_KP_MINUS, SDLK_KP_PLUS, SDLK_KP_ENTER, SDLK_KP_1 through SDLK_KP_9, SDLK_KP_0, SDLK_KP_PERIOD, SDLK_KP_EQUALS, the nav cluster with SDLK_INSERT, SDLK_HOME, SDLK_PAGEUP, SDLK_END, SDLK_PAGEDOWN, SDLK_RIGHT, SDLK_LEFT, SDLK_DOWN, SDLK_UPβ¦ it's a whole extended family reunion and every cousin showed up. π
And we're still going, because there is more after SDLK_STOP β so don't go anywhere. πΈ
okay bestie, the roll call keeps going π
we're deep in the #define pile now, so hydrate and keep scrolling π
SDLK_AGAINβ0x40000079u, and the little note next to it saysSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN)πSDLK_UNDOβ0x4000007au, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO)SDLK_CUTβ0x4000007bu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT)SDLK_COPYβ0x4000007cu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY)SDLK_PASTEβ0x4000007du, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE)SDLK_FINDβ0x4000007eu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND)πSDLK_MUTEβ0x4000007fu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE)SDLK_VOLUMEUPβ0x40000080u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP)SDLK_VOLUMEDOWNβ0x40000081u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN)SDLK_KP_COMMAβ0x40000085u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA)SDLK_KP_EQUALSAS400β0x40000086u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400)β¨
and now we enter the absolute lore section, no cap π
SDLK_ALTERASEβ0x40000099u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE)SDLK_SYSREQβ0x4000009au, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ)SDLK_CANCELβ0x4000009bu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL)SDLK_CLEARβ0x4000009cu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR)SDLK_PRIORβ0x4000009du, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR)SDLK_RETURN2β0x4000009eu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2)πSDLK_SEPARATORβ0x4000009fu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR)SDLK_OUTβ0x400000a0u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT)SDLK_OPERβ0x400000a1u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER)SDLK_CLEARAGAINβ0x400000a2u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN)SDLK_CRSELβ0x400000a3u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL)SDLK_EXSELβ0x400000a4u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL)SDLK_FRONTβ0x400000a5u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FRONT)π
the keypad era begins and it is long, bestie, buckle up π
SDLK_KP_00β0x400000b0u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00)SDLK_KP_000β0x400000b1u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000)SDLK_THOUSANDSSEPARATORβ0x400000b2u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR)SDLK_DECIMALSEPARATORβ0x400000b3u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR)SDLK_CURRENCYUNITβ0x400000b4u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT)πΈSDLK_CURRENCYSUBUNITβ0x400000b5u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT)SDLK_KP_LEFTPARENβ0x400000b6u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN)SDLK_KP_RIGHTPARENβ0x400000b7u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN)SDLK_KP_LEFTBRACEβ0x400000b8u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE)SDLK_KP_RIGHTBRACEβ0x400000b9u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE)SDLK_KP_TABβ0x400000bau, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB)SDLK_KP_BACKSPACEβ0x400000bbu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE)SDLK_KP_Aβ0x400000bcu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A)SDLK_KP_Bβ0x400000bdu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B)SDLK_KP_Cβ0x400000beu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C)SDLK_KP_Dβ0x400000bfu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D)SDLK_KP_Eβ0x400000c0u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E)SDLK_KP_Fβ0x400000c1u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F)π§SDLK_KP_XORβ0x400000c2u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR)SDLK_KP_POWERβ0x400000c3u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER)SDLK_KP_PERCENTβ0x400000c4u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT)SDLK_KP_LESSβ0x400000c5u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS)SDLK_KP_GREATERβ0x400000c6u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER)SDLK_KP_AMPERSANDβ0x400000c7u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND)SDLK_KP_DBLAMPERSANDβ0x400000c8u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND)SDLK_KP_VERTICALBARβ0x400000c9u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR)SDLK_KP_DBLVERTICALBARβ0x400000cau, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR)SDLK_KP_COLONβ0x400000cbu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON)SDLK_KP_HASHβ0x400000ccu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH)SDLK_KP_SPACEβ0x400000cdu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE)SDLK_KP_ATβ0x400000ceu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT)SDLK_KP_EXCLAMβ0x400000cfu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM)βSDLK_KP_MEMSTOREβ0x400000d0u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE)SDLK_KP_MEMRECALLβ0x400000d1u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL)SDLK_KP_MEMCLEARβ0x400000d2u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR)SDLK_KP_MEMADDβ0x400000d3u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD)SDLK_KP_MEMSUBTRACTβ0x400000d4u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT)SDLK_KP_MEMMULTIPLYβ0x400000d5u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY)SDLK_KP_MEMDIVIDEβ0x400000d6u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE)SDLK_KP_PLUSMINUSβ0x400000d7u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS)SDLK_KP_CLEARβ0x400000d8u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR)SDLK_KP_CLEARENTRYβ0x400000d9u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY)SDLK_KP_BINARYβ0x400000dau, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY)SDLK_KP_OCTALβ0x400000dbu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL)SDLK_KP_DECIMALβ0x400000dcu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL)SDLK_KP_HEXADECIMALβ0x400000ddu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL)π
modifier girlies, assemble π
SDLK_LCTRLβ0x400000e0u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL)SDLK_LSHIFTβ0x400000e1u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT)SDLK_LALTβ0x400000e2u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT)SDLK_LGUIβ0x400000e3u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI)SDLK_RCTRLβ0x400000e4u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL)SDLK_RSHIFTβ0x400000e5u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT)SDLK_RALTβ0x400000e6u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT)SDLK_RGUIβ0x400000e7u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI)π
and then the whole media + app-control lineup walks in, main character energy only π¦
SDLK_MODEβ0x40000101u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE)SDLK_SLEEPβ0x40000102u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP)π΄SDLK_WAKEβ0x40000103u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE)SDLK_CHANNEL_INCREMENTβ0x40000104u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT)SDLK_CHANNEL_DECREMENTβ0x40000105u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT)SDLK_MEDIA_PLAYβ0x40000106u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY)βΆοΈSDLK_MEDIA_PAUSEβ0x40000107u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE)SDLK_MEDIA_RECORDβ0x40000108u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD)SDLK_MEDIA_FAST_FORWARDβ0x40000109u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD)SDLK_MEDIA_REWINDβ0x4000010au, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND)SDLK_MEDIA_NEXT_TRACKβ0x4000010bu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK)SDLK_MEDIA_PREVIOUS_TRACKβ0x4000010cu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK)SDLK_MEDIA_STOPβ0x4000010du, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP)SDLK_MEDIA_EJECTβ0x4000010eu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT)SDLK_MEDIA_PLAY_PAUSEβ0x4000010fu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE)SDLK_MEDIA_SELECTβ0x40000110u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT)SDLK_AC_NEWβ0x40000111u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW)SDLK_AC_OPENβ0x40000112u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN)SDLK_AC_CLOSEβ0x40000113u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE)SDLK_AC_EXITβ0x40000114u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT)SDLK_AC_SAVEβ0x40000115u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE)πΎSDLK_AC_PRINTβ0x40000116u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT)SDLK_AC_PROPERTIESβ0x40000117u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES)SDLK_AC_SEARCHβ0x40000118u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH)SDLK_AC_HOMEβ0x40000119u, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME)SDLK_AC_BACKβ0x4000011au, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK)SDLK_AC_FORWARDβ0x4000011bu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD)SDLK_AC_STOPβ0x4000011cu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP)SDLK_AC_REFRESHβ0x4000011du, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH)SDLK_AC_BOOKMARKSβ0x4000011eu, noted asSDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS)β
and bestie, we are so not done yet β keep scrolling, there's more π
#define SDLK_SOFTLEFT 0x4000011fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */
#define SDLK_SOFTRIGHT 0x40000120u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */
#define SDLK_CALL 0x40000121u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */
#define SDLK_ENDCALL 0x40000122u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */
#define SDLK_LEFT_TAB 0x20000001u /**< Extended key Left Tab */
#define SDLK_LEVEL5_SHIFT 0x20000002u /**< Extended key Level 5 Shift */
#define SDLK_MULTI_KEY_COMPOSE 0x20000003u /**< Extended key Multi-key Compose */
#define SDLK_LMETA 0x20000004u /**< Extended key Left Meta */
#define SDLK_RMETA 0x20000005u /**< Extended key Right Meta */
#define SDLK_LHYPER 0x20000006u /**< Extended key Left Hyper */
#define SDLK_RHYPER 0x20000007u /**< Extended key Right Hyper */
π DESCRIPTION π
okay bestie, so values of this type are how you represent keyboard keys β but specifically using whatever layout the keyboard is currently vibing with. πΉβ¨
So a value can be:
- a Unicode value β the actual unmodified character that pressing that key would produce, or
- an
SDLK_*constant, for the keys that are just... not char-producing. no character energy. π
π¨ special exception alert π¨ the number keys at the top of the keyboard map by default toSDLK_0β¦SDLK_9on AZERTY layouts. like, yes, even though you'd lowkey expect otherwise. it's giving intentional. π
Keys with the SDLK_EXTENDED_MASK bit set do not map to a scancode or a Unicode code point. they're just out here doing their own thing. π¦
Many common keycodes are listed below, but this list is not exhaustive. so like, don't come for me if your fave isn't in there bestie, it's not the whole alphabet of keys, it's a highlight reel. β
π AVAILABILITY π
this datatype has been around since SDL 3.2.0. so if you're on something older, it's giving vintage and not in the cute way. π«Ά
π SEE ALSO π
SDL_HINT_KEYCODE_OPTIONS(3)β go read it, iykyk π
and that's the whole page bestie, you ate that π
β¨ this one's straight outta the Simple Directmedia Layer source, landing at version SDL 3.4.18, and yeah the page be calling itself SDL_Keycode(3type) π go forth and keycode responsibly, no cap π¦π
π¦ where this page comes from
- fedora 43: SDL3-devel 3.4.18-1.fc43 Β· Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 OR MIT)
- fedora 43: SDL3-devel 3.4.18-1.fc43 Β· Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 OR MIT)
- fedora 44: SDL3-devel 3.4.18-1.fc44 Β· Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 OR MIT)
- fedora 44: SDL3-devel 3.4.18-1.fc44 Β· Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 OR MIT)
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms