rich_sdl2_rust/event/keyboard/
key_code.rs

1//! Virtual key codes corresponded to physical scan codes.
2
3#![allow(missing_docs)]
4
5use std::ffi::{CStr, CString};
6
7use crate::{bind, EnumInt};
8
9use super::scan_code::ScanCode;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12#[non_exhaustive]
13pub enum KeyCode {
14    Unknown,
15    Return,
16    Escape,
17    Backspace,
18    Tab,
19    Space,
20    Exclaim,
21    Quotedbl,
22    Hash,
23    Percent,
24    Dollar,
25    Ampersand,
26    Quote,
27    Leftparen,
28    Rightparen,
29    Asterisk,
30    Plus,
31    Comma,
32    Minus,
33    Period,
34    Slash,
35    Num0,
36    Num1,
37    Num2,
38    Num3,
39    Num4,
40    Num5,
41    Num6,
42    Num7,
43    Num8,
44    Num9,
45    Colon,
46    Semicolon,
47    Less,
48    Equals,
49    Greater,
50    Question,
51    At,
52    LeftBracket,
53    Backslash,
54    RightBracket,
55    Caret,
56    Underscore,
57    Backquote,
58    A,
59    B,
60    C,
61    D,
62    E,
63    F,
64    G,
65    H,
66    I,
67    J,
68    K,
69    L,
70    M,
71    N,
72    O,
73    P,
74    Q,
75    R,
76    S,
77    T,
78    U,
79    V,
80    W,
81    X,
82    Y,
83    Z,
84    CapsLock,
85    F1,
86    F2,
87    F3,
88    F4,
89    F5,
90    F6,
91    F7,
92    F8,
93    F9,
94    F10,
95    F11,
96    F12,
97    PrintScreen,
98    ScrollLock,
99    Pause,
100    Insert,
101    Home,
102    PageUp,
103    Delete,
104    End,
105    PageDown,
106    Right,
107    Left,
108    Down,
109    Up,
110    NumLockClear,
111    KeypadDivide,
112    KeypadMultiply,
113    KeypadMinus,
114    KeypadPlus,
115    KeypadEnter,
116    Keypad1,
117    Keypad2,
118    Keypad3,
119    Keypad4,
120    Keypad5,
121    Keypad6,
122    Keypad7,
123    Keypad8,
124    Keypad9,
125    Keypad0,
126    KeypadPeriod,
127    Application,
128    Power,
129    KeypadEquals,
130    F13,
131    F14,
132    F15,
133    F16,
134    F17,
135    F18,
136    F19,
137    F20,
138    F21,
139    F22,
140    F23,
141    F24,
142    Execute,
143    Help,
144    Menu,
145    Select,
146    Stop,
147    Again,
148    Undo,
149    Cut,
150    Copy,
151    Paste,
152    Find,
153    Mute,
154    VolumeUp,
155    VolumeDown,
156    KeypadComma,
157    KeypadEqualsAs400,
158    Alterase,
159    SysReq,
160    Cancel,
161    Clear,
162    Prior,
163    Return2,
164    Separator,
165    Out,
166    Oper,
167    ClearAgain,
168    CrSel,
169    ExSel,
170    Keypad00,
171    Keypad000,
172    ThousandsSeparator,
173    DecimalSeparator,
174    CurrencyUnit,
175    CurrencySubunit,
176    KeypadLeftParen,
177    KeypadRightParen,
178    KeypadLeftBrace,
179    KeypadRightBrace,
180    KeypadTab,
181    KeypadBackspace,
182    KeypadA,
183    KeypadB,
184    KeypadC,
185    KeypadD,
186    KeypadE,
187    KeypadF,
188    KeypadXor,
189    KeypadPower,
190    KeypadPercent,
191    KeypadLess,
192    KeypadGreater,
193    KeypadAmpersand,
194    KeypadDblAmpersand,
195    KeypadVerticalBar,
196    KeypadDblverticalBar,
197    KeypadColon,
198    KeypadHash,
199    KeypadSpace,
200    KeypadAt,
201    KeypadExclam,
202    KeypadMemStore,
203    KeypadMemRecall,
204    KeypadMemClear,
205    KeypadMemAdd,
206    KeypadMemSubtract,
207    KeypadMemMultiply,
208    KeypadMemDivide,
209    KeypadPlusMinus,
210    KeypadClear,
211    KeypadClearEntry,
212    KeypadBinary,
213    KeypadOctal,
214    KeypadDecimal,
215    KeypadHexadecimal,
216    LCtrl,
217    LShift,
218    LAlt,
219    LGui,
220    RCtrl,
221    RShift,
222    RAlt,
223    RGui,
224    Mode,
225    AudioNext,
226    AudioPrev,
227    AudioStop,
228    AudioPlay,
229    AudioMute,
230    MediaSelect,
231    Www,
232    Mail,
233    Calculator,
234    Computer,
235    ApplicationSearch,
236    ApplicationHome,
237    ApplicationBack,
238    ApplicationForward,
239    ApplicationStop,
240    ApplicationRefresh,
241    ApplicationBookmarks,
242    BrightnessDown,
243    BrightnessUp,
244    DisplaySwitch,
245    KeyboardIllumToggle,
246    KeyboardIllumDown,
247    KeyboardIllumUp,
248    Eject,
249    Sleep,
250    App1,
251    App2,
252    AudioRewind,
253    AudioFastForward,
254}
255
256impl KeyCode {
257    #[must_use]
258    pub fn from_name(name: &str) -> Self {
259        let c_str = CString::new(name).expect("name must be a valid string");
260        unsafe { bind::SDL_GetKeyFromName(c_str.as_ptr()) }.into()
261    }
262
263    #[must_use]
264    pub fn name(&self) -> Option<String> {
265        let name: String = unsafe { CStr::from_ptr(bind::SDL_GetKeyName(self.as_raw())) }
266            .to_str()
267            .unwrap()
268            .into();
269        (!name.is_empty()).then(|| name)
270    }
271
272    pub(crate) fn as_raw(self) -> bind::SDL_Keycode {
273        (match self {
274            KeyCode::Unknown => bind::SDLK_UNKNOWN,
275            KeyCode::Return => bind::SDLK_RETURN,
276            KeyCode::Escape => bind::SDLK_ESCAPE,
277            KeyCode::Backspace => bind::SDLK_BACKSPACE,
278            KeyCode::Tab => bind::SDLK_TAB,
279            KeyCode::Space => bind::SDLK_SPACE,
280            KeyCode::Exclaim => bind::SDLK_EXCLAIM,
281            KeyCode::Quotedbl => bind::SDLK_QUOTEDBL,
282            KeyCode::Hash => bind::SDLK_HASH,
283            KeyCode::Percent => bind::SDLK_PERCENT,
284            KeyCode::Dollar => bind::SDLK_DOLLAR,
285            KeyCode::Ampersand => bind::SDLK_AMPERSAND,
286            KeyCode::Quote => bind::SDLK_QUOTE,
287            KeyCode::Leftparen => bind::SDLK_LEFTPAREN,
288            KeyCode::Rightparen => bind::SDLK_RIGHTPAREN,
289            KeyCode::Asterisk => bind::SDLK_ASTERISK,
290            KeyCode::Plus => bind::SDLK_PLUS,
291            KeyCode::Comma => bind::SDLK_COMMA,
292            KeyCode::Minus => bind::SDLK_MINUS,
293            KeyCode::Period => bind::SDLK_PERIOD,
294            KeyCode::Slash => bind::SDLK_SLASH,
295            KeyCode::Num0 => bind::SDLK_0,
296            KeyCode::Num1 => bind::SDLK_1,
297            KeyCode::Num2 => bind::SDLK_2,
298            KeyCode::Num3 => bind::SDLK_3,
299            KeyCode::Num4 => bind::SDLK_4,
300            KeyCode::Num5 => bind::SDLK_5,
301            KeyCode::Num6 => bind::SDLK_6,
302            KeyCode::Num7 => bind::SDLK_7,
303            KeyCode::Num8 => bind::SDLK_8,
304            KeyCode::Num9 => bind::SDLK_9,
305            KeyCode::Colon => bind::SDLK_COLON,
306            KeyCode::Semicolon => bind::SDLK_SEMICOLON,
307            KeyCode::Less => bind::SDLK_LESS,
308            KeyCode::Equals => bind::SDLK_EQUALS,
309            KeyCode::Greater => bind::SDLK_GREATER,
310            KeyCode::Question => bind::SDLK_QUESTION,
311            KeyCode::At => bind::SDLK_AT,
312            KeyCode::LeftBracket => bind::SDLK_LEFTBRACKET,
313            KeyCode::Backslash => bind::SDLK_BACKSLASH,
314            KeyCode::RightBracket => bind::SDLK_RIGHTBRACKET,
315            KeyCode::Caret => bind::SDLK_CARET,
316            KeyCode::Underscore => bind::SDLK_UNDERSCORE,
317            KeyCode::Backquote => bind::SDLK_BACKQUOTE,
318            KeyCode::A => bind::SDLK_a,
319            KeyCode::B => bind::SDLK_b,
320            KeyCode::C => bind::SDLK_c,
321            KeyCode::D => bind::SDLK_d,
322            KeyCode::E => bind::SDLK_e,
323            KeyCode::F => bind::SDLK_f,
324            KeyCode::G => bind::SDLK_g,
325            KeyCode::H => bind::SDLK_h,
326            KeyCode::I => bind::SDLK_i,
327            KeyCode::J => bind::SDLK_j,
328            KeyCode::K => bind::SDLK_k,
329            KeyCode::L => bind::SDLK_l,
330            KeyCode::M => bind::SDLK_m,
331            KeyCode::N => bind::SDLK_n,
332            KeyCode::O => bind::SDLK_o,
333            KeyCode::P => bind::SDLK_p,
334            KeyCode::Q => bind::SDLK_q,
335            KeyCode::R => bind::SDLK_r,
336            KeyCode::S => bind::SDLK_s,
337            KeyCode::T => bind::SDLK_t,
338            KeyCode::U => bind::SDLK_u,
339            KeyCode::V => bind::SDLK_v,
340            KeyCode::W => bind::SDLK_w,
341            KeyCode::X => bind::SDLK_x,
342            KeyCode::Y => bind::SDLK_y,
343            KeyCode::Z => bind::SDLK_z,
344            KeyCode::CapsLock => bind::SDLK_CAPSLOCK,
345            KeyCode::F1 => bind::SDLK_F1,
346            KeyCode::F2 => bind::SDLK_F2,
347            KeyCode::F3 => bind::SDLK_F3,
348            KeyCode::F4 => bind::SDLK_F4,
349            KeyCode::F5 => bind::SDLK_F5,
350            KeyCode::F6 => bind::SDLK_F6,
351            KeyCode::F7 => bind::SDLK_F7,
352            KeyCode::F8 => bind::SDLK_F8,
353            KeyCode::F9 => bind::SDLK_F9,
354            KeyCode::F10 => bind::SDLK_F10,
355            KeyCode::F11 => bind::SDLK_F11,
356            KeyCode::F12 => bind::SDLK_F12,
357            KeyCode::PrintScreen => bind::SDLK_PRINTSCREEN,
358            KeyCode::ScrollLock => bind::SDLK_SCROLLLOCK,
359            KeyCode::Pause => bind::SDLK_PAUSE,
360            KeyCode::Insert => bind::SDLK_INSERT,
361            KeyCode::Home => bind::SDLK_HOME,
362            KeyCode::PageUp => bind::SDLK_PAGEUP,
363            KeyCode::Delete => bind::SDLK_DELETE,
364            KeyCode::End => bind::SDLK_END,
365            KeyCode::PageDown => bind::SDLK_PAGEDOWN,
366            KeyCode::Right => bind::SDLK_RIGHT,
367            KeyCode::Left => bind::SDLK_LEFT,
368            KeyCode::Down => bind::SDLK_DOWN,
369            KeyCode::Up => bind::SDLK_UP,
370            KeyCode::NumLockClear => bind::SDLK_NUMLOCKCLEAR,
371            KeyCode::KeypadDivide => bind::SDLK_KP_DIVIDE,
372            KeyCode::KeypadMultiply => bind::SDLK_KP_MULTIPLY,
373            KeyCode::KeypadMinus => bind::SDLK_KP_MINUS,
374            KeyCode::KeypadPlus => bind::SDLK_KP_PLUS,
375            KeyCode::KeypadEnter => bind::SDLK_KP_ENTER,
376            KeyCode::Keypad1 => bind::SDLK_KP_1,
377            KeyCode::Keypad2 => bind::SDLK_KP_2,
378            KeyCode::Keypad3 => bind::SDLK_KP_3,
379            KeyCode::Keypad4 => bind::SDLK_KP_4,
380            KeyCode::Keypad5 => bind::SDLK_KP_5,
381            KeyCode::Keypad6 => bind::SDLK_KP_6,
382            KeyCode::Keypad7 => bind::SDLK_KP_7,
383            KeyCode::Keypad8 => bind::SDLK_KP_8,
384            KeyCode::Keypad9 => bind::SDLK_KP_9,
385            KeyCode::Keypad0 => bind::SDLK_KP_0,
386            KeyCode::KeypadPeriod => bind::SDLK_KP_PERIOD,
387            KeyCode::Application => bind::SDLK_APPLICATION,
388            KeyCode::Power => bind::SDLK_POWER,
389            KeyCode::KeypadEquals => bind::SDLK_KP_EQUALS,
390            KeyCode::F13 => bind::SDLK_F13,
391            KeyCode::F14 => bind::SDLK_F14,
392            KeyCode::F15 => bind::SDLK_F15,
393            KeyCode::F16 => bind::SDLK_F16,
394            KeyCode::F17 => bind::SDLK_F17,
395            KeyCode::F18 => bind::SDLK_F18,
396            KeyCode::F19 => bind::SDLK_F19,
397            KeyCode::F20 => bind::SDLK_F20,
398            KeyCode::F21 => bind::SDLK_F21,
399            KeyCode::F22 => bind::SDLK_F22,
400            KeyCode::F23 => bind::SDLK_F23,
401            KeyCode::F24 => bind::SDLK_F24,
402            KeyCode::Execute => bind::SDLK_EXECUTE,
403            KeyCode::Help => bind::SDLK_HELP,
404            KeyCode::Menu => bind::SDLK_MENU,
405            KeyCode::Select => bind::SDLK_SELECT,
406            KeyCode::Stop => bind::SDLK_STOP,
407            KeyCode::Again => bind::SDLK_AGAIN,
408            KeyCode::Undo => bind::SDLK_UNDO,
409            KeyCode::Cut => bind::SDLK_CUT,
410            KeyCode::Copy => bind::SDLK_COPY,
411            KeyCode::Paste => bind::SDLK_PASTE,
412            KeyCode::Find => bind::SDLK_FIND,
413            KeyCode::Mute => bind::SDLK_MUTE,
414            KeyCode::VolumeUp => bind::SDLK_VOLUMEUP,
415            KeyCode::VolumeDown => bind::SDLK_VOLUMEDOWN,
416            KeyCode::KeypadComma => bind::SDLK_KP_COMMA,
417            KeyCode::KeypadEqualsAs400 => bind::SDLK_KP_EQUALSAS400,
418            KeyCode::Alterase => bind::SDLK_ALTERASE,
419            KeyCode::SysReq => bind::SDLK_SYSREQ,
420            KeyCode::Cancel => bind::SDLK_CANCEL,
421            KeyCode::Clear => bind::SDLK_CLEAR,
422            KeyCode::Prior => bind::SDLK_PRIOR,
423            KeyCode::Return2 => bind::SDLK_RETURN2,
424            KeyCode::Separator => bind::SDLK_SEPARATOR,
425            KeyCode::Out => bind::SDLK_OUT,
426            KeyCode::Oper => bind::SDLK_OPER,
427            KeyCode::ClearAgain => bind::SDLK_CLEARAGAIN,
428            KeyCode::CrSel => bind::SDLK_CRSEL,
429            KeyCode::ExSel => bind::SDLK_EXSEL,
430            KeyCode::Keypad00 => bind::SDLK_KP_00,
431            KeyCode::Keypad000 => bind::SDLK_KP_000,
432            KeyCode::ThousandsSeparator => bind::SDLK_THOUSANDSSEPARATOR,
433            KeyCode::DecimalSeparator => bind::SDLK_DECIMALSEPARATOR,
434            KeyCode::CurrencyUnit => bind::SDLK_CURRENCYUNIT,
435            KeyCode::CurrencySubunit => bind::SDLK_CURRENCYSUBUNIT,
436            KeyCode::KeypadLeftParen => bind::SDLK_KP_LEFTPAREN,
437            KeyCode::KeypadRightParen => bind::SDLK_KP_RIGHTPAREN,
438            KeyCode::KeypadLeftBrace => bind::SDLK_KP_LEFTBRACE,
439            KeyCode::KeypadRightBrace => bind::SDLK_KP_RIGHTBRACE,
440            KeyCode::KeypadTab => bind::SDLK_KP_TAB,
441            KeyCode::KeypadBackspace => bind::SDLK_KP_BACKSPACE,
442            KeyCode::KeypadA => bind::SDLK_KP_A,
443            KeyCode::KeypadB => bind::SDLK_KP_B,
444            KeyCode::KeypadC => bind::SDLK_KP_C,
445            KeyCode::KeypadD => bind::SDLK_KP_D,
446            KeyCode::KeypadE => bind::SDLK_KP_E,
447            KeyCode::KeypadF => bind::SDLK_KP_F,
448            KeyCode::KeypadXor => bind::SDLK_KP_XOR,
449            KeyCode::KeypadPower => bind::SDLK_KP_POWER,
450            KeyCode::KeypadPercent => bind::SDLK_KP_PERCENT,
451            KeyCode::KeypadLess => bind::SDLK_KP_LESS,
452            KeyCode::KeypadGreater => bind::SDLK_KP_GREATER,
453            KeyCode::KeypadAmpersand => bind::SDLK_KP_AMPERSAND,
454            KeyCode::KeypadDblAmpersand => bind::SDLK_KP_DBLAMPERSAND,
455            KeyCode::KeypadVerticalBar => bind::SDLK_KP_VERTICALBAR,
456            KeyCode::KeypadDblverticalBar => bind::SDLK_KP_DBLVERTICALBAR,
457            KeyCode::KeypadColon => bind::SDLK_KP_COLON,
458            KeyCode::KeypadHash => bind::SDLK_KP_HASH,
459            KeyCode::KeypadSpace => bind::SDLK_KP_SPACE,
460            KeyCode::KeypadAt => bind::SDLK_KP_AT,
461            KeyCode::KeypadExclam => bind::SDLK_KP_EXCLAM,
462            KeyCode::KeypadMemStore => bind::SDLK_KP_MEMSTORE,
463            KeyCode::KeypadMemRecall => bind::SDLK_KP_MEMRECALL,
464            KeyCode::KeypadMemClear => bind::SDLK_KP_MEMCLEAR,
465            KeyCode::KeypadMemAdd => bind::SDLK_KP_MEMADD,
466            KeyCode::KeypadMemSubtract => bind::SDLK_KP_MEMSUBTRACT,
467            KeyCode::KeypadMemMultiply => bind::SDLK_KP_MEMMULTIPLY,
468            KeyCode::KeypadMemDivide => bind::SDLK_KP_MEMDIVIDE,
469            KeyCode::KeypadPlusMinus => bind::SDLK_KP_PLUSMINUS,
470            KeyCode::KeypadClear => bind::SDLK_KP_CLEAR,
471            KeyCode::KeypadClearEntry => bind::SDLK_KP_CLEARENTRY,
472            KeyCode::KeypadBinary => bind::SDLK_KP_BINARY,
473            KeyCode::KeypadOctal => bind::SDLK_KP_OCTAL,
474            KeyCode::KeypadDecimal => bind::SDLK_KP_DECIMAL,
475            KeyCode::KeypadHexadecimal => bind::SDLK_KP_HEXADECIMAL,
476            KeyCode::LCtrl => bind::SDLK_LCTRL,
477            KeyCode::LShift => bind::SDLK_LSHIFT,
478            KeyCode::LAlt => bind::SDLK_LALT,
479            KeyCode::LGui => bind::SDLK_LGUI,
480            KeyCode::RCtrl => bind::SDLK_RCTRL,
481            KeyCode::RShift => bind::SDLK_RSHIFT,
482            KeyCode::RAlt => bind::SDLK_RALT,
483            KeyCode::RGui => bind::SDLK_RGUI,
484            KeyCode::Mode => bind::SDLK_MODE,
485            KeyCode::AudioNext => bind::SDLK_AUDIONEXT,
486            KeyCode::AudioPrev => bind::SDLK_AUDIOPREV,
487            KeyCode::AudioStop => bind::SDLK_AUDIOSTOP,
488            KeyCode::AudioPlay => bind::SDLK_AUDIOPLAY,
489            KeyCode::AudioMute => bind::SDLK_AUDIOMUTE,
490            KeyCode::MediaSelect => bind::SDLK_MEDIASELECT,
491            KeyCode::Www => bind::SDLK_WWW,
492            KeyCode::Mail => bind::SDLK_MAIL,
493            KeyCode::Calculator => bind::SDLK_CALCULATOR,
494            KeyCode::Computer => bind::SDLK_COMPUTER,
495            KeyCode::ApplicationSearch => bind::SDLK_AC_SEARCH,
496            KeyCode::ApplicationHome => bind::SDLK_AC_HOME,
497            KeyCode::ApplicationBack => bind::SDLK_AC_BACK,
498            KeyCode::ApplicationForward => bind::SDLK_AC_FORWARD,
499            KeyCode::ApplicationStop => bind::SDLK_AC_STOP,
500            KeyCode::ApplicationRefresh => bind::SDLK_AC_REFRESH,
501            KeyCode::ApplicationBookmarks => bind::SDLK_AC_BOOKMARKS,
502            KeyCode::BrightnessDown => bind::SDLK_BRIGHTNESSDOWN,
503            KeyCode::BrightnessUp => bind::SDLK_BRIGHTNESSUP,
504            KeyCode::DisplaySwitch => bind::SDLK_DISPLAYSWITCH,
505            KeyCode::KeyboardIllumToggle => bind::SDLK_KBDILLUMTOGGLE,
506            KeyCode::KeyboardIllumDown => bind::SDLK_KBDILLUMDOWN,
507            KeyCode::KeyboardIllumUp => bind::SDLK_KBDILLUMUP,
508            KeyCode::Eject => bind::SDLK_EJECT,
509            KeyCode::Sleep => bind::SDLK_SLEEP,
510            KeyCode::App1 => bind::SDLK_APP1,
511            KeyCode::App2 => bind::SDLK_APP2,
512            KeyCode::AudioRewind => bind::SDLK_AUDIOREWIND,
513            KeyCode::AudioFastForward => bind::SDLK_AUDIOFASTFORWARD,
514        }) as bind::SDL_Keycode
515    }
516}
517
518impl From<ScanCode> for KeyCode {
519    fn from(scan_code: ScanCode) -> Self {
520        let raw = scan_code.as_raw();
521        unsafe { bind::SDL_GetKeyFromScancode(raw) }.into()
522    }
523}
524
525impl From<bind::SDL_Keycode> for KeyCode {
526    fn from(code: bind::SDL_Keycode) -> Self {
527        match code as EnumInt {
528            bind::SDLK_RETURN => KeyCode::Return,
529            bind::SDLK_ESCAPE => KeyCode::Escape,
530            bind::SDLK_BACKSPACE => KeyCode::Backspace,
531            bind::SDLK_TAB => KeyCode::Tab,
532            bind::SDLK_SPACE => KeyCode::Space,
533            bind::SDLK_EXCLAIM => KeyCode::Exclaim,
534            bind::SDLK_QUOTEDBL => KeyCode::Quotedbl,
535            bind::SDLK_HASH => KeyCode::Hash,
536            bind::SDLK_PERCENT => KeyCode::Percent,
537            bind::SDLK_DOLLAR => KeyCode::Dollar,
538            bind::SDLK_AMPERSAND => KeyCode::Ampersand,
539            bind::SDLK_QUOTE => KeyCode::Quote,
540            bind::SDLK_LEFTPAREN => KeyCode::Leftparen,
541            bind::SDLK_RIGHTPAREN => KeyCode::Rightparen,
542            bind::SDLK_ASTERISK => KeyCode::Asterisk,
543            bind::SDLK_PLUS => KeyCode::Plus,
544            bind::SDLK_COMMA => KeyCode::Comma,
545            bind::SDLK_MINUS => KeyCode::Minus,
546            bind::SDLK_PERIOD => KeyCode::Period,
547            bind::SDLK_SLASH => KeyCode::Slash,
548            bind::SDLK_0 => KeyCode::Num0,
549            bind::SDLK_1 => KeyCode::Num1,
550            bind::SDLK_2 => KeyCode::Num2,
551            bind::SDLK_3 => KeyCode::Num3,
552            bind::SDLK_4 => KeyCode::Num4,
553            bind::SDLK_5 => KeyCode::Num5,
554            bind::SDLK_6 => KeyCode::Num6,
555            bind::SDLK_7 => KeyCode::Num7,
556            bind::SDLK_8 => KeyCode::Num8,
557            bind::SDLK_9 => KeyCode::Num9,
558            bind::SDLK_COLON => KeyCode::Colon,
559            bind::SDLK_SEMICOLON => KeyCode::Semicolon,
560            bind::SDLK_LESS => KeyCode::Less,
561            bind::SDLK_EQUALS => KeyCode::Equals,
562            bind::SDLK_GREATER => KeyCode::Greater,
563            bind::SDLK_QUESTION => KeyCode::Question,
564            bind::SDLK_AT => KeyCode::At,
565            bind::SDLK_LEFTBRACKET => KeyCode::LeftBracket,
566            bind::SDLK_BACKSLASH => KeyCode::Backslash,
567            bind::SDLK_RIGHTBRACKET => KeyCode::RightBracket,
568            bind::SDLK_CARET => KeyCode::Caret,
569            bind::SDLK_UNDERSCORE => KeyCode::Underscore,
570            bind::SDLK_BACKQUOTE => KeyCode::Backquote,
571            bind::SDLK_a => KeyCode::A,
572            bind::SDLK_b => KeyCode::B,
573            bind::SDLK_c => KeyCode::C,
574            bind::SDLK_d => KeyCode::D,
575            bind::SDLK_e => KeyCode::E,
576            bind::SDLK_f => KeyCode::F,
577            bind::SDLK_g => KeyCode::G,
578            bind::SDLK_h => KeyCode::H,
579            bind::SDLK_i => KeyCode::I,
580            bind::SDLK_j => KeyCode::J,
581            bind::SDLK_k => KeyCode::K,
582            bind::SDLK_l => KeyCode::L,
583            bind::SDLK_m => KeyCode::M,
584            bind::SDLK_n => KeyCode::N,
585            bind::SDLK_o => KeyCode::O,
586            bind::SDLK_p => KeyCode::P,
587            bind::SDLK_q => KeyCode::Q,
588            bind::SDLK_r => KeyCode::R,
589            bind::SDLK_s => KeyCode::S,
590            bind::SDLK_t => KeyCode::T,
591            bind::SDLK_u => KeyCode::U,
592            bind::SDLK_v => KeyCode::V,
593            bind::SDLK_w => KeyCode::W,
594            bind::SDLK_x => KeyCode::X,
595            bind::SDLK_y => KeyCode::Y,
596            bind::SDLK_z => KeyCode::Z,
597            bind::SDLK_CAPSLOCK => KeyCode::CapsLock,
598            bind::SDLK_F1 => KeyCode::F1,
599            bind::SDLK_F2 => KeyCode::F2,
600            bind::SDLK_F3 => KeyCode::F3,
601            bind::SDLK_F4 => KeyCode::F4,
602            bind::SDLK_F5 => KeyCode::F5,
603            bind::SDLK_F6 => KeyCode::F6,
604            bind::SDLK_F7 => KeyCode::F7,
605            bind::SDLK_F8 => KeyCode::F8,
606            bind::SDLK_F9 => KeyCode::F9,
607            bind::SDLK_F10 => KeyCode::F10,
608            bind::SDLK_F11 => KeyCode::F11,
609            bind::SDLK_F12 => KeyCode::F12,
610            bind::SDLK_PRINTSCREEN => KeyCode::PrintScreen,
611            bind::SDLK_SCROLLLOCK => KeyCode::ScrollLock,
612            bind::SDLK_PAUSE => KeyCode::Pause,
613            bind::SDLK_INSERT => KeyCode::Insert,
614            bind::SDLK_HOME => KeyCode::Home,
615            bind::SDLK_PAGEUP => KeyCode::PageUp,
616            bind::SDLK_DELETE => KeyCode::Delete,
617            bind::SDLK_END => KeyCode::End,
618            bind::SDLK_PAGEDOWN => KeyCode::PageDown,
619            bind::SDLK_RIGHT => KeyCode::Right,
620            bind::SDLK_LEFT => KeyCode::Left,
621            bind::SDLK_DOWN => KeyCode::Down,
622            bind::SDLK_UP => KeyCode::Up,
623            bind::SDLK_NUMLOCKCLEAR => KeyCode::NumLockClear,
624            bind::SDLK_KP_DIVIDE => KeyCode::KeypadDivide,
625            bind::SDLK_KP_MULTIPLY => KeyCode::KeypadMultiply,
626            bind::SDLK_KP_MINUS => KeyCode::KeypadMinus,
627            bind::SDLK_KP_PLUS => KeyCode::KeypadPlus,
628            bind::SDLK_KP_ENTER => KeyCode::KeypadEnter,
629            bind::SDLK_KP_1 => KeyCode::Keypad1,
630            bind::SDLK_KP_2 => KeyCode::Keypad2,
631            bind::SDLK_KP_3 => KeyCode::Keypad3,
632            bind::SDLK_KP_4 => KeyCode::Keypad4,
633            bind::SDLK_KP_5 => KeyCode::Keypad5,
634            bind::SDLK_KP_6 => KeyCode::Keypad6,
635            bind::SDLK_KP_7 => KeyCode::Keypad7,
636            bind::SDLK_KP_8 => KeyCode::Keypad8,
637            bind::SDLK_KP_9 => KeyCode::Keypad9,
638            bind::SDLK_KP_0 => KeyCode::Keypad0,
639            bind::SDLK_KP_PERIOD => KeyCode::KeypadPeriod,
640            bind::SDLK_APPLICATION => KeyCode::Application,
641            bind::SDLK_POWER => KeyCode::Power,
642            bind::SDLK_KP_EQUALS => KeyCode::KeypadEquals,
643            bind::SDLK_F13 => KeyCode::F13,
644            bind::SDLK_F14 => KeyCode::F14,
645            bind::SDLK_F15 => KeyCode::F15,
646            bind::SDLK_F16 => KeyCode::F16,
647            bind::SDLK_F17 => KeyCode::F17,
648            bind::SDLK_F18 => KeyCode::F18,
649            bind::SDLK_F19 => KeyCode::F19,
650            bind::SDLK_F20 => KeyCode::F20,
651            bind::SDLK_F21 => KeyCode::F21,
652            bind::SDLK_F22 => KeyCode::F22,
653            bind::SDLK_F23 => KeyCode::F23,
654            bind::SDLK_F24 => KeyCode::F24,
655            bind::SDLK_EXECUTE => KeyCode::Execute,
656            bind::SDLK_HELP => KeyCode::Help,
657            bind::SDLK_MENU => KeyCode::Menu,
658            bind::SDLK_SELECT => KeyCode::Select,
659            bind::SDLK_STOP => KeyCode::Stop,
660            bind::SDLK_AGAIN => KeyCode::Again,
661            bind::SDLK_UNDO => KeyCode::Undo,
662            bind::SDLK_CUT => KeyCode::Cut,
663            bind::SDLK_COPY => KeyCode::Copy,
664            bind::SDLK_PASTE => KeyCode::Paste,
665            bind::SDLK_FIND => KeyCode::Find,
666            bind::SDLK_MUTE => KeyCode::Mute,
667            bind::SDLK_VOLUMEUP => KeyCode::VolumeUp,
668            bind::SDLK_VOLUMEDOWN => KeyCode::VolumeDown,
669            bind::SDLK_KP_COMMA => KeyCode::KeypadComma,
670            bind::SDLK_KP_EQUALSAS400 => KeyCode::KeypadEqualsAs400,
671            bind::SDLK_ALTERASE => KeyCode::Alterase,
672            bind::SDLK_SYSREQ => KeyCode::SysReq,
673            bind::SDLK_CANCEL => KeyCode::Cancel,
674            bind::SDLK_CLEAR => KeyCode::Clear,
675            bind::SDLK_PRIOR => KeyCode::Prior,
676            bind::SDLK_RETURN2 => KeyCode::Return2,
677            bind::SDLK_SEPARATOR => KeyCode::Separator,
678            bind::SDLK_OUT => KeyCode::Out,
679            bind::SDLK_OPER => KeyCode::Oper,
680            bind::SDLK_CLEARAGAIN => KeyCode::ClearAgain,
681            bind::SDLK_CRSEL => KeyCode::CrSel,
682            bind::SDLK_EXSEL => KeyCode::ExSel,
683            bind::SDLK_KP_00 => KeyCode::Keypad00,
684            bind::SDLK_KP_000 => KeyCode::Keypad000,
685            bind::SDLK_THOUSANDSSEPARATOR => KeyCode::ThousandsSeparator,
686            bind::SDLK_DECIMALSEPARATOR => KeyCode::DecimalSeparator,
687            bind::SDLK_CURRENCYUNIT => KeyCode::CurrencyUnit,
688            bind::SDLK_CURRENCYSUBUNIT => KeyCode::CurrencySubunit,
689            bind::SDLK_KP_LEFTPAREN => KeyCode::KeypadLeftParen,
690            bind::SDLK_KP_RIGHTPAREN => KeyCode::KeypadRightParen,
691            bind::SDLK_KP_LEFTBRACE => KeyCode::KeypadLeftBrace,
692            bind::SDLK_KP_RIGHTBRACE => KeyCode::KeypadRightBrace,
693            bind::SDLK_KP_TAB => KeyCode::KeypadTab,
694            bind::SDLK_KP_BACKSPACE => KeyCode::KeypadBackspace,
695            bind::SDLK_KP_A => KeyCode::KeypadA,
696            bind::SDLK_KP_B => KeyCode::KeypadB,
697            bind::SDLK_KP_C => KeyCode::KeypadC,
698            bind::SDLK_KP_D => KeyCode::KeypadD,
699            bind::SDLK_KP_E => KeyCode::KeypadE,
700            bind::SDLK_KP_F => KeyCode::KeypadF,
701            bind::SDLK_KP_XOR => KeyCode::KeypadXor,
702            bind::SDLK_KP_POWER => KeyCode::KeypadPower,
703            bind::SDLK_KP_PERCENT => KeyCode::KeypadPercent,
704            bind::SDLK_KP_LESS => KeyCode::KeypadLess,
705            bind::SDLK_KP_GREATER => KeyCode::KeypadGreater,
706            bind::SDLK_KP_AMPERSAND => KeyCode::KeypadAmpersand,
707            bind::SDLK_KP_DBLAMPERSAND => KeyCode::KeypadDblAmpersand,
708            bind::SDLK_KP_VERTICALBAR => KeyCode::KeypadVerticalBar,
709            bind::SDLK_KP_DBLVERTICALBAR => KeyCode::KeypadDblverticalBar,
710            bind::SDLK_KP_COLON => KeyCode::KeypadColon,
711            bind::SDLK_KP_HASH => KeyCode::KeypadHash,
712            bind::SDLK_KP_SPACE => KeyCode::KeypadSpace,
713            bind::SDLK_KP_AT => KeyCode::KeypadAt,
714            bind::SDLK_KP_EXCLAM => KeyCode::KeypadExclam,
715            bind::SDLK_KP_MEMSTORE => KeyCode::KeypadMemStore,
716            bind::SDLK_KP_MEMRECALL => KeyCode::KeypadMemRecall,
717            bind::SDLK_KP_MEMCLEAR => KeyCode::KeypadMemClear,
718            bind::SDLK_KP_MEMADD => KeyCode::KeypadMemAdd,
719            bind::SDLK_KP_MEMSUBTRACT => KeyCode::KeypadMemSubtract,
720            bind::SDLK_KP_MEMMULTIPLY => KeyCode::KeypadMemMultiply,
721            bind::SDLK_KP_MEMDIVIDE => KeyCode::KeypadMemDivide,
722            bind::SDLK_KP_PLUSMINUS => KeyCode::KeypadPlusMinus,
723            bind::SDLK_KP_CLEAR => KeyCode::KeypadClear,
724            bind::SDLK_KP_CLEARENTRY => KeyCode::KeypadClearEntry,
725            bind::SDLK_KP_BINARY => KeyCode::KeypadBinary,
726            bind::SDLK_KP_OCTAL => KeyCode::KeypadOctal,
727            bind::SDLK_KP_DECIMAL => KeyCode::KeypadDecimal,
728            bind::SDLK_KP_HEXADECIMAL => KeyCode::KeypadHexadecimal,
729            bind::SDLK_LCTRL => KeyCode::LCtrl,
730            bind::SDLK_LSHIFT => KeyCode::LShift,
731            bind::SDLK_LALT => KeyCode::LAlt,
732            bind::SDLK_LGUI => KeyCode::LGui,
733            bind::SDLK_RCTRL => KeyCode::RCtrl,
734            bind::SDLK_RSHIFT => KeyCode::RShift,
735            bind::SDLK_RALT => KeyCode::RAlt,
736            bind::SDLK_RGUI => KeyCode::RGui,
737            bind::SDLK_MODE => KeyCode::Mode,
738            bind::SDLK_AUDIONEXT => KeyCode::AudioNext,
739            bind::SDLK_AUDIOPREV => KeyCode::AudioPrev,
740            bind::SDLK_AUDIOSTOP => KeyCode::AudioStop,
741            bind::SDLK_AUDIOPLAY => KeyCode::AudioPlay,
742            bind::SDLK_AUDIOMUTE => KeyCode::AudioMute,
743            bind::SDLK_MEDIASELECT => KeyCode::MediaSelect,
744            bind::SDLK_WWW => KeyCode::Www,
745            bind::SDLK_MAIL => KeyCode::Mail,
746            bind::SDLK_CALCULATOR => KeyCode::Calculator,
747            bind::SDLK_COMPUTER => KeyCode::Computer,
748            bind::SDLK_AC_SEARCH => KeyCode::ApplicationSearch,
749            bind::SDLK_AC_HOME => KeyCode::ApplicationHome,
750            bind::SDLK_AC_BACK => KeyCode::ApplicationBack,
751            bind::SDLK_AC_FORWARD => KeyCode::ApplicationForward,
752            bind::SDLK_AC_STOP => KeyCode::ApplicationStop,
753            bind::SDLK_AC_REFRESH => KeyCode::ApplicationRefresh,
754            bind::SDLK_AC_BOOKMARKS => KeyCode::ApplicationBookmarks,
755            bind::SDLK_BRIGHTNESSDOWN => KeyCode::BrightnessDown,
756            bind::SDLK_BRIGHTNESSUP => KeyCode::BrightnessUp,
757            bind::SDLK_DISPLAYSWITCH => KeyCode::DisplaySwitch,
758            bind::SDLK_KBDILLUMTOGGLE => KeyCode::KeyboardIllumToggle,
759            bind::SDLK_KBDILLUMDOWN => KeyCode::KeyboardIllumDown,
760            bind::SDLK_KBDILLUMUP => KeyCode::KeyboardIllumUp,
761            bind::SDLK_EJECT => KeyCode::Eject,
762            bind::SDLK_SLEEP => KeyCode::Sleep,
763            bind::SDLK_APP1 => KeyCode::App1,
764            bind::SDLK_APP2 => KeyCode::App2,
765            bind::SDLK_AUDIOREWIND => KeyCode::AudioRewind,
766            bind::SDLK_AUDIOFASTFORWARD => KeyCode::AudioFastForward,
767            _ => KeyCode::Unknown,
768        }
769    }
770}