1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
#![allow(missing_docs)]

//! Logical key mappings (changes by locale).

use crate::scancode::*;

// makes rustdoc link properly!
#[allow(unused)]
use crate::keyboard::*;

/// The SDL keyboard keycode representation.
///
/// This is used in places like the [`SDL_Keysym`] struct for the "software" /
/// "logical" designation of a key.
///
/// Values of this type are used to represent keyboard keys using the current
/// layout of the keyboard.  These values include Unicode values representing
/// the unmodified character that would be generated by pressing the key, or an
/// SDLK_* constant for those keys that do not generate characters.
///
/// A special exception is the number keys at the top of the keyboard which
/// always map to `SDLK_0` through `SDLK_9`, regardless of layout.
///
/// See all the constants named `SDLK_*`
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct SDL_Keycode(pub i32);

pub const SDLK_SCANCODE_MASK: i32 = 1 << 30;

/// Converts a scancode into a keycode.
///
/// Primarily intended for internal use.
#[inline]
#[must_use]
pub const fn SDL_SCANCODE_TO_KEYCODE(x: SDL_Scancode) -> SDL_Keycode {
  SDL_Keycode(x.0 | (1 << 30))
}

pub const SDLK_UNKNOWN: SDL_Keycode = SDL_Keycode(0);
pub const SDLK_RETURN: SDL_Keycode = SDL_Keycode(b'\r' as i32);
pub const SDLK_ESCAPE: SDL_Keycode = SDL_Keycode(27);
/// `\b`
pub const SDLK_BACKSPACE: SDL_Keycode = SDL_Keycode(8);
pub const SDLK_TAB: SDL_Keycode = SDL_Keycode(b'\t' as i32);
pub const SDLK_SPACE: SDL_Keycode = SDL_Keycode(b' ' as i32);
pub const SDLK_EXCLAIM: SDL_Keycode = SDL_Keycode(b'!' as i32);
pub const SDLK_QUOTEDBL: SDL_Keycode = SDL_Keycode(b'"' as i32);
pub const SDLK_HASH: SDL_Keycode = SDL_Keycode(b'#' as i32);
pub const SDLK_PERCENT: SDL_Keycode = SDL_Keycode(b'%' as i32);
pub const SDLK_DOLLAR: SDL_Keycode = SDL_Keycode(b'$' as i32);
pub const SDLK_AMPERSAND: SDL_Keycode = SDL_Keycode(b'&' as i32);
pub const SDLK_QUOTE: SDL_Keycode = SDL_Keycode(b'\'' as i32);
pub const SDLK_LEFTPAREN: SDL_Keycode = SDL_Keycode(b'(' as i32);
pub const SDLK_RIGHTPAREN: SDL_Keycode = SDL_Keycode(b')' as i32);
pub const SDLK_ASTERISK: SDL_Keycode = SDL_Keycode(b'*' as i32);
pub const SDLK_PLUS: SDL_Keycode = SDL_Keycode(b'+' as i32);
pub const SDLK_COMMA: SDL_Keycode = SDL_Keycode(b',' as i32);
pub const SDLK_MINUS: SDL_Keycode = SDL_Keycode(b'-' as i32);
pub const SDLK_PERIOD: SDL_Keycode = SDL_Keycode(b'.' as i32);
pub const SDLK_SLASH: SDL_Keycode = SDL_Keycode(b'/' as i32);
pub const SDLK_0: SDL_Keycode = SDL_Keycode(b'0' as i32);
pub const SDLK_1: SDL_Keycode = SDL_Keycode(b'1' as i32);
pub const SDLK_2: SDL_Keycode = SDL_Keycode(b'2' as i32);
pub const SDLK_3: SDL_Keycode = SDL_Keycode(b'3' as i32);
pub const SDLK_4: SDL_Keycode = SDL_Keycode(b'4' as i32);
pub const SDLK_5: SDL_Keycode = SDL_Keycode(b'5' as i32);
pub const SDLK_6: SDL_Keycode = SDL_Keycode(b'6' as i32);
pub const SDLK_7: SDL_Keycode = SDL_Keycode(b'7' as i32);
pub const SDLK_8: SDL_Keycode = SDL_Keycode(b'8' as i32);
pub const SDLK_9: SDL_Keycode = SDL_Keycode(b'9' as i32);
pub const SDLK_COLON: SDL_Keycode = SDL_Keycode(b':' as i32);
pub const SDLK_SEMICOLON: SDL_Keycode = SDL_Keycode(b';' as i32);
pub const SDLK_LESS: SDL_Keycode = SDL_Keycode(b'<' as i32);
pub const SDLK_EQUALS: SDL_Keycode = SDL_Keycode(b'=' as i32);
pub const SDLK_GREATER: SDL_Keycode = SDL_Keycode(b'>' as i32);
pub const SDLK_QUESTION: SDL_Keycode = SDL_Keycode(b'?' as i32);
pub const SDLK_AT: SDL_Keycode = SDL_Keycode(b'@' as i32);
pub const SDLK_LEFTBRACKET: SDL_Keycode = SDL_Keycode(b'[' as i32);
pub const SDLK_BACKSLASH: SDL_Keycode = SDL_Keycode(b'\\' as i32);
pub const SDLK_RIGHTBRACKET: SDL_Keycode = SDL_Keycode(b']' as i32);
pub const SDLK_CARET: SDL_Keycode = SDL_Keycode(b'^' as i32);
pub const SDLK_UNDERSCORE: SDL_Keycode = SDL_Keycode(b'_' as i32);
pub const SDLK_BACKQUOTE: SDL_Keycode = SDL_Keycode(b'`' as i32);
pub const SDLK_a: SDL_Keycode = SDL_Keycode(b'a' as i32);
pub const SDLK_b: SDL_Keycode = SDL_Keycode(b'b' as i32);
pub const SDLK_c: SDL_Keycode = SDL_Keycode(b'c' as i32);
pub const SDLK_d: SDL_Keycode = SDL_Keycode(b'd' as i32);
pub const SDLK_e: SDL_Keycode = SDL_Keycode(b'e' as i32);
pub const SDLK_f: SDL_Keycode = SDL_Keycode(b'f' as i32);
pub const SDLK_g: SDL_Keycode = SDL_Keycode(b'g' as i32);
pub const SDLK_h: SDL_Keycode = SDL_Keycode(b'h' as i32);
pub const SDLK_i: SDL_Keycode = SDL_Keycode(b'i' as i32);
pub const SDLK_j: SDL_Keycode = SDL_Keycode(b'j' as i32);
pub const SDLK_k: SDL_Keycode = SDL_Keycode(b'k' as i32);
pub const SDLK_l: SDL_Keycode = SDL_Keycode(b'l' as i32);
pub const SDLK_m: SDL_Keycode = SDL_Keycode(b'm' as i32);
pub const SDLK_n: SDL_Keycode = SDL_Keycode(b'n' as i32);
pub const SDLK_o: SDL_Keycode = SDL_Keycode(b'o' as i32);
pub const SDLK_p: SDL_Keycode = SDL_Keycode(b'p' as i32);
pub const SDLK_q: SDL_Keycode = SDL_Keycode(b'q' as i32);
pub const SDLK_r: SDL_Keycode = SDL_Keycode(b'r' as i32);
pub const SDLK_s: SDL_Keycode = SDL_Keycode(b's' as i32);
pub const SDLK_t: SDL_Keycode = SDL_Keycode(b't' as i32);
pub const SDLK_u: SDL_Keycode = SDL_Keycode(b'u' as i32);
pub const SDLK_v: SDL_Keycode = SDL_Keycode(b'v' as i32);
pub const SDLK_w: SDL_Keycode = SDL_Keycode(b'w' as i32);
pub const SDLK_x: SDL_Keycode = SDL_Keycode(b'x' as i32);
pub const SDLK_y: SDL_Keycode = SDL_Keycode(b'y' as i32);
pub const SDLK_z: SDL_Keycode = SDL_Keycode(b'z' as i32);
pub const SDLK_CAPSLOCK: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK);
pub const SDLK_F1: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1);
pub const SDLK_F2: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2);
pub const SDLK_F3: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3);
pub const SDLK_F4: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4);
pub const SDLK_F5: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5);
pub const SDLK_F6: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6);
pub const SDLK_F7: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7);
pub const SDLK_F8: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8);
pub const SDLK_F9: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9);
pub const SDLK_F10: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10);
pub const SDLK_F11: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11);
pub const SDLK_F12: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12);
pub const SDLK_PRINTSCREEN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN);
pub const SDLK_SCROLLLOCK: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK);
pub const SDLK_PAUSE: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE);
pub const SDLK_INSERT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT);
pub const SDLK_HOME: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME);
pub const SDLK_PAGEUP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP);
pub const SDLK_DELETE: SDL_Keycode = SDL_Keycode(177);
pub const SDLK_END: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END);
pub const SDLK_PAGEDOWN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN);
pub const SDLK_RIGHT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT);
pub const SDLK_LEFT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT);
pub const SDLK_DOWN: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN);
pub const SDLK_UP: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP);
pub const SDLK_NUMLOCKCLEAR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR);
pub const SDLK_KP_DIVIDE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE);
pub const SDLK_KP_MULTIPLY: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY);
pub const SDLK_KP_MINUS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS);
pub const SDLK_KP_PLUS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS);
pub const SDLK_KP_ENTER: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER);
pub const SDLK_KP_1: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1);
pub const SDLK_KP_2: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2);
pub const SDLK_KP_3: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3);
pub const SDLK_KP_4: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4);
pub const SDLK_KP_5: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5);
pub const SDLK_KP_6: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6);
pub const SDLK_KP_7: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7);
pub const SDLK_KP_8: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8);
pub const SDLK_KP_9: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9);
pub const SDLK_KP_0: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0);
pub const SDLK_KP_PERIOD: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD);
pub const SDLK_APPLICATION: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION);
pub const SDLK_POWER: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER);
pub const SDLK_KP_EQUALS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS);
pub const SDLK_F13: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13);
pub const SDLK_F14: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14);
pub const SDLK_F15: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15);
pub const SDLK_F16: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16);
pub const SDLK_F17: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17);
pub const SDLK_F18: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18);
pub const SDLK_F19: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19);
pub const SDLK_F20: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20);
pub const SDLK_F21: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21);
pub const SDLK_F22: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22);
pub const SDLK_F23: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23);
pub const SDLK_F24: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24);
pub const SDLK_EXECUTE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE);
pub const SDLK_HELP: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP);
pub const SDLK_MENU: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU);
pub const SDLK_SELECT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT);
pub const SDLK_STOP: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP);
pub const SDLK_AGAIN: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN);
pub const SDLK_UNDO: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO);
pub const SDLK_CUT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT);
pub const SDLK_COPY: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY);
pub const SDLK_PASTE: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE);
pub const SDLK_FIND: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND);
pub const SDLK_MUTE: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE);
pub const SDLK_VOLUMEUP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP);
pub const SDLK_VOLUMEDOWN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN);
pub const SDLK_KP_COMMA: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA);
pub const SDLK_KP_EQUALSAS400: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400);
pub const SDLK_ALTERASE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE);
pub const SDLK_SYSREQ: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ);
pub const SDLK_CANCEL: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL);
pub const SDLK_CLEAR: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR);
pub const SDLK_PRIOR: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR);
pub const SDLK_RETURN2: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2);
pub const SDLK_SEPARATOR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR);
pub const SDLK_OUT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT);
pub const SDLK_OPER: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER);
pub const SDLK_CLEARAGAIN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN);
pub const SDLK_CRSEL: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL);
pub const SDLK_EXSEL: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL);
pub const SDLK_KP_00: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00);
pub const SDLK_KP_000: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000);
pub const SDLK_THOUSANDSSEPARATOR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR);
pub const SDLK_DECIMALSEPARATOR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR);
pub const SDLK_CURRENCYUNIT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT);
pub const SDLK_CURRENCYSUBUNIT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT);
pub const SDLK_KP_LEFTPAREN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN);
pub const SDLK_KP_RIGHTPAREN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN);
pub const SDLK_KP_LEFTBRACE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE);
pub const SDLK_KP_RIGHTBRACE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE);
pub const SDLK_KP_TAB: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB);
pub const SDLK_KP_BACKSPACE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE);
pub const SDLK_KP_A: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A);
pub const SDLK_KP_B: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B);
pub const SDLK_KP_C: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C);
pub const SDLK_KP_D: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D);
pub const SDLK_KP_E: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E);
pub const SDLK_KP_F: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F);
pub const SDLK_KP_XOR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR);
pub const SDLK_KP_POWER: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER);
pub const SDLK_KP_PERCENT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT);
pub const SDLK_KP_LESS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS);
pub const SDLK_KP_GREATER: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER);
pub const SDLK_KP_AMPERSAND: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND);
pub const SDLK_KP_DBLAMPERSAND: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND);
pub const SDLK_KP_VERTICALBAR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR);
pub const SDLK_KP_DBLVERTICALBAR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR);
pub const SDLK_KP_COLON: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON);
pub const SDLK_KP_HASH: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH);
pub const SDLK_KP_SPACE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE);
pub const SDLK_KP_AT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT);
pub const SDLK_KP_EXCLAM: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM);
pub const SDLK_KP_MEMSTORE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE);
pub const SDLK_KP_MEMRECALL: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL);
pub const SDLK_KP_MEMCLEAR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR);
pub const SDLK_KP_MEMADD: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD);
pub const SDLK_KP_MEMSUBTRACT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT);
pub const SDLK_KP_MEMMULTIPLY: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY);
pub const SDLK_KP_MEMDIVIDE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE);
pub const SDLK_KP_PLUSMINUS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS);
pub const SDLK_KP_CLEAR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR);
pub const SDLK_KP_CLEARENTRY: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY);
pub const SDLK_KP_BINARY: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY);
pub const SDLK_KP_OCTAL: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL);
pub const SDLK_KP_DECIMAL: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL);
pub const SDLK_KP_HEXADECIMAL: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL);
pub const SDLK_LCTRL: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL);
pub const SDLK_LSHIFT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT);
pub const SDLK_LALT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT);
pub const SDLK_LGUI: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI);
pub const SDLK_RCTRL: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL);
pub const SDLK_RSHIFT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT);
pub const SDLK_RALT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT);
pub const SDLK_RGUI: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI);
pub const SDLK_MODE: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE);
pub const SDLK_AUDIONEXT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIONEXT);
pub const SDLK_AUDIOPREV: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPREV);
pub const SDLK_AUDIOSTOP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOSTOP);
pub const SDLK_AUDIOPLAY: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY);
pub const SDLK_AUDIOMUTE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE);
pub const SDLK_MEDIASELECT: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT);
pub const SDLK_WWW: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW);
pub const SDLK_MAIL: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL);
pub const SDLK_CALCULATOR: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR);
pub const SDLK_COMPUTER: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER);
pub const SDLK_AC_SEARCH: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH);
pub const SDLK_AC_HOME: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME);
pub const SDLK_AC_BACK: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK);
pub const SDLK_AC_FORWARD: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD);
pub const SDLK_AC_STOP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP);
pub const SDLK_AC_REFRESH: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH);
pub const SDLK_AC_BOOKMARKS: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS);
pub const SDLK_BRIGHTNESSDOWN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSDOWN);
pub const SDLK_BRIGHTNESSUP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSUP);
pub const SDLK_DISPLAYSWITCH: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DISPLAYSWITCH);
pub const SDLK_KBDILLUMTOGGLE: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMTOGGLE);
pub const SDLK_KBDILLUMDOWN: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN);
pub const SDLK_KBDILLUMUP: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP);
pub const SDLK_EJECT: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT);
pub const SDLK_SLEEP: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP);
pub const SDLK_APP1: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP1);
pub const SDLK_APP2: SDL_Keycode = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP2);
pub const SDLK_AUDIOREWIND: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOREWIND);
pub const SDLK_AUDIOFASTFORWARD: SDL_Keycode =
  SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOFASTFORWARD);

/// Representation of modifier key flags.
///
/// This is used in places like the [`SDL_Keysym`] struct.
///
/// See all the constants named `KMOD_*`
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct SDL_Keymod(pub i32);
impl_bit_ops_for_tuple_newtype!(SDL_Keymod);
impl SDL_Keymod {
  /// Convenience function to downcast into `u16`.
  ///
  /// This is needed for easy interaction with the `mod_` field of
  /// [`SDL_Keysym`].
  #[inline]
  #[must_use]
  pub const fn as_u16(self) -> u16 {
    self.0 as i16 as u16
  }
}

pub const KMOD_NONE: SDL_Keymod = SDL_Keymod(0x0000);
pub const KMOD_LSHIFT: SDL_Keymod = SDL_Keymod(0x0001);
pub const KMOD_RSHIFT: SDL_Keymod = SDL_Keymod(0x0002);
pub const KMOD_LCTRL: SDL_Keymod = SDL_Keymod(0x0040);
pub const KMOD_RCTRL: SDL_Keymod = SDL_Keymod(0x0080);
pub const KMOD_LALT: SDL_Keymod = SDL_Keymod(0x0100);
pub const KMOD_RALT: SDL_Keymod = SDL_Keymod(0x0200);
pub const KMOD_LGUI: SDL_Keymod = SDL_Keymod(0x0400);
pub const KMOD_RGUI: SDL_Keymod = SDL_Keymod(0x0800);
pub const KMOD_NUM: SDL_Keymod = SDL_Keymod(0x1000);
pub const KMOD_CAPS: SDL_Keymod = SDL_Keymod(0x2000);
pub const KMOD_MODE: SDL_Keymod = SDL_Keymod(0x4000);
pub const KMOD_RESERVED: SDL_Keymod = SDL_Keymod(0x8000);

pub const KMOD_CTRL: SDL_Keymod = SDL_Keymod(KMOD_LCTRL.0 | KMOD_RCTRL.0);
pub const KMOD_SHIFT: SDL_Keymod = SDL_Keymod(KMOD_LSHIFT.0 | KMOD_RSHIFT.0);
pub const KMOD_ALT: SDL_Keymod = SDL_Keymod(KMOD_LALT.0 | KMOD_RALT.0);
pub const KMOD_GUI: SDL_Keymod = SDL_Keymod(KMOD_LGUI.0 | KMOD_RGUI.0);