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
use num::{ToPrimitive, FromPrimitive};

use sys::keycode as ll;

#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum KeyCode {
    Unknown            = ll::SDLK_UNKNOWN as isize,
    Backspace          = ll::SDLK_BACKSPACE as isize,
    Tab                = ll::SDLK_TAB as isize,
    Return             = ll::SDLK_RETURN as isize,
    Escape             = ll::SDLK_ESCAPE as isize,
    Space              = ll::SDLK_SPACE as isize,
    Exclaim            = ll::SDLK_EXCLAIM as isize,
    Quotedbl           = ll::SDLK_QUOTEDBL as isize,
    Hash               = ll::SDLK_HASH as isize,
    Dollar             = ll::SDLK_DOLLAR as isize,
    Percent            = ll::SDLK_PERCENT as isize,
    Ampersand          = ll::SDLK_AMPERSAND as isize,
    Quote              = ll::SDLK_QUOTE as isize,
    LeftParen          = ll::SDLK_LEFTPAREN as isize,
    RightParen         = ll::SDLK_RIGHTPAREN as isize,
    Asterisk           = ll::SDLK_ASTERISK as isize,
    Plus               = ll::SDLK_PLUS as isize,
    Comma              = ll::SDLK_COMMA as isize,
    Minus              = ll::SDLK_MINUS as isize,
    Period             = ll::SDLK_PERIOD as isize,
    Slash              = ll::SDLK_SLASH as isize,
    Num0               = ll::SDLK_0 as isize,
    Num1               = ll::SDLK_1 as isize,
    Num2               = ll::SDLK_2 as isize,
    Num3               = ll::SDLK_3 as isize,
    Num4               = ll::SDLK_4 as isize,
    Num5               = ll::SDLK_5 as isize,
    Num6               = ll::SDLK_6 as isize,
    Num7               = ll::SDLK_7 as isize,
    Num8               = ll::SDLK_8 as isize,
    Num9               = ll::SDLK_9 as isize,
    Colon              = ll::SDLK_COLON as isize,
    Semicolon          = ll::SDLK_SEMICOLON as isize,
    Less               = ll::SDLK_LESS as isize,
    Equals             = ll::SDLK_EQUALS as isize,
    Greater            = ll::SDLK_GREATER as isize,
    Question           = ll::SDLK_QUESTION as isize,
    At                 = ll::SDLK_AT as isize,
    LeftBracket        = ll::SDLK_LEFTBRACKET as isize,
    Backslash          = ll::SDLK_BACKSLASH as isize,
    RightBracket       = ll::SDLK_RIGHTBRACKET as isize,
    Caret              = ll::SDLK_CARET as isize,
    Underscore         = ll::SDLK_UNDERSCORE as isize,
    Backquote          = ll::SDLK_BACKQUOTE as isize,
    A                  = ll::SDLK_a as isize,
    B                  = ll::SDLK_b as isize,
    C                  = ll::SDLK_c as isize,
    D                  = ll::SDLK_d as isize,
    E                  = ll::SDLK_e as isize,
    F                  = ll::SDLK_f as isize,
    G                  = ll::SDLK_g as isize,
    H                  = ll::SDLK_h as isize,
    I                  = ll::SDLK_i as isize,
    J                  = ll::SDLK_j as isize,
    K                  = ll::SDLK_k as isize,
    L                  = ll::SDLK_l as isize,
    M                  = ll::SDLK_m as isize,
    N                  = ll::SDLK_n as isize,
    O                  = ll::SDLK_o as isize,
    P                  = ll::SDLK_p as isize,
    Q                  = ll::SDLK_q as isize,
    R                  = ll::SDLK_r as isize,
    S                  = ll::SDLK_s as isize,
    T                  = ll::SDLK_t as isize,
    U                  = ll::SDLK_u as isize,
    V                  = ll::SDLK_v as isize,
    W                  = ll::SDLK_w as isize,
    X                  = ll::SDLK_x as isize,
    Y                  = ll::SDLK_y as isize,
    Z                  = ll::SDLK_z as isize,
    Delete             = ll::SDLK_DELETE as isize,
    CapsLock           = ll::SDLK_CAPSLOCK as isize,
    F1                 = ll::SDLK_F1 as isize,
    F2                 = ll::SDLK_F2 as isize,
    F3                 = ll::SDLK_F3 as isize,
    F4                 = ll::SDLK_F4 as isize,
    F5                 = ll::SDLK_F5 as isize,
    F6                 = ll::SDLK_F6 as isize,
    F7                 = ll::SDLK_F7 as isize,
    F8                 = ll::SDLK_F8 as isize,
    F9                 = ll::SDLK_F9 as isize,
    F10                = ll::SDLK_F10 as isize,
    F11                = ll::SDLK_F11 as isize,
    F12                = ll::SDLK_F12 as isize,
    PrintScreen        = ll::SDLK_PRINTSCREEN as isize,
    ScrollLock         = ll::SDLK_SCROLLLOCK as isize,
    Pause              = ll::SDLK_PAUSE as isize,
    Insert             = ll::SDLK_INSERT as isize,
    Home               = ll::SDLK_HOME as isize,
    PageUp             = ll::SDLK_PAGEUP as isize,
    End                = ll::SDLK_END as isize,
    PageDown           = ll::SDLK_PAGEDOWN as isize,
    Right              = ll::SDLK_RIGHT as isize,
    Left               = ll::SDLK_LEFT as isize,
    Down               = ll::SDLK_DOWN as isize,
    Up                 = ll::SDLK_UP as isize,
    NumLockClear       = ll::SDLK_NUMLOCKCLEAR as isize,
    KpDivide           = ll::SDLK_KPDIVIDE as isize,
    KpMultiply         = ll::SDLK_KPMULTIPLY as isize,
    KpMinus            = ll::SDLK_KPMINUS as isize,
    KpPlus             = ll::SDLK_KPPLUS as isize,
    KpEnter            = ll::SDLK_KPENTER as isize,
    Kp1                = ll::SDLK_KP1 as isize,
    Kp2                = ll::SDLK_KP2 as isize,
    Kp3                = ll::SDLK_KP3 as isize,
    Kp4                = ll::SDLK_KP4 as isize,
    Kp5                = ll::SDLK_KP5 as isize,
    Kp6                = ll::SDLK_KP6 as isize,
    Kp7                = ll::SDLK_KP7 as isize,
    Kp8                = ll::SDLK_KP8 as isize,
    Kp9                = ll::SDLK_KP9 as isize,
    Kp0                = ll::SDLK_KP0 as isize,
    KpPeriod           = ll::SDLK_KPPERIOD as isize,
    Application        = ll::SDLK_APPLICATION as isize,
    Power              = ll::SDLK_POWER as isize,
    KpEquals           = ll::SDLK_KPEQUALS as isize,
    F13                = ll::SDLK_F13 as isize,
    F14                = ll::SDLK_F14 as isize,
    F15                = ll::SDLK_F15 as isize,
    F16                = ll::SDLK_F16 as isize,
    F17                = ll::SDLK_F17 as isize,
    F18                = ll::SDLK_F18 as isize,
    F19                = ll::SDLK_F19 as isize,
    F20                = ll::SDLK_F20 as isize,
    F21                = ll::SDLK_F21 as isize,
    F22                = ll::SDLK_F22 as isize,
    F23                = ll::SDLK_F23 as isize,
    F24                = ll::SDLK_F24 as isize,
    Execute            = ll::SDLK_EXECUTE as isize,
    Help               = ll::SDLK_HELP as isize,
    Menu               = ll::SDLK_MENU as isize,
    Select             = ll::SDLK_SELECT as isize,
    Stop               = ll::SDLK_STOP as isize,
    Again              = ll::SDLK_AGAIN as isize,
    Undo               = ll::SDLK_UNDO as isize,
    Cut                = ll::SDLK_CUT as isize,
    Copy               = ll::SDLK_COPY as isize,
    Paste              = ll::SDLK_PASTE as isize,
    Find               = ll::SDLK_FIND as isize,
    Mute               = ll::SDLK_MUTE as isize,
    VolumeUp           = ll::SDLK_VOLUMEUP as isize,
    VolumeDown         = ll::SDLK_VOLUMEDOWN as isize,
    KpComma            = ll::SDLK_KPCOMMA as isize,
    KpEqualsAS400      = ll::SDLK_KPEQUALSAS400 as isize,
    AltErase           = ll::SDLK_ALTERASE as isize,
    Sysreq             = ll::SDLK_SYSREQ as isize,
    Cancel             = ll::SDLK_CANCEL as isize,
    Clear              = ll::SDLK_CLEAR as isize,
    Prior              = ll::SDLK_PRIOR as isize,
    Return2            = ll::SDLK_RETURN2 as isize,
    Separator          = ll::SDLK_SEPARATOR as isize,
    Out                = ll::SDLK_OUT as isize,
    Oper               = ll::SDLK_OPER as isize,
    ClearAgain         = ll::SDLK_CLEARAGAIN as isize,
    CrSel              = ll::SDLK_CRSEL as isize,
    ExSel              = ll::SDLK_EXSEL as isize,
    Kp00               = ll::SDLK_KP00 as isize,
    Kp000              = ll::SDLK_KP000 as isize,
    ThousandsSeparator = ll::SDLK_THOUSANDSSEPARATOR as isize,
    DecimalSeparator   = ll::SDLK_DECIMALSEPARATOR as isize,
    CurrencyUnit       = ll::SDLK_CURRENCYUNIT as isize,
    CurrencySubUnit    = ll::SDLK_CURRENCYSUBUNIT as isize,
    KpLeftParen        = ll::SDLK_KPLEFTPAREN as isize,
    KpRightParen       = ll::SDLK_KPRIGHTPAREN as isize,
    KpLeftBrace        = ll::SDLK_KPLEFTBRACE as isize,
    KpRightBrace       = ll::SDLK_KPRIGHTBRACE as isize,
    KpTab              = ll::SDLK_KPTAB as isize,
    KpBackspace        = ll::SDLK_KPBACKSPACE as isize,
    KpA                = ll::SDLK_KPA as isize,
    KpB                = ll::SDLK_KPB as isize,
    KpC                = ll::SDLK_KPC as isize,
    KpD                = ll::SDLK_KPD as isize,
    KpE                = ll::SDLK_KPE as isize,
    KpF                = ll::SDLK_KPF as isize,
    KpXor              = ll::SDLK_KPXOR as isize,
    KpPower            = ll::SDLK_KPPOWER as isize,
    KpPercent          = ll::SDLK_KPPERCENT as isize,
    KpLess             = ll::SDLK_KPLESS as isize,
    KpGreater          = ll::SDLK_KPGREATER as isize,
    KpAmpersand        = ll::SDLK_KPAMPERSAND as isize,
    KpDblAmpersand     = ll::SDLK_KPDBLAMPERSAND as isize,
    KpVerticalBar      = ll::SDLK_KPVERTICALBAR as isize,
    KpDblVerticalBar   = ll::SDLK_KPDBLVERTICALBAR as isize,
    KpColon            = ll::SDLK_KPCOLON as isize,
    KpHash             = ll::SDLK_KPHASH as isize,
    KpSpace            = ll::SDLK_KPSPACE as isize,
    KpAt               = ll::SDLK_KPAT as isize,
    KpExclam           = ll::SDLK_KPEXCLAM as isize,
    KpMemStore         = ll::SDLK_KPMEMSTORE as isize,
    KpMemRecall        = ll::SDLK_KPMEMRECALL as isize,
    KpMemClear         = ll::SDLK_KPMEMCLEAR as isize,
    KpMemAdd           = ll::SDLK_KPMEMADD as isize,
    KpMemSubtract      = ll::SDLK_KPMEMSUBTRACT as isize,
    KpMemMultiply      = ll::SDLK_KPMEMMULTIPLY as isize,
    KpMemDivide        = ll::SDLK_KPMEMDIVIDE as isize,
    KpPlusMinus        = ll::SDLK_KPPLUSMINUS as isize,
    KpCear             = ll::SDLK_KPCEAR as isize,
    KpClearEntry       = ll::SDLK_KPCLEARENTRY as isize,
    KpBinary           = ll::SDLK_KPBINARY as isize,
    KpOctal            = ll::SDLK_KPOCTAL as isize,
    KpDecimal          = ll::SDLK_KPDECIMAL as isize,
    KpHexadecimal      = ll::SDLK_KPHEXADECIMAL as isize,
    LCtrl              = ll::SDLK_LCTRL as isize,
    LShift             = ll::SDLK_LSHIFT as isize,
    LAlt               = ll::SDLK_LALT as isize,
    LGui               = ll::SDLK_LGUI as isize,
    RCtrl              = ll::SDLK_RCTRL as isize,
    RShift             = ll::SDLK_RSHIFT as isize,
    RAlt               = ll::SDLK_RALT as isize,
    RGui               = ll::SDLK_RGUI as isize,
    Mode               = ll::SDLK_MODE as isize,
    AudioNext          = ll::SDLK_AUDIONEXT as isize,
    AudioPrev          = ll::SDLK_AUDIOPREV as isize,
    AudioStop          = ll::SDLK_AUDIOSTOP as isize,
    AudioPlay          = ll::SDLK_AUDIOPLAY as isize,
    AudioMute          = ll::SDLK_AUDIOMUTE as isize,
    MediaSelect        = ll::SDLK_MEDIASELECT as isize,
    Www                = ll::SDLK_WWW as isize,
    Mail               = ll::SDLK_MAIL as isize,
    Calculator         = ll::SDLK_CALCULATOR as isize,
    Computer           = ll::SDLK_COMPUTER as isize,
    AcSearch           = ll::SDLK_ACSEARCH as isize,
    AcHome             = ll::SDLK_ACHOME as isize,
    AcBack             = ll::SDLK_ACBACK as isize,
    AcForward          = ll::SDLK_ACFORWARD as isize,
    AcStop             = ll::SDLK_ACSTOP as isize,
    AcRefresh          = ll::SDLK_ACREFRESH as isize,
    AcBookmarks        = ll::SDLK_ACBOOKMARKS as isize,
    BrightnessDown     = ll::SDLK_BRIGHTNESSDOWN as isize,
    BrightnessUp       = ll::SDLK_BRIGHTNESSUP as isize,
    DisplaySwitch      = ll::SDLK_DISPLAYSWITCH as isize,
    KbdIllumToggle     = ll::SDLK_KBDILLUMTOGGLE as isize,
    KbdIllumDown       = ll::SDLK_KBDILLUMDOWN as isize,
    KbdIllumUp         = ll::SDLK_KBDILLUMUP as isize,
    Eject              = ll::SDLK_EJECT as isize,
    Sleep              = ll::SDLK_SLEEP as isize,
}

impl ToPrimitive for KeyCode {
    #[inline]
    fn to_i64(&self) -> Option<i64> {
        Some(*self as i64)
    }

    #[inline]
    fn to_u64(&self) -> Option<u64> {
        Some(*self as u64)
    }

    #[inline]
    fn to_isize(&self) -> Option<isize> {
        Some(*self as isize)
    }
}

impl FromPrimitive for KeyCode {
    fn from_i64(n: i64) -> Option<KeyCode> {
        use self::KeyCode::*;

        Some( match n as ll::SDL_Keycode {
            ll::SDLK_UNKNOWN             => Unknown,
            ll::SDLK_BACKSPACE           => Backspace,
            ll::SDLK_TAB                 => Tab,
            ll::SDLK_RETURN              => Return,
            ll::SDLK_ESCAPE              => Escape,
            ll::SDLK_SPACE               => Space,
            ll::SDLK_EXCLAIM             => Exclaim,
            ll::SDLK_QUOTEDBL            => Quotedbl,
            ll::SDLK_HASH                => Hash,
            ll::SDLK_DOLLAR              => Dollar,
            ll::SDLK_PERCENT             => Percent,
            ll::SDLK_AMPERSAND           => Ampersand,
            ll::SDLK_QUOTE               => Quote,
            ll::SDLK_LEFTPAREN           => LeftParen,
            ll::SDLK_RIGHTPAREN          => RightParen,
            ll::SDLK_ASTERISK            => Asterisk,
            ll::SDLK_PLUS                => Plus,
            ll::SDLK_COMMA               => Comma,
            ll::SDLK_MINUS               => Minus,
            ll::SDLK_PERIOD              => Period,
            ll::SDLK_SLASH               => Slash,
            ll::SDLK_0                   => Num0,
            ll::SDLK_1                   => Num1,
            ll::SDLK_2                   => Num2,
            ll::SDLK_3                   => Num3,
            ll::SDLK_4                   => Num4,
            ll::SDLK_5                   => Num5,
            ll::SDLK_6                   => Num6,
            ll::SDLK_7                   => Num7,
            ll::SDLK_8                   => Num8,
            ll::SDLK_9                   => Num9,
            ll::SDLK_COLON               => Colon,
            ll::SDLK_SEMICOLON           => Semicolon,
            ll::SDLK_LESS                => Less,
            ll::SDLK_EQUALS              => Equals,
            ll::SDLK_GREATER             => Greater,
            ll::SDLK_QUESTION            => Question,
            ll::SDLK_AT                  => At,
            ll::SDLK_LEFTBRACKET         => LeftBracket,
            ll::SDLK_BACKSLASH           => Backslash,
            ll::SDLK_RIGHTBRACKET        => RightBracket,
            ll::SDLK_CARET               => Caret,
            ll::SDLK_UNDERSCORE          => Underscore,
            ll::SDLK_BACKQUOTE           => Backquote,
            ll::SDLK_a                   => A,
            ll::SDLK_b                   => B,
            ll::SDLK_c                   => C,
            ll::SDLK_d                   => D,
            ll::SDLK_e                   => E,
            ll::SDLK_f                   => F,
            ll::SDLK_g                   => G,
            ll::SDLK_h                   => H,
            ll::SDLK_i                   => I,
            ll::SDLK_j                   => J,
            ll::SDLK_k                   => K,
            ll::SDLK_l                   => L,
            ll::SDLK_m                   => M,
            ll::SDLK_n                   => N,
            ll::SDLK_o                   => O,
            ll::SDLK_p                   => P,
            ll::SDLK_q                   => Q,
            ll::SDLK_r                   => R,
            ll::SDLK_s                   => S,
            ll::SDLK_t                   => T,
            ll::SDLK_u                   => U,
            ll::SDLK_v                   => V,
            ll::SDLK_w                   => W,
            ll::SDLK_x                   => X,
            ll::SDLK_y                   => Y,
            ll::SDLK_z                   => Z,
            ll::SDLK_DELETE              => Delete,
            ll::SDLK_CAPSLOCK            => CapsLock,
            ll::SDLK_F1                  => F1,
            ll::SDLK_F2                  => F2,
            ll::SDLK_F3                  => F3,
            ll::SDLK_F4                  => F4,
            ll::SDLK_F5                  => F5,
            ll::SDLK_F6                  => F6,
            ll::SDLK_F7                  => F7,
            ll::SDLK_F8                  => F8,
            ll::SDLK_F9                  => F9,
            ll::SDLK_F10                 => F10,
            ll::SDLK_F11                 => F11,
            ll::SDLK_F12                 => F12,
            ll::SDLK_PRINTSCREEN         => PrintScreen,
            ll::SDLK_SCROLLLOCK          => ScrollLock,
            ll::SDLK_PAUSE               => Pause,
            ll::SDLK_INSERT              => Insert,
            ll::SDLK_HOME                => Home,
            ll::SDLK_PAGEUP              => PageUp,
            ll::SDLK_END                 => End,
            ll::SDLK_PAGEDOWN            => PageDown,
            ll::SDLK_RIGHT               => Right,
            ll::SDLK_LEFT                => Left,
            ll::SDLK_DOWN                => Down,
            ll::SDLK_UP                  => Up,
            ll::SDLK_NUMLOCKCLEAR        => NumLockClear,
            ll::SDLK_KPDIVIDE            => KpDivide,
            ll::SDLK_KPMULTIPLY          => KpMultiply,
            ll::SDLK_KPMINUS             => KpMinus,
            ll::SDLK_KPPLUS              => KpPlus,
            ll::SDLK_KPENTER             => KpEnter,
            ll::SDLK_KP1                 => Kp1,
            ll::SDLK_KP2                 => Kp2,
            ll::SDLK_KP3                 => Kp3,
            ll::SDLK_KP4                 => Kp4,
            ll::SDLK_KP5                 => Kp5,
            ll::SDLK_KP6                 => Kp6,
            ll::SDLK_KP7                 => Kp7,
            ll::SDLK_KP8                 => Kp8,
            ll::SDLK_KP9                 => Kp9,
            ll::SDLK_KP0                 => Kp0,
            ll::SDLK_KPPERIOD            => KpPeriod,
            ll::SDLK_APPLICATION         => Application,
            ll::SDLK_POWER               => Power,
            ll::SDLK_KPEQUALS            => KpEquals,
            ll::SDLK_F13                 => F13,
            ll::SDLK_F14                 => F14,
            ll::SDLK_F15                 => F15,
            ll::SDLK_F16                 => F16,
            ll::SDLK_F17                 => F17,
            ll::SDLK_F18                 => F18,
            ll::SDLK_F19                 => F19,
            ll::SDLK_F20                 => F20,
            ll::SDLK_F21                 => F21,
            ll::SDLK_F22                 => F22,
            ll::SDLK_F23                 => F23,
            ll::SDLK_F24                 => F24,
            ll::SDLK_EXECUTE             => Execute,
            ll::SDLK_HELP                => Help,
            ll::SDLK_MENU                => Menu,
            ll::SDLK_SELECT              => Select,
            ll::SDLK_STOP                => Stop,
            ll::SDLK_AGAIN               => Again,
            ll::SDLK_UNDO                => Undo,
            ll::SDLK_CUT                 => Cut,
            ll::SDLK_COPY                => Copy,
            ll::SDLK_PASTE               => Paste,
            ll::SDLK_FIND                => Find,
            ll::SDLK_MUTE                => Mute,
            ll::SDLK_VOLUMEUP            => VolumeUp,
            ll::SDLK_VOLUMEDOWN          => VolumeDown,
            ll::SDLK_KPCOMMA             => KpComma,
            ll::SDLK_KPEQUALSAS400       => KpEqualsAS400,
            ll::SDLK_ALTERASE            => AltErase,
            ll::SDLK_SYSREQ              => Sysreq,
            ll::SDLK_CANCEL              => Cancel,
            ll::SDLK_CLEAR               => Clear,
            ll::SDLK_PRIOR               => Prior,
            ll::SDLK_RETURN2             => Return2,
            ll::SDLK_SEPARATOR           => Separator,
            ll::SDLK_OUT                 => Out,
            ll::SDLK_OPER                => Oper,
            ll::SDLK_CLEARAGAIN          => ClearAgain,
            ll::SDLK_CRSEL               => CrSel,
            ll::SDLK_EXSEL               => ExSel,
            ll::SDLK_KP00                => Kp00,
            ll::SDLK_KP000               => Kp000,
            ll::SDLK_THOUSANDSSEPARATOR  => ThousandsSeparator,
            ll::SDLK_DECIMALSEPARATOR    => DecimalSeparator,
            ll::SDLK_CURRENCYUNIT        => CurrencyUnit,
            ll::SDLK_CURRENCYSUBUNIT     => CurrencySubUnit,
            ll::SDLK_KPLEFTPAREN         => KpLeftParen,
            ll::SDLK_KPRIGHTPAREN        => KpRightParen,
            ll::SDLK_KPLEFTBRACE         => KpLeftBrace,
            ll::SDLK_KPRIGHTBRACE        => KpRightBrace,
            ll::SDLK_KPTAB               => KpTab,
            ll::SDLK_KPBACKSPACE         => KpBackspace,
            ll::SDLK_KPA                 => KpA,
            ll::SDLK_KPB                 => KpB,
            ll::SDLK_KPC                 => KpC,
            ll::SDLK_KPD                 => KpD,
            ll::SDLK_KPE                 => KpE,
            ll::SDLK_KPF                 => KpF,
            ll::SDLK_KPXOR               => KpXor,
            ll::SDLK_KPPOWER             => KpPower,
            ll::SDLK_KPPERCENT           => KpPercent,
            ll::SDLK_KPLESS              => KpLess,
            ll::SDLK_KPGREATER           => KpGreater,
            ll::SDLK_KPAMPERSAND         => KpAmpersand,
            ll::SDLK_KPDBLAMPERSAND      => KpDblAmpersand,
            ll::SDLK_KPVERTICALBAR       => KpVerticalBar,
            ll::SDLK_KPDBLVERTICALBAR    => KpDblVerticalBar,
            ll::SDLK_KPCOLON             => KpColon,
            ll::SDLK_KPHASH              => KpHash,
            ll::SDLK_KPSPACE             => KpSpace,
            ll::SDLK_KPAT                => KpAt,
            ll::SDLK_KPEXCLAM            => KpExclam,
            ll::SDLK_KPMEMSTORE          => KpMemStore,
            ll::SDLK_KPMEMRECALL         => KpMemRecall,
            ll::SDLK_KPMEMCLEAR          => KpMemClear,
            ll::SDLK_KPMEMADD            => KpMemAdd,
            ll::SDLK_KPMEMSUBTRACT       => KpMemSubtract,
            ll::SDLK_KPMEMMULTIPLY       => KpMemMultiply,
            ll::SDLK_KPMEMDIVIDE         => KpMemDivide,
            ll::SDLK_KPPLUSMINUS         => KpPlusMinus,
            ll::SDLK_KPCEAR              => KpCear,
            ll::SDLK_KPCLEARENTRY        => KpClearEntry,
            ll::SDLK_KPBINARY            => KpBinary,
            ll::SDLK_KPOCTAL             => KpOctal,
            ll::SDLK_KPDECIMAL           => KpDecimal,
            ll::SDLK_KPHEXADECIMAL       => KpHexadecimal,
            ll::SDLK_LCTRL               => LCtrl,
            ll::SDLK_LSHIFT              => LShift,
            ll::SDLK_LALT                => LAlt,
            ll::SDLK_LGUI                => LGui,
            ll::SDLK_RCTRL               => RCtrl,
            ll::SDLK_RSHIFT              => RShift,
            ll::SDLK_RALT                => RAlt,
            ll::SDLK_RGUI                => RGui,
            ll::SDLK_MODE                => Mode,
            ll::SDLK_AUDIONEXT           => AudioNext,
            ll::SDLK_AUDIOPREV           => AudioPrev,
            ll::SDLK_AUDIOSTOP           => AudioStop,
            ll::SDLK_AUDIOPLAY           => AudioPlay,
            ll::SDLK_AUDIOMUTE           => AudioMute,
            ll::SDLK_MEDIASELECT         => MediaSelect,
            ll::SDLK_WWW                 => Www,
            ll::SDLK_MAIL                => Mail,
            ll::SDLK_CALCULATOR          => Calculator,
            ll::SDLK_COMPUTER            => Computer,
            ll::SDLK_ACSEARCH            => AcSearch,
            ll::SDLK_ACHOME              => AcHome,
            ll::SDLK_ACBACK              => AcBack,
            ll::SDLK_ACFORWARD           => AcForward,
            ll::SDLK_ACSTOP              => AcStop,
            ll::SDLK_ACREFRESH           => AcRefresh,
            ll::SDLK_ACBOOKMARKS         => AcBookmarks,
            ll::SDLK_BRIGHTNESSDOWN      => BrightnessDown,
            ll::SDLK_BRIGHTNESSUP        => BrightnessUp,
            ll::SDLK_DISPLAYSWITCH       => DisplaySwitch,
            ll::SDLK_KBDILLUMTOGGLE      => KbdIllumToggle,
            ll::SDLK_KBDILLUMDOWN        => KbdIllumDown,
            ll::SDLK_KBDILLUMUP          => KbdIllumUp,
            ll::SDLK_EJECT               => Eject,
            ll::SDLK_SLEEP               => Sleep,
            _                            => return None,
        })
    }

    fn from_u64(n: u64) -> Option<KeyCode> {
        FromPrimitive::from_i64(n as i64)
    }
}