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
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
use crate::*;

pub fn mouse_wheel() -> (f32, f32) {
    GLOBAL_STATE.borrow().mouse_wheel
}

pub fn is_mouse_button_down(button: MouseButton) -> bool {
    GLOBAL_STATE.borrow().mouse_pressed.contains(&button)
}

pub fn is_mouse_button_pressed(button: MouseButton) -> bool {
    GLOBAL_STATE.borrow().mouse_just_pressed.contains(&button)
}

pub fn is_mouse_button_released(button: MouseButton) -> bool {
    GLOBAL_STATE.borrow().mouse_just_released.contains(&button)
}

pub fn is_key_pressed(keycode: KeyCode) -> bool {
    GLOBAL_STATE.borrow().just_pressed.contains(&keycode)
}

pub fn is_key_released(keycode: KeyCode) -> bool {
    GLOBAL_STATE.borrow().just_released.contains(&keycode)
}

pub fn is_key_down(keycode: KeyCode) -> bool {
    GLOBAL_STATE.borrow().pressed.contains(&keycode)
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub enum MouseButton {
    Left,
    Right,
    Middle,
    Other(u16),
}

#[allow(dead_code)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum KeyCode {
    Backspace,
    Tab,
    Return,
    Escape,
    Space,
    Exclaim,
    Quotedbl,
    Hash,
    Dollar,
    Percent,
    Ampersand,
    Quote,
    LeftParen,
    RightParen,
    Asterisk,
    Plus,
    Comma,
    Minus,
    Period,
    Slash,
    Num0,
    Num1,
    Num2,
    Num3,
    Num4,
    Num5,
    Num6,
    Num7,
    Num8,
    Num9,
    Colon,
    Semicolon,
    Less,
    Equals,
    Greater,
    Question,
    At,
    LeftBracket,
    Backslash,
    RightBracket,
    Caret,
    Underscore,
    Backquote,
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H,
    I,
    J,
    K,
    L,
    M,
    N,
    O,
    P,
    Q,
    R,
    S,
    T,
    U,
    V,
    W,
    X,
    Y,
    Z,
    Delete,
    CapsLock,
    F1,
    F2,
    F3,
    F4,
    F5,
    F6,
    F7,
    F8,
    F9,
    F10,
    F11,
    F12,
    PrintScreen,
    ScrollLock,
    Pause,
    Insert,
    Home,
    PageUp,
    End,
    PageDown,
    Right,
    Left,
    Down,
    Up,
    NumLockClear,
    KpDivide,
    KpMultiply,
    KpMinus,
    KpPlus,
    KpEnter,
    Kp1,
    Kp2,
    Kp3,
    Kp4,
    Kp5,
    Kp6,
    Kp7,
    Kp8,
    Kp9,
    Kp0,
    KpPeriod,
    Application,
    Power,
    KpEquals,
    F13,
    F14,
    F15,
    F16,
    F17,
    F18,
    F19,
    F20,
    F21,
    F22,
    F23,
    F24,
    Execute,
    Help,
    Menu,
    Select,
    Stop,
    Again,
    Undo,
    Cut,
    Copy,
    Paste,
    Find,
    Mute,
    VolumeUp,
    VolumeDown,
    KpComma,
    KpEqualsAS400,
    AltErase,
    Sysreq,
    Cancel,
    Clear,
    Prior,
    Return2,
    Separator,
    Out,
    Oper,
    ClearAgain,
    CrSel,
    ExSel,
    Kp00,
    Kp000,
    ThousandsSeparator,
    DecimalSeparator,
    CurrencyUnit,
    CurrencySubUnit,
    KpLeftParen,
    KpRightParen,
    KpLeftBrace,
    KpRightBrace,
    KpTab,
    KpBackspace,
    KpA,
    KpB,
    KpC,
    KpD,
    KpE,
    KpF,
    KpXor,
    KpPower,
    KpPercent,
    KpLess,
    KpGreater,
    KpAmpersand,
    KpDblAmpersand,
    KpVerticalBar,
    KpDblVerticalBar,
    KpColon,
    KpHash,
    KpSpace,
    KpAt,
    KpExclam,
    KpMemStore,
    KpMemRecall,
    KpMemClear,
    KpMemAdd,
    KpMemSubtract,
    KpMemMultiply,
    KpMemDivide,
    KpPlusMinus,
    KpClear,
    KpClearEntry,
    KpBinary,
    KpOctal,
    KpDecimal,
    KpHexadecimal,
    LCtrl,
    LShift,
    LAlt,
    LGui,
    RCtrl,
    RShift,
    RAlt,
    RGui,
    Mode,
    AudioNext,
    AudioPrev,
    AudioStop,
    AudioPlay,
    AudioMute,
    MediaSelect,
    Www,
    Mail,
    Calculator,
    Computer,
    AcSearch,
    AcHome,
    AcBack,
    AcForward,
    AcStop,
    AcRefresh,
    AcBookmarks,
    BrightnessDown,
    BrightnessUp,
    DisplaySwitch,
    KbdIllumToggle,
    KbdIllumDown,
    KbdIllumUp,
    Eject,
    Sleep,
}

#[rustfmt::skip]
impl KeyCode {
    pub fn try_from_winit(code: VirtualKeyCode) -> Option<KeyCode> {
        match code {
            winit::event::VirtualKeyCode::A => Some(KeyCode::A),
            winit::event::VirtualKeyCode::B => Some(KeyCode::B),
            winit::event::VirtualKeyCode::C => Some(KeyCode::C),
            winit::event::VirtualKeyCode::D => Some(KeyCode::D),
            winit::event::VirtualKeyCode::E => Some(KeyCode::E),
            winit::event::VirtualKeyCode::F => Some(KeyCode::F),
            winit::event::VirtualKeyCode::G => Some(KeyCode::G),
            winit::event::VirtualKeyCode::H => Some(KeyCode::H),
            winit::event::VirtualKeyCode::I => Some(KeyCode::I),
            winit::event::VirtualKeyCode::J => Some(KeyCode::J),
            winit::event::VirtualKeyCode::K => Some(KeyCode::K),
            winit::event::VirtualKeyCode::L => Some(KeyCode::L),
            winit::event::VirtualKeyCode::M => Some(KeyCode::M),
            winit::event::VirtualKeyCode::N => Some(KeyCode::N),
            winit::event::VirtualKeyCode::O => Some(KeyCode::O),
            winit::event::VirtualKeyCode::P => Some(KeyCode::P),
            winit::event::VirtualKeyCode::Q => Some(KeyCode::Q),
            winit::event::VirtualKeyCode::R => Some(KeyCode::R),
            winit::event::VirtualKeyCode::S => Some(KeyCode::S),
            winit::event::VirtualKeyCode::T => Some(KeyCode::T),
            winit::event::VirtualKeyCode::U => Some(KeyCode::U),
            winit::event::VirtualKeyCode::V => Some(KeyCode::V),
            winit::event::VirtualKeyCode::W => Some(KeyCode::W),
            winit::event::VirtualKeyCode::X => Some(KeyCode::X),
            winit::event::VirtualKeyCode::Y => Some(KeyCode::Y),
            winit::event::VirtualKeyCode::Z => Some(KeyCode::Z),
            winit::event::VirtualKeyCode::Grave => Some(KeyCode::Backquote),
            winit::event::VirtualKeyCode::Tab => Some(KeyCode::Tab),
            winit::event::VirtualKeyCode::Return => Some(KeyCode::Return),
            winit::event::VirtualKeyCode::Escape => Some(KeyCode::Escape),
            winit::event::VirtualKeyCode::Space => Some(KeyCode::Space),
            winit::event::VirtualKeyCode::Plus => Some(KeyCode::Plus),
            winit::event::VirtualKeyCode::Comma => Some(KeyCode::Comma),
            winit::event::VirtualKeyCode::Minus => Some(KeyCode::Minus),
            winit::event::VirtualKeyCode::Period => Some(KeyCode::Period),
            winit::event::VirtualKeyCode::Slash => Some(KeyCode::Slash),
            winit::event::VirtualKeyCode::Key0 => Some(KeyCode::Num0),
            winit::event::VirtualKeyCode::Key1 => Some(KeyCode::Num1),
            winit::event::VirtualKeyCode::Key2 => Some(KeyCode::Num2),
            winit::event::VirtualKeyCode::Key3 => Some(KeyCode::Num3),
            winit::event::VirtualKeyCode::Key4 => Some(KeyCode::Num4),
            winit::event::VirtualKeyCode::Key5 => Some(KeyCode::Num5),
            winit::event::VirtualKeyCode::Key6 => Some(KeyCode::Num6),
            winit::event::VirtualKeyCode::Key7 => Some(KeyCode::Num7),
            winit::event::VirtualKeyCode::Key8 => Some(KeyCode::Num8),
            winit::event::VirtualKeyCode::Key9 => Some(KeyCode::Num9),
            winit::event::VirtualKeyCode::Colon => Some(KeyCode::Colon),
            winit::event::VirtualKeyCode::Semicolon => Some(KeyCode::Semicolon),
            winit::event::VirtualKeyCode::Equals => Some(KeyCode::Equals),
            winit::event::VirtualKeyCode::At => Some(KeyCode::At),
            winit::event::VirtualKeyCode::Backslash => Some(KeyCode::Backslash),
            winit::event::VirtualKeyCode::Caret => Some(KeyCode::Caret),
            winit::event::VirtualKeyCode::Delete => Some(KeyCode::Delete),
            winit::event::VirtualKeyCode::F1 => Some(KeyCode::F1),
            winit::event::VirtualKeyCode::F2 => Some(KeyCode::F2),
            winit::event::VirtualKeyCode::F3 => Some(KeyCode::F3),
            winit::event::VirtualKeyCode::F4 => Some(KeyCode::F4),
            winit::event::VirtualKeyCode::F5 => Some(KeyCode::F5),
            winit::event::VirtualKeyCode::F6 => Some(KeyCode::F6),
            winit::event::VirtualKeyCode::F7 => Some(KeyCode::F7),
            winit::event::VirtualKeyCode::F8 => Some(KeyCode::F8),
            winit::event::VirtualKeyCode::F9 => Some(KeyCode::F9),
            winit::event::VirtualKeyCode::F10 => Some(KeyCode::F10),
            winit::event::VirtualKeyCode::F11 => Some(KeyCode::F11),
            winit::event::VirtualKeyCode::F12 => Some(KeyCode::F12),
            winit::event::VirtualKeyCode::Pause => Some(KeyCode::Pause),
            winit::event::VirtualKeyCode::Insert => Some(KeyCode::Insert),
            winit::event::VirtualKeyCode::Home => Some(KeyCode::Home),
            winit::event::VirtualKeyCode::PageUp => Some(KeyCode::PageUp),
            winit::event::VirtualKeyCode::End => Some(KeyCode::End),
            winit::event::VirtualKeyCode::PageDown => Some(KeyCode::PageDown),
            winit::event::VirtualKeyCode::Right => Some(KeyCode::Right),
            winit::event::VirtualKeyCode::Left => Some(KeyCode::Left),
            winit::event::VirtualKeyCode::Down => Some(KeyCode::Down),
            winit::event::VirtualKeyCode::Up => Some(KeyCode::Up),
            winit::event::VirtualKeyCode::Power => Some(KeyCode::Power),
            winit::event::VirtualKeyCode::F13 => Some(KeyCode::F13),
            winit::event::VirtualKeyCode::F14 => Some(KeyCode::F14),
            winit::event::VirtualKeyCode::F15 => Some(KeyCode::F15),
            winit::event::VirtualKeyCode::F16 => Some(KeyCode::F16),
            winit::event::VirtualKeyCode::F17 => Some(KeyCode::F17),
            winit::event::VirtualKeyCode::F18 => Some(KeyCode::F18),
            winit::event::VirtualKeyCode::F19 => Some(KeyCode::F19),
            winit::event::VirtualKeyCode::F20 => Some(KeyCode::F20),
            winit::event::VirtualKeyCode::F21 => Some(KeyCode::F21),
            winit::event::VirtualKeyCode::F22 => Some(KeyCode::F22),
            winit::event::VirtualKeyCode::F23 => Some(KeyCode::F23),
            winit::event::VirtualKeyCode::F24 => Some(KeyCode::F24),
            winit::event::VirtualKeyCode::Stop => Some(KeyCode::Stop),
            winit::event::VirtualKeyCode::Cut => Some(KeyCode::Cut),
            winit::event::VirtualKeyCode::Copy => Some(KeyCode::Copy),
            winit::event::VirtualKeyCode::Paste => Some(KeyCode::Paste),
            winit::event::VirtualKeyCode::Mute => Some(KeyCode::Mute),
            winit::event::VirtualKeyCode::VolumeUp => Some(KeyCode::VolumeUp),
            winit::event::VirtualKeyCode::VolumeDown => Some(KeyCode::VolumeDown),
            winit::event::VirtualKeyCode::LControl => Some(KeyCode::LCtrl),
            winit::event::VirtualKeyCode::LShift => Some(KeyCode::LShift),
            winit::event::VirtualKeyCode::LAlt => Some(KeyCode::LAlt),
            winit::event::VirtualKeyCode::LWin => Some(KeyCode::LGui),
            winit::event::VirtualKeyCode::RControl => Some(KeyCode::RCtrl),
            winit::event::VirtualKeyCode::RShift => Some(KeyCode::RShift),
            winit::event::VirtualKeyCode::RAlt => Some(KeyCode::RAlt),
            winit::event::VirtualKeyCode::RWin => Some(KeyCode::RGui),
            _ => None,
        }
    }

    #[cfg(feature = "use-glow")]
    pub fn try_from_sdl(code: sdl2::keyboard::Keycode) -> Option<KeyCode> {
        match code {
            sdl2::keyboard::Keycode::A => Some(KeyCode::A),
            sdl2::keyboard::Keycode::B => Some(KeyCode::B),
            sdl2::keyboard::Keycode::C => Some(KeyCode::C),
            sdl2::keyboard::Keycode::D => Some(KeyCode::D),
            sdl2::keyboard::Keycode::E => Some(KeyCode::E),
            sdl2::keyboard::Keycode::F => Some(KeyCode::F),
            sdl2::keyboard::Keycode::G => Some(KeyCode::G),
            sdl2::keyboard::Keycode::H => Some(KeyCode::H),
            sdl2::keyboard::Keycode::I => Some(KeyCode::I),
            sdl2::keyboard::Keycode::J => Some(KeyCode::J),
            sdl2::keyboard::Keycode::K => Some(KeyCode::K),
            sdl2::keyboard::Keycode::L => Some(KeyCode::L),
            sdl2::keyboard::Keycode::M => Some(KeyCode::M),
            sdl2::keyboard::Keycode::N => Some(KeyCode::N),
            sdl2::keyboard::Keycode::O => Some(KeyCode::O),
            sdl2::keyboard::Keycode::P => Some(KeyCode::P),
            sdl2::keyboard::Keycode::Q => Some(KeyCode::Q),
            sdl2::keyboard::Keycode::R => Some(KeyCode::R),
            sdl2::keyboard::Keycode::S => Some(KeyCode::S),
            sdl2::keyboard::Keycode::T => Some(KeyCode::T),
            sdl2::keyboard::Keycode::U => Some(KeyCode::U),
            sdl2::keyboard::Keycode::V => Some(KeyCode::V),
            sdl2::keyboard::Keycode::W => Some(KeyCode::W),
            sdl2::keyboard::Keycode::X => Some(KeyCode::X),
            sdl2::keyboard::Keycode::Y => Some(KeyCode::Y),
            sdl2::keyboard::Keycode::Z => Some(KeyCode::Z),
            sdl2::keyboard::Keycode::Backspace => Some(KeyCode::Backspace),
            sdl2::keyboard::Keycode::Tab => Some(KeyCode::Tab),
            sdl2::keyboard::Keycode::Return => Some(KeyCode::Return),
            sdl2::keyboard::Keycode::Escape => Some(KeyCode::Escape),
            sdl2::keyboard::Keycode::Space => Some(KeyCode::Space),
            sdl2::keyboard::Keycode::Exclaim => Some(KeyCode::Exclaim),
            sdl2::keyboard::Keycode::Quotedbl => Some(KeyCode::Quotedbl),
            sdl2::keyboard::Keycode::Hash => Some(KeyCode::Hash),
            sdl2::keyboard::Keycode::Dollar => Some(KeyCode::Dollar),
            sdl2::keyboard::Keycode::Percent => Some(KeyCode::Percent),
            sdl2::keyboard::Keycode::Ampersand => Some(KeyCode::Ampersand),
            sdl2::keyboard::Keycode::Quote => Some(KeyCode::Quote),
            sdl2::keyboard::Keycode::LeftParen => Some(KeyCode::LeftParen),
            sdl2::keyboard::Keycode::RightParen => Some(KeyCode::RightParen),
            sdl2::keyboard::Keycode::Asterisk => Some(KeyCode::Asterisk),
            sdl2::keyboard::Keycode::Plus => Some(KeyCode::Plus),
            sdl2::keyboard::Keycode::Comma => Some(KeyCode::Comma),
            sdl2::keyboard::Keycode::Minus => Some(KeyCode::Minus),
            sdl2::keyboard::Keycode::Period => Some(KeyCode::Period),
            sdl2::keyboard::Keycode::Slash => Some(KeyCode::Slash),
            sdl2::keyboard::Keycode::Num0 => Some(KeyCode::Num0),
            sdl2::keyboard::Keycode::Num1 => Some(KeyCode::Num1),
            sdl2::keyboard::Keycode::Num2 => Some(KeyCode::Num2),
            sdl2::keyboard::Keycode::Num3 => Some(KeyCode::Num3),
            sdl2::keyboard::Keycode::Num4 => Some(KeyCode::Num4),
            sdl2::keyboard::Keycode::Num5 => Some(KeyCode::Num5),
            sdl2::keyboard::Keycode::Num6 => Some(KeyCode::Num6),
            sdl2::keyboard::Keycode::Num7 => Some(KeyCode::Num7),
            sdl2::keyboard::Keycode::Num8 => Some(KeyCode::Num8),
            sdl2::keyboard::Keycode::Num9 => Some(KeyCode::Num9),
            sdl2::keyboard::Keycode::Colon => Some(KeyCode::Colon),
            sdl2::keyboard::Keycode::Semicolon => Some(KeyCode::Semicolon),
            sdl2::keyboard::Keycode::Less => Some(KeyCode::Less),
            sdl2::keyboard::Keycode::Equals => Some(KeyCode::Equals),
            sdl2::keyboard::Keycode::Greater => Some(KeyCode::Greater),
            sdl2::keyboard::Keycode::Question => Some(KeyCode::Question),
            sdl2::keyboard::Keycode::At => Some(KeyCode::At),
            sdl2::keyboard::Keycode::LeftBracket => Some(KeyCode::LeftBracket),
            sdl2::keyboard::Keycode::Backslash => Some(KeyCode::Backslash),
            sdl2::keyboard::Keycode::RightBracket => { Some(KeyCode::RightBracket) }
            sdl2::keyboard::Keycode::Caret => Some(KeyCode::Caret),
            sdl2::keyboard::Keycode::Underscore => Some(KeyCode::Underscore),
            sdl2::keyboard::Keycode::Backquote => Some(KeyCode::Backquote),
            sdl2::keyboard::Keycode::Delete => Some(KeyCode::Delete),
            sdl2::keyboard::Keycode::CapsLock => Some(KeyCode::CapsLock),
            sdl2::keyboard::Keycode::F1 => Some(KeyCode::F1),
            sdl2::keyboard::Keycode::F2 => Some(KeyCode::F2),
            sdl2::keyboard::Keycode::F3 => Some(KeyCode::F3),
            sdl2::keyboard::Keycode::F4 => Some(KeyCode::F4),
            sdl2::keyboard::Keycode::F5 => Some(KeyCode::F5),
            sdl2::keyboard::Keycode::F6 => Some(KeyCode::F6),
            sdl2::keyboard::Keycode::F7 => Some(KeyCode::F7),
            sdl2::keyboard::Keycode::F8 => Some(KeyCode::F8),
            sdl2::keyboard::Keycode::F9 => Some(KeyCode::F9),
            sdl2::keyboard::Keycode::F10 => Some(KeyCode::F10),
            sdl2::keyboard::Keycode::F11 => Some(KeyCode::F11),
            sdl2::keyboard::Keycode::F12 => Some(KeyCode::F12),
            sdl2::keyboard::Keycode::PrintScreen => Some(KeyCode::PrintScreen),
            sdl2::keyboard::Keycode::ScrollLock => Some(KeyCode::ScrollLock),
            sdl2::keyboard::Keycode::Pause => Some(KeyCode::Pause),
            sdl2::keyboard::Keycode::Insert => Some(KeyCode::Insert),
            sdl2::keyboard::Keycode::Home => Some(KeyCode::Home),
            sdl2::keyboard::Keycode::PageUp => Some(KeyCode::PageUp),
            sdl2::keyboard::Keycode::End => Some(KeyCode::End),
            sdl2::keyboard::Keycode::PageDown => Some(KeyCode::PageDown),
            sdl2::keyboard::Keycode::Right => Some(KeyCode::Right),
            sdl2::keyboard::Keycode::Left => Some(KeyCode::Left),
            sdl2::keyboard::Keycode::Down => Some(KeyCode::Down),
            sdl2::keyboard::Keycode::Up => Some(KeyCode::Up),
            sdl2::keyboard::Keycode::NumLockClear => { Some(KeyCode::NumLockClear) }
            sdl2::keyboard::Keycode::KpDivide => Some(KeyCode::KpDivide),
            sdl2::keyboard::Keycode::KpMultiply => Some(KeyCode::KpMultiply),
            sdl2::keyboard::Keycode::KpMinus => Some(KeyCode::KpMinus),
            sdl2::keyboard::Keycode::KpPlus => Some(KeyCode::KpPlus),
            sdl2::keyboard::Keycode::KpEnter => Some(KeyCode::KpEnter),
            sdl2::keyboard::Keycode::Kp1 => Some(KeyCode::Kp1),
            sdl2::keyboard::Keycode::Kp2 => Some(KeyCode::Kp2),
            sdl2::keyboard::Keycode::Kp3 => Some(KeyCode::Kp3),
            sdl2::keyboard::Keycode::Kp4 => Some(KeyCode::Kp4),
            sdl2::keyboard::Keycode::Kp5 => Some(KeyCode::Kp5),
            sdl2::keyboard::Keycode::Kp6 => Some(KeyCode::Kp6),
            sdl2::keyboard::Keycode::Kp7 => Some(KeyCode::Kp7),
            sdl2::keyboard::Keycode::Kp8 => Some(KeyCode::Kp8),
            sdl2::keyboard::Keycode::Kp9 => Some(KeyCode::Kp9),
            sdl2::keyboard::Keycode::Kp0 => Some(KeyCode::Kp0),
            sdl2::keyboard::Keycode::KpPeriod => Some(KeyCode::KpPeriod),
            sdl2::keyboard::Keycode::Application => Some(KeyCode::Application),
            sdl2::keyboard::Keycode::Power => Some(KeyCode::Power),
            sdl2::keyboard::Keycode::KpEquals => Some(KeyCode::KpEquals),
            sdl2::keyboard::Keycode::F13 => Some(KeyCode::F13),
            sdl2::keyboard::Keycode::F14 => Some(KeyCode::F14),
            sdl2::keyboard::Keycode::F15 => Some(KeyCode::F15),
            sdl2::keyboard::Keycode::F16 => Some(KeyCode::F16),
            sdl2::keyboard::Keycode::F17 => Some(KeyCode::F17),
            sdl2::keyboard::Keycode::F18 => Some(KeyCode::F18),
            sdl2::keyboard::Keycode::F19 => Some(KeyCode::F19),
            sdl2::keyboard::Keycode::F20 => Some(KeyCode::F20),
            sdl2::keyboard::Keycode::F21 => Some(KeyCode::F21),
            sdl2::keyboard::Keycode::F22 => Some(KeyCode::F22),
            sdl2::keyboard::Keycode::F23 => Some(KeyCode::F23),
            sdl2::keyboard::Keycode::F24 => Some(KeyCode::F24),
            sdl2::keyboard::Keycode::Execute => Some(KeyCode::Execute),
            sdl2::keyboard::Keycode::Help => Some(KeyCode::Help),
            sdl2::keyboard::Keycode::Menu => Some(KeyCode::Menu),
            sdl2::keyboard::Keycode::Select => Some(KeyCode::Select),
            sdl2::keyboard::Keycode::Stop => Some(KeyCode::Stop),
            sdl2::keyboard::Keycode::Again => Some(KeyCode::Again),
            sdl2::keyboard::Keycode::Undo => Some(KeyCode::Undo),
            sdl2::keyboard::Keycode::Cut => Some(KeyCode::Cut),
            sdl2::keyboard::Keycode::Copy => Some(KeyCode::Copy),
            sdl2::keyboard::Keycode::Paste => Some(KeyCode::Paste),
            sdl2::keyboard::Keycode::Find => Some(KeyCode::Find),
            sdl2::keyboard::Keycode::Mute => Some(KeyCode::Mute),
            sdl2::keyboard::Keycode::VolumeUp => Some(KeyCode::VolumeUp),
            sdl2::keyboard::Keycode::VolumeDown => Some(KeyCode::VolumeDown),
            sdl2::keyboard::Keycode::KpComma => Some(KeyCode::KpComma),
            sdl2::keyboard::Keycode::Sysreq => Some(KeyCode::Sysreq),
            sdl2::keyboard::Keycode::Cancel => Some(KeyCode::Cancel),
            sdl2::keyboard::Keycode::Clear => Some(KeyCode::Clear),
            sdl2::keyboard::Keycode::Prior => Some(KeyCode::Prior),
            sdl2::keyboard::Keycode::Return2 => Some(KeyCode::Return2),
            sdl2::keyboard::Keycode::Separator => Some(KeyCode::Separator),
            sdl2::keyboard::Keycode::Out => Some(KeyCode::Out),
            sdl2::keyboard::Keycode::Oper => Some(KeyCode::Oper),
            sdl2::keyboard::Keycode::ExSel => Some(KeyCode::ExSel),
            sdl2::keyboard::Keycode::Kp00 => Some(KeyCode::Kp00),
            sdl2::keyboard::Keycode::Kp000 => Some(KeyCode::Kp000),
            sdl2::keyboard::Keycode::ThousandsSeparator => { Some(KeyCode::ThousandsSeparator) }
            sdl2::keyboard::Keycode::DecimalSeparator => { Some(KeyCode::DecimalSeparator) }
            sdl2::keyboard::Keycode::CurrencyUnit => { Some(KeyCode::CurrencyUnit) }
            sdl2::keyboard::Keycode::CurrencySubUnit => { Some(KeyCode::CurrencySubUnit) }
            sdl2::keyboard::Keycode::KpLeftParen => Some(KeyCode::KpLeftParen),
            sdl2::keyboard::Keycode::KpRightParen => { Some(KeyCode::KpRightParen) }
            sdl2::keyboard::Keycode::KpLeftBrace => Some(KeyCode::KpLeftBrace),
            sdl2::keyboard::Keycode::KpRightBrace => { Some(KeyCode::KpRightBrace) }
            sdl2::keyboard::Keycode::KpTab => Some(KeyCode::KpTab),
            sdl2::keyboard::Keycode::KpBackspace => Some(KeyCode::KpBackspace),
            sdl2::keyboard::Keycode::LCtrl => Some(KeyCode::LCtrl),
            sdl2::keyboard::Keycode::LShift => Some(KeyCode::LShift),
            sdl2::keyboard::Keycode::LAlt => Some(KeyCode::LAlt),
            sdl2::keyboard::Keycode::LGui => Some(KeyCode::LGui),
            sdl2::keyboard::Keycode::RCtrl => Some(KeyCode::RCtrl),
            sdl2::keyboard::Keycode::RShift => Some(KeyCode::RShift),
            sdl2::keyboard::Keycode::RAlt => Some(KeyCode::RAlt),
            sdl2::keyboard::Keycode::RGui => Some(KeyCode::RGui),
            sdl2::keyboard::Keycode::Mode => Some(KeyCode::Mode),
            _ => None,
        }
    }
}