1 /* 2 DSDL 3 Copyright (C) 2025 Inochi2D Project <luna@foxgirls.gay> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 */ 21 22 /** 23 SDL3 Scancodes 24 25 See_Also: 26 $(LINK2 https://wiki.libsdl.org/SDL3/CategoryScancode, SDL3 Scancode Documentation) 27 $(LINK2 https://wiki.libsdl.org/SDL3/BestKeyboardPractices, SDL3 Keyboard Best Practices) 28 29 Copyright: © 2025 Inochi2D Project, © 1997-2025 Sam Lantinga 30 License: Subject to the terms of the Zlib License, as written in the LICENSE file. 31 Authors: 32 Luna Nielsen 33 */ 34 module sdl.scancode; 35 36 extern(C) nothrow @nogc: 37 38 // TODO: Document Scancodes. 39 40 /** 41 The SDL keyboard scancode representation. 42 43 An SDL scancode is the physical representation of a key on the keyboard, 44 independent of language and keyboard mapping. 45 46 Values of this type are used to represent keyboard keys, among other places 47 in the `scancode` field of the $(D SDL_KeyboardEvent) structure. 48 49 Standards: 50 The values in this enumeration are based on the USB usage page standard: 51 $(LINK https://usb.org/sites/default/files/hut1_5.pdf) 52 */ 53 enum SDL_Scancode { 54 SDL_SCANCODE_UNKNOWN = 0, 55 SDL_SCANCODE_A = 4, 56 SDL_SCANCODE_B = 5, 57 SDL_SCANCODE_C = 6, 58 SDL_SCANCODE_D = 7, 59 SDL_SCANCODE_E = 8, 60 SDL_SCANCODE_F = 9, 61 SDL_SCANCODE_G = 10, 62 SDL_SCANCODE_H = 11, 63 SDL_SCANCODE_I = 12, 64 SDL_SCANCODE_J = 13, 65 SDL_SCANCODE_K = 14, 66 SDL_SCANCODE_L = 15, 67 SDL_SCANCODE_M = 16, 68 SDL_SCANCODE_N = 17, 69 SDL_SCANCODE_O = 18, 70 SDL_SCANCODE_P = 19, 71 SDL_SCANCODE_Q = 20, 72 SDL_SCANCODE_R = 21, 73 SDL_SCANCODE_S = 22, 74 SDL_SCANCODE_T = 23, 75 SDL_SCANCODE_U = 24, 76 SDL_SCANCODE_V = 25, 77 SDL_SCANCODE_W = 26, 78 SDL_SCANCODE_X = 27, 79 SDL_SCANCODE_Y = 28, 80 SDL_SCANCODE_Z = 29, 81 82 SDL_SCANCODE_1 = 30, 83 SDL_SCANCODE_2 = 31, 84 SDL_SCANCODE_3 = 32, 85 SDL_SCANCODE_4 = 33, 86 SDL_SCANCODE_5 = 34, 87 SDL_SCANCODE_6 = 35, 88 SDL_SCANCODE_7 = 36, 89 SDL_SCANCODE_8 = 37, 90 SDL_SCANCODE_9 = 38, 91 SDL_SCANCODE_0 = 39, 92 93 SDL_SCANCODE_RETURN = 40, 94 SDL_SCANCODE_ESCAPE = 41, 95 SDL_SCANCODE_BACKSPACE = 42, 96 SDL_SCANCODE_TAB = 43, 97 SDL_SCANCODE_SPACE = 44, 98 99 SDL_SCANCODE_MINUS = 45, 100 SDL_SCANCODE_EQUALS = 46, 101 SDL_SCANCODE_LEFTBRACKET = 47, 102 SDL_SCANCODE_RIGHTBRACKET = 48, 103 SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return 104 * key on ISO keyboards and at the right end 105 * of the QWERTY row on ANSI keyboards. 106 * Produces REVERSE SOLIDUS (backslash) and 107 * VERTICAL LINE in a US layout, REVERSE 108 * SOLIDUS and VERTICAL LINE in a UK Mac 109 * layout, NUMBER SIGN and TILDE in a UK 110 * Windows layout, DOLLAR SIGN and POUND SIGN 111 * in a Swiss German layout, NUMBER SIGN and 112 * APOSTROPHE in a German layout, GRAVE 113 * ACCENT and POUND SIGN in a French Mac 114 * layout, and ASTERISK and MICRO SIGN in a 115 * French Windows layout. 116 */ 117 SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code 118 * instead of 49 for the same key, but all 119 * OSes I've seen treat the two codes 120 * identically. So, as an implementor, unless 121 * your keyboard generates both of those 122 * codes and your OS treats them differently, 123 * you should generate SDL_SCANCODE_BACKSLASH 124 * instead of this code. As a user, you 125 * should not rely on this code because SDL 126 * will never generate it with most (all?) 127 * keyboards. 128 */ 129 SDL_SCANCODE_SEMICOLON = 51, 130 SDL_SCANCODE_APOSTROPHE = 52, 131 SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI 132 * and ISO keyboards). Produces GRAVE ACCENT and 133 * TILDE in a US Windows layout and in US and UK 134 * Mac layouts on ANSI keyboards, GRAVE ACCENT 135 * and NOT SIGN in a UK Windows layout, SECTION 136 * SIGN and PLUS-MINUS SIGN in US and UK Mac 137 * layouts on ISO keyboards, SECTION SIGN and 138 * DEGREE SIGN in a Swiss German layout (Mac: 139 * only on ISO keyboards), CIRCUMFLEX ACCENT and 140 * DEGREE SIGN in a German layout (Mac: only on 141 * ISO keyboards), SUPERSCRIPT TWO and TILDE in a 142 * French Windows layout, COMMERCIAL AT and 143 * NUMBER SIGN in a French Mac layout on ISO 144 * keyboards, and LESS-THAN SIGN and GREATER-THAN 145 * SIGN in a Swiss German, German, or French Mac 146 * layout on ANSI keyboards. 147 */ 148 SDL_SCANCODE_COMMA = 54, 149 SDL_SCANCODE_PERIOD = 55, 150 SDL_SCANCODE_SLASH = 56, 151 152 SDL_SCANCODE_CAPSLOCK = 57, 153 154 SDL_SCANCODE_F1 = 58, 155 SDL_SCANCODE_F2 = 59, 156 SDL_SCANCODE_F3 = 60, 157 SDL_SCANCODE_F4 = 61, 158 SDL_SCANCODE_F5 = 62, 159 SDL_SCANCODE_F6 = 63, 160 SDL_SCANCODE_F7 = 64, 161 SDL_SCANCODE_F8 = 65, 162 SDL_SCANCODE_F9 = 66, 163 SDL_SCANCODE_F10 = 67, 164 SDL_SCANCODE_F11 = 68, 165 SDL_SCANCODE_F12 = 69, 166 167 SDL_SCANCODE_PRINTSCREEN = 70, 168 SDL_SCANCODE_SCROLLLOCK = 71, 169 SDL_SCANCODE_PAUSE = 72, 170 SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but 171 does send code 73, not 117) */ 172 SDL_SCANCODE_HOME = 74, 173 SDL_SCANCODE_PAGEUP = 75, 174 SDL_SCANCODE_DELETE = 76, 175 SDL_SCANCODE_END = 77, 176 SDL_SCANCODE_PAGEDOWN = 78, 177 SDL_SCANCODE_RIGHT = 79, 178 SDL_SCANCODE_LEFT = 80, 179 SDL_SCANCODE_DOWN = 81, 180 SDL_SCANCODE_UP = 82, 181 182 SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards 183 */ 184 SDL_SCANCODE_KP_DIVIDE = 84, 185 SDL_SCANCODE_KP_MULTIPLY = 85, 186 SDL_SCANCODE_KP_MINUS = 86, 187 SDL_SCANCODE_KP_PLUS = 87, 188 SDL_SCANCODE_KP_ENTER = 88, 189 SDL_SCANCODE_KP_1 = 89, 190 SDL_SCANCODE_KP_2 = 90, 191 SDL_SCANCODE_KP_3 = 91, 192 SDL_SCANCODE_KP_4 = 92, 193 SDL_SCANCODE_KP_5 = 93, 194 SDL_SCANCODE_KP_6 = 94, 195 SDL_SCANCODE_KP_7 = 95, 196 SDL_SCANCODE_KP_8 = 96, 197 SDL_SCANCODE_KP_9 = 97, 198 SDL_SCANCODE_KP_0 = 98, 199 SDL_SCANCODE_KP_PERIOD = 99, 200 201 SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO 202 * keyboards have over ANSI ones, 203 * located between left shift and Y. 204 * Produces GRAVE ACCENT and TILDE in a 205 * US or UK Mac layout, REVERSE SOLIDUS 206 * (backslash) and VERTICAL LINE in a 207 * US or UK Windows layout, and 208 * LESS-THAN SIGN and GREATER-THAN SIGN 209 * in a Swiss German, German, or French 210 * layout. */ 211 SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ 212 SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, 213 * not a physical key - but some Mac keyboards 214 * do have a power key. */ 215 SDL_SCANCODE_KP_EQUALS = 103, 216 SDL_SCANCODE_F13 = 104, 217 SDL_SCANCODE_F14 = 105, 218 SDL_SCANCODE_F15 = 106, 219 SDL_SCANCODE_F16 = 107, 220 SDL_SCANCODE_F17 = 108, 221 SDL_SCANCODE_F18 = 109, 222 SDL_SCANCODE_F19 = 110, 223 SDL_SCANCODE_F20 = 111, 224 SDL_SCANCODE_F21 = 112, 225 SDL_SCANCODE_F22 = 113, 226 SDL_SCANCODE_F23 = 114, 227 SDL_SCANCODE_F24 = 115, 228 SDL_SCANCODE_EXECUTE = 116, 229 SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ 230 SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ 231 SDL_SCANCODE_SELECT = 119, 232 SDL_SCANCODE_STOP = 120, /**< AC Stop */ 233 SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ 234 SDL_SCANCODE_UNDO = 122, /**< AC Undo */ 235 SDL_SCANCODE_CUT = 123, /**< AC Cut */ 236 SDL_SCANCODE_COPY = 124, /**< AC Copy */ 237 SDL_SCANCODE_PASTE = 125, /**< AC Paste */ 238 SDL_SCANCODE_FIND = 126, /**< AC Find */ 239 SDL_SCANCODE_MUTE = 127, 240 SDL_SCANCODE_VOLUMEUP = 128, 241 SDL_SCANCODE_VOLUMEDOWN = 129, 242 /* not sure whether there's a reason to enable these */ 243 /* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ 244 /* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ 245 /* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ 246 SDL_SCANCODE_KP_COMMA = 133, 247 SDL_SCANCODE_KP_EQUALSAS400 = 134, 248 249 SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see 250 footnotes in USB doc */ 251 SDL_SCANCODE_INTERNATIONAL2 = 136, 252 SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ 253 SDL_SCANCODE_INTERNATIONAL4 = 138, 254 SDL_SCANCODE_INTERNATIONAL5 = 139, 255 SDL_SCANCODE_INTERNATIONAL6 = 140, 256 SDL_SCANCODE_INTERNATIONAL7 = 141, 257 SDL_SCANCODE_INTERNATIONAL8 = 142, 258 SDL_SCANCODE_INTERNATIONAL9 = 143, 259 SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ 260 SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ 261 SDL_SCANCODE_LANG3 = 146, /**< Katakana */ 262 SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ 263 SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ 264 SDL_SCANCODE_LANG6 = 149, /**< reserved */ 265 SDL_SCANCODE_LANG7 = 150, /**< reserved */ 266 SDL_SCANCODE_LANG8 = 151, /**< reserved */ 267 SDL_SCANCODE_LANG9 = 152, /**< reserved */ 268 269 SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ 270 SDL_SCANCODE_SYSREQ = 154, 271 SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ 272 SDL_SCANCODE_CLEAR = 156, 273 SDL_SCANCODE_PRIOR = 157, 274 SDL_SCANCODE_RETURN2 = 158, 275 SDL_SCANCODE_SEPARATOR = 159, 276 SDL_SCANCODE_OUT = 160, 277 SDL_SCANCODE_OPER = 161, 278 SDL_SCANCODE_CLEARAGAIN = 162, 279 SDL_SCANCODE_CRSEL = 163, 280 SDL_SCANCODE_EXSEL = 164, 281 282 SDL_SCANCODE_KP_00 = 176, 283 SDL_SCANCODE_KP_000 = 177, 284 SDL_SCANCODE_THOUSANDSSEPARATOR = 178, 285 SDL_SCANCODE_DECIMALSEPARATOR = 179, 286 SDL_SCANCODE_CURRENCYUNIT = 180, 287 SDL_SCANCODE_CURRENCYSUBUNIT = 181, 288 SDL_SCANCODE_KP_LEFTPAREN = 182, 289 SDL_SCANCODE_KP_RIGHTPAREN = 183, 290 SDL_SCANCODE_KP_LEFTBRACE = 184, 291 SDL_SCANCODE_KP_RIGHTBRACE = 185, 292 SDL_SCANCODE_KP_TAB = 186, 293 SDL_SCANCODE_KP_BACKSPACE = 187, 294 SDL_SCANCODE_KP_A = 188, 295 SDL_SCANCODE_KP_B = 189, 296 SDL_SCANCODE_KP_C = 190, 297 SDL_SCANCODE_KP_D = 191, 298 SDL_SCANCODE_KP_E = 192, 299 SDL_SCANCODE_KP_F = 193, 300 SDL_SCANCODE_KP_XOR = 194, 301 SDL_SCANCODE_KP_POWER = 195, 302 SDL_SCANCODE_KP_PERCENT = 196, 303 SDL_SCANCODE_KP_LESS = 197, 304 SDL_SCANCODE_KP_GREATER = 198, 305 SDL_SCANCODE_KP_AMPERSAND = 199, 306 SDL_SCANCODE_KP_DBLAMPERSAND = 200, 307 SDL_SCANCODE_KP_VERTICALBAR = 201, 308 SDL_SCANCODE_KP_DBLVERTICALBAR = 202, 309 SDL_SCANCODE_KP_COLON = 203, 310 SDL_SCANCODE_KP_HASH = 204, 311 SDL_SCANCODE_KP_SPACE = 205, 312 SDL_SCANCODE_KP_AT = 206, 313 SDL_SCANCODE_KP_EXCLAM = 207, 314 SDL_SCANCODE_KP_MEMSTORE = 208, 315 SDL_SCANCODE_KP_MEMRECALL = 209, 316 SDL_SCANCODE_KP_MEMCLEAR = 210, 317 SDL_SCANCODE_KP_MEMADD = 211, 318 SDL_SCANCODE_KP_MEMSUBTRACT = 212, 319 SDL_SCANCODE_KP_MEMMULTIPLY = 213, 320 SDL_SCANCODE_KP_MEMDIVIDE = 214, 321 SDL_SCANCODE_KP_PLUSMINUS = 215, 322 SDL_SCANCODE_KP_CLEAR = 216, 323 SDL_SCANCODE_KP_CLEARENTRY = 217, 324 SDL_SCANCODE_KP_BINARY = 218, 325 SDL_SCANCODE_KP_OCTAL = 219, 326 SDL_SCANCODE_KP_DECIMAL = 220, 327 SDL_SCANCODE_KP_HEXADECIMAL = 221, 328 329 SDL_SCANCODE_LCTRL = 224, 330 SDL_SCANCODE_LSHIFT = 225, 331 SDL_SCANCODE_LALT = 226, /**< alt, option */ 332 SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ 333 SDL_SCANCODE_RCTRL = 228, 334 SDL_SCANCODE_RSHIFT = 229, 335 SDL_SCANCODE_RALT = 230, /**< alt gr, option */ 336 SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ 337 338 SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered 339 * by any of the above, but since there's a 340 * special SDL_KMOD_MODE for it I'm adding it here 341 */ 342 343 SDL_SCANCODE_SLEEP = 258, /**< Sleep */ 344 SDL_SCANCODE_WAKE = 259, /**< Wake */ 345 346 SDL_SCANCODE_CHANNEL_INCREMENT = 260, /**< Channel Increment */ 347 SDL_SCANCODE_CHANNEL_DECREMENT = 261, /**< Channel Decrement */ 348 349 SDL_SCANCODE_MEDIA_PLAY = 262, /**< Play */ 350 SDL_SCANCODE_MEDIA_PAUSE = 263, /**< Pause */ 351 SDL_SCANCODE_MEDIA_RECORD = 264, /**< Record */ 352 SDL_SCANCODE_MEDIA_FAST_FORWARD = 265, /**< Fast Forward */ 353 SDL_SCANCODE_MEDIA_REWIND = 266, /**< Rewind */ 354 SDL_SCANCODE_MEDIA_NEXT_TRACK = 267, /**< Next Track */ 355 SDL_SCANCODE_MEDIA_PREVIOUS_TRACK = 268, /**< Previous Track */ 356 SDL_SCANCODE_MEDIA_STOP = 269, /**< Stop */ 357 SDL_SCANCODE_MEDIA_EJECT = 270, /**< Eject */ 358 SDL_SCANCODE_MEDIA_PLAY_PAUSE = 271, /**< Play / Pause */ 359 SDL_SCANCODE_MEDIA_SELECT = 272, /* Media Select */ 360 361 SDL_SCANCODE_AC_NEW = 273, /**< AC New */ 362 SDL_SCANCODE_AC_OPEN = 274, /**< AC Open */ 363 SDL_SCANCODE_AC_CLOSE = 275, /**< AC Close */ 364 SDL_SCANCODE_AC_EXIT = 276, /**< AC Exit */ 365 SDL_SCANCODE_AC_SAVE = 277, /**< AC Save */ 366 SDL_SCANCODE_AC_PRINT = 278, /**< AC Print */ 367 SDL_SCANCODE_AC_PROPERTIES = 279, /**< AC Properties */ 368 369 SDL_SCANCODE_AC_SEARCH = 280, /**< AC Search */ 370 SDL_SCANCODE_AC_HOME = 281, /**< AC Home */ 371 SDL_SCANCODE_AC_BACK = 282, /**< AC Back */ 372 SDL_SCANCODE_AC_FORWARD = 283, /**< AC Forward */ 373 SDL_SCANCODE_AC_STOP = 284, /**< AC Stop */ 374 SDL_SCANCODE_AC_REFRESH = 285, /**< AC Refresh */ 375 SDL_SCANCODE_AC_BOOKMARKS = 286, /**< AC Bookmarks */ 376 377 SDL_SCANCODE_SOFTLEFT = 287, /**< Usually situated below the display on phones and 378 used as a multi-function feature key for selecting 379 a software defined function shown on the bottom left 380 of the display. */ 381 SDL_SCANCODE_SOFTRIGHT = 288, /**< Usually situated below the display on phones and 382 used as a multi-function feature key for selecting 383 a software defined function shown on the bottom right 384 of the display. */ 385 SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ 386 SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ 387 388 SDL_SCANCODE_RESERVED = 400, /**< 400-500 reserved for dynamic keycodes */ 389 390 SDL_SCANCODE_COUNT = 512 /**< not a key, just marks the number of scancodes for array bounds */ 391 392 }