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 }