sdl3/keyboard/
keycode.rs

1#![allow(unreachable_patterns)]
2
3use libc::c_char;
4use std::ffi::{CStr, CString};
5use std::mem::transmute;
6
7use crate::sys;
8use sys::keycode::*;
9
10#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
11#[repr(i32)]
12pub enum Keycode {
13    ScancodeMask = SDLK_SCANCODE_MASK as i32,
14    Unknown = SDLK_UNKNOWN as i32,
15    Return = SDLK_RETURN as i32,
16    Escape = SDLK_ESCAPE as i32,
17    Backspace = SDLK_BACKSPACE as i32,
18    Tab = SDLK_TAB as i32,
19    Space = SDLK_SPACE as i32,
20    Exclaim = SDLK_EXCLAIM as i32,
21    DblApostrophe = SDLK_DBLAPOSTROPHE as i32,
22    Hash = SDLK_HASH as i32,
23    Dollar = SDLK_DOLLAR as i32,
24    Percent = SDLK_PERCENT as i32,
25    Ampersand = SDLK_AMPERSAND as i32,
26    Apostrophe = SDLK_APOSTROPHE as i32,
27    LeftParen = SDLK_LEFTPAREN as i32,
28    RightParen = SDLK_RIGHTPAREN as i32,
29    Asterisk = SDLK_ASTERISK as i32,
30    Plus = SDLK_PLUS as i32,
31    Comma = SDLK_COMMA as i32,
32    Minus = SDLK_MINUS as i32,
33    Period = SDLK_PERIOD as i32,
34    Slash = SDLK_SLASH as i32,
35    _0 = SDLK_0 as i32,
36    _1 = SDLK_1 as i32,
37    _2 = SDLK_2 as i32,
38    _3 = SDLK_3 as i32,
39    _4 = SDLK_4 as i32,
40    _5 = SDLK_5 as i32,
41    _6 = SDLK_6 as i32,
42    _7 = SDLK_7 as i32,
43    _8 = SDLK_8 as i32,
44    _9 = SDLK_9 as i32,
45    Colon = SDLK_COLON as i32,
46    Semicolon = SDLK_SEMICOLON as i32,
47    Less = SDLK_LESS as i32,
48    Equals = SDLK_EQUALS as i32,
49    Greater = SDLK_GREATER as i32,
50    Question = SDLK_QUESTION as i32,
51    At = SDLK_AT as i32,
52    LeftBracket = SDLK_LEFTBRACKET as i32,
53    Backslash = SDLK_BACKSLASH as i32,
54    RightBracket = SDLK_RIGHTBRACKET as i32,
55    Caret = SDLK_CARET as i32,
56    Underscore = SDLK_UNDERSCORE as i32,
57    Grave = SDLK_GRAVE as i32,
58    A = SDLK_A as i32,
59    B = SDLK_B as i32,
60    C = SDLK_C as i32,
61    D = SDLK_D as i32,
62    E = SDLK_E as i32,
63    F = SDLK_F as i32,
64    G = SDLK_G as i32,
65    H = SDLK_H as i32,
66    I = SDLK_I as i32,
67    J = SDLK_J as i32,
68    K = SDLK_K as i32,
69    L = SDLK_L as i32,
70    M = SDLK_M as i32,
71    N = SDLK_N as i32,
72    O = SDLK_O as i32,
73    P = SDLK_P as i32,
74    Q = SDLK_Q as i32,
75    R = SDLK_R as i32,
76    S = SDLK_S as i32,
77    T = SDLK_T as i32,
78    U = SDLK_U as i32,
79    V = SDLK_V as i32,
80    W = SDLK_W as i32,
81    X = SDLK_X as i32,
82    Y = SDLK_Y as i32,
83    Z = SDLK_Z as i32,
84    LeftBrace = SDLK_LEFTBRACE as i32,
85    Pipe = SDLK_PIPE as i32,
86    RightBrace = SDLK_RIGHTBRACE as i32,
87    Tilde = SDLK_TILDE as i32,
88    Delete = SDLK_DELETE as i32,
89    PlusMinus = SDLK_PLUSMINUS as i32,
90    CapsLock = SDLK_CAPSLOCK as i32,
91    F1 = SDLK_F1 as i32,
92    F2 = SDLK_F2 as i32,
93    F3 = SDLK_F3 as i32,
94    F4 = SDLK_F4 as i32,
95    F5 = SDLK_F5 as i32,
96    F6 = SDLK_F6 as i32,
97    F7 = SDLK_F7 as i32,
98    F8 = SDLK_F8 as i32,
99    F9 = SDLK_F9 as i32,
100    F10 = SDLK_F10 as i32,
101    F11 = SDLK_F11 as i32,
102    F12 = SDLK_F12 as i32,
103    PrintScreen = SDLK_PRINTSCREEN as i32,
104    ScrollLock = SDLK_SCROLLLOCK as i32,
105    Pause = SDLK_PAUSE as i32,
106    Insert = SDLK_INSERT as i32,
107    Home = SDLK_HOME as i32,
108    PageUp = SDLK_PAGEUP as i32,
109    End = SDLK_END as i32,
110    PageDown = SDLK_PAGEDOWN as i32,
111    Right = SDLK_RIGHT as i32,
112    Left = SDLK_LEFT as i32,
113    Down = SDLK_DOWN as i32,
114    Up = SDLK_UP as i32,
115    NumLockClear = SDLK_NUMLOCKCLEAR as i32,
116    KpDivide = SDLK_KP_DIVIDE as i32,
117    KpMultiply = SDLK_KP_MULTIPLY as i32,
118    KpMinus = SDLK_KP_MINUS as i32,
119    KpPlus = SDLK_KP_PLUS as i32,
120    KpEnter = SDLK_KP_ENTER as i32,
121    Kp1 = SDLK_KP_1 as i32,
122    Kp2 = SDLK_KP_2 as i32,
123    Kp3 = SDLK_KP_3 as i32,
124    Kp4 = SDLK_KP_4 as i32,
125    Kp5 = SDLK_KP_5 as i32,
126    Kp6 = SDLK_KP_6 as i32,
127    Kp7 = SDLK_KP_7 as i32,
128    Kp8 = SDLK_KP_8 as i32,
129    Kp9 = SDLK_KP_9 as i32,
130    Kp0 = SDLK_KP_0 as i32,
131    KpPeriod = SDLK_KP_PERIOD as i32,
132    Application = SDLK_APPLICATION as i32,
133    Power = SDLK_POWER as i32,
134    KpEquals = SDLK_KP_EQUALS as i32,
135    F13 = SDLK_F13 as i32,
136    F14 = SDLK_F14 as i32,
137    F15 = SDLK_F15 as i32,
138    F16 = SDLK_F16 as i32,
139    F17 = SDLK_F17 as i32,
140    F18 = SDLK_F18 as i32,
141    F19 = SDLK_F19 as i32,
142    F20 = SDLK_F20 as i32,
143    F21 = SDLK_F21 as i32,
144    F22 = SDLK_F22 as i32,
145    F23 = SDLK_F23 as i32,
146    F24 = SDLK_F24 as i32,
147    Execute = SDLK_EXECUTE as i32,
148    Help = SDLK_HELP as i32,
149    Menu = SDLK_MENU as i32,
150    Select = SDLK_SELECT as i32,
151    Stop = SDLK_STOP as i32,
152    Again = SDLK_AGAIN as i32,
153    Undo = SDLK_UNDO as i32,
154    Cut = SDLK_CUT as i32,
155    Copy = SDLK_COPY as i32,
156    Paste = SDLK_PASTE as i32,
157    Find = SDLK_FIND as i32,
158    Mute = SDLK_MUTE as i32,
159    VolumeUp = SDLK_VOLUMEUP as i32,
160    VolumeDown = SDLK_VOLUMEDOWN as i32,
161    KpComma = SDLK_KP_COMMA as i32,
162    KpEqualsAs400 = SDLK_KP_EQUALSAS400 as i32,
163    AltErase = SDLK_ALTERASE as i32,
164    SysReq = SDLK_SYSREQ as i32,
165    Cancel = SDLK_CANCEL as i32,
166    Clear = SDLK_CLEAR as i32,
167    Prior = SDLK_PRIOR as i32,
168    Return2 = SDLK_RETURN2 as i32,
169    Separator = SDLK_SEPARATOR as i32,
170    Out = SDLK_OUT as i32,
171    Oper = SDLK_OPER as i32,
172    ClearAgain = SDLK_CLEARAGAIN as i32,
173    CrSel = SDLK_CRSEL as i32,
174    ExSel = SDLK_EXSEL as i32,
175    Kp00 = SDLK_KP_00 as i32,
176    Kp000 = SDLK_KP_000 as i32,
177    ThousandsSeparator = SDLK_THOUSANDSSEPARATOR as i32,
178    DecimalSeparator = SDLK_DECIMALSEPARATOR as i32,
179    CurrencyUnit = SDLK_CURRENCYUNIT as i32,
180    CurrencySubunit = SDLK_CURRENCYSUBUNIT as i32,
181    KpLeftParen = SDLK_KP_LEFTPAREN as i32,
182    KpRightParen = SDLK_KP_RIGHTPAREN as i32,
183    KpLeftBrace = SDLK_KP_LEFTBRACE as i32,
184    KpRightBrace = SDLK_KP_RIGHTBRACE as i32,
185    KpTab = SDLK_KP_TAB as i32,
186    KpBackspace = SDLK_KP_BACKSPACE as i32,
187    KpA = SDLK_KP_A as i32,
188    KpB = SDLK_KP_B as i32,
189    KpC = SDLK_KP_C as i32,
190    KpD = SDLK_KP_D as i32,
191    KpE = SDLK_KP_E as i32,
192    KpF = SDLK_KP_F as i32,
193    KpXor = SDLK_KP_XOR as i32,
194    KpPower = SDLK_KP_POWER as i32,
195    KpPercent = SDLK_KP_PERCENT as i32,
196    KpLess = SDLK_KP_LESS as i32,
197    KpGreater = SDLK_KP_GREATER as i32,
198    KpAmpersand = SDLK_KP_AMPERSAND as i32,
199    KpDblAmpersand = SDLK_KP_DBLAMPERSAND as i32,
200    KpVerticalBar = SDLK_KP_VERTICALBAR as i32,
201    KpDblVerticalBar = SDLK_KP_DBLVERTICALBAR as i32,
202    KpColon = SDLK_KP_COLON as i32,
203    KpHash = SDLK_KP_HASH as i32,
204    KpSpace = SDLK_KP_SPACE as i32,
205    KpAt = SDLK_KP_AT as i32,
206    KpExclam = SDLK_KP_EXCLAM as i32,
207    KpMemStore = SDLK_KP_MEMSTORE as i32,
208    KpMemRecall = SDLK_KP_MEMRECALL as i32,
209    KpMemClear = SDLK_KP_MEMCLEAR as i32,
210    KpMemAdd = SDLK_KP_MEMADD as i32,
211    KpMemSubtract = SDLK_KP_MEMSUBTRACT as i32,
212    KpMemMultiply = SDLK_KP_MEMMULTIPLY as i32,
213    KpMemDivide = SDLK_KP_MEMDIVIDE as i32,
214    KpPlusMinus = SDLK_KP_PLUSMINUS as i32,
215    KpClear = SDLK_KP_CLEAR as i32,
216    KpClearEntry = SDLK_KP_CLEARENTRY as i32,
217    KpBinary = SDLK_KP_BINARY as i32,
218    KpOctal = SDLK_KP_OCTAL as i32,
219    KpDecimal = SDLK_KP_DECIMAL as i32,
220    KpHexadecimal = SDLK_KP_HEXADECIMAL as i32,
221    LCtrl = SDLK_LCTRL as i32,
222    LShift = SDLK_LSHIFT as i32,
223    LAlt = SDLK_LALT as i32,
224    LGui = SDLK_LGUI as i32,
225    RCtrl = SDLK_RCTRL as i32,
226    RShift = SDLK_RSHIFT as i32,
227    RAlt = SDLK_RALT as i32,
228    RGui = SDLK_RGUI as i32,
229    Mode = SDLK_MODE as i32,
230    Sleep = SDLK_SLEEP as i32,
231    Wake = SDLK_WAKE as i32,
232    ChannelIncrement = SDLK_CHANNEL_INCREMENT as i32,
233    ChannelDecrement = SDLK_CHANNEL_DECREMENT as i32,
234    MediaPlay = SDLK_MEDIA_PLAY as i32,
235    MediaPause = SDLK_MEDIA_PAUSE as i32,
236    MediaRecord = SDLK_MEDIA_RECORD as i32,
237    MediaFastForward = SDLK_MEDIA_FAST_FORWARD as i32,
238    MediaRewind = SDLK_MEDIA_REWIND as i32,
239    MediaNextTrack = SDLK_MEDIA_NEXT_TRACK as i32,
240    MediaPreviousTrack = SDLK_MEDIA_PREVIOUS_TRACK as i32,
241    MediaStop = SDLK_MEDIA_STOP as i32,
242    MediaEject = SDLK_MEDIA_EJECT as i32,
243    MediaPlayPause = SDLK_MEDIA_PLAY_PAUSE as i32,
244    MediaSelect = SDLK_MEDIA_SELECT as i32,
245    AcNew = SDLK_AC_NEW as i32,
246    AcOpen = SDLK_AC_OPEN as i32,
247    AcClose = SDLK_AC_CLOSE as i32,
248    AcExit = SDLK_AC_EXIT as i32,
249    AcSave = SDLK_AC_SAVE as i32,
250    AcPrint = SDLK_AC_PRINT as i32,
251    AcProperties = SDLK_AC_PROPERTIES as i32,
252    AcSearch = SDLK_AC_SEARCH as i32,
253    AcHome = SDLK_AC_HOME as i32,
254    AcBack = SDLK_AC_BACK as i32,
255    AcForward = SDLK_AC_FORWARD as i32,
256    AcStop = SDLK_AC_STOP as i32,
257    AcRefresh = SDLK_AC_REFRESH as i32,
258    AcBookmarks = SDLK_AC_BOOKMARKS as i32,
259    SoftLeft = SDLK_SOFTLEFT as i32,
260    SoftRight = SDLK_SOFTRIGHT as i32,
261    Call = SDLK_CALL as i32,
262    EndCall = SDLK_ENDCALL as i32,
263}
264
265impl Keycode {
266    pub fn from_i32(n: i32) -> Option<Keycode> {
267        use self::Keycode::*;
268        let n = n as u32;
269
270        Some(match n {
271            SDLK_SCANCODE_MASK => ScancodeMask,
272            SDLK_UNKNOWN => Unknown,
273            SDLK_RETURN => Return,
274            SDLK_ESCAPE => Escape,
275            SDLK_BACKSPACE => Backspace,
276            SDLK_TAB => Tab,
277            SDLK_SPACE => Space,
278            SDLK_EXCLAIM => Exclaim,
279            SDLK_DBLAPOSTROPHE => DblApostrophe,
280            SDLK_HASH => Hash,
281            SDLK_DOLLAR => Dollar,
282            SDLK_PERCENT => Percent,
283            SDLK_AMPERSAND => Ampersand,
284            SDLK_APOSTROPHE => Apostrophe,
285            SDLK_LEFTPAREN => LeftParen,
286            SDLK_RIGHTPAREN => RightParen,
287            SDLK_ASTERISK => Asterisk,
288            SDLK_PLUS => Plus,
289            SDLK_COMMA => Comma,
290            SDLK_MINUS => Minus,
291            SDLK_PERIOD => Period,
292            SDLK_SLASH => Slash,
293            SDLK_0 => _0,
294            SDLK_1 => _1,
295            SDLK_2 => _2,
296            SDLK_3 => _3,
297            SDLK_4 => _4,
298            SDLK_5 => _5,
299            SDLK_6 => _6,
300            SDLK_7 => _7,
301            SDLK_8 => _8,
302            SDLK_9 => _9,
303            SDLK_COLON => Colon,
304            SDLK_SEMICOLON => Semicolon,
305            SDLK_LESS => Less,
306            SDLK_EQUALS => Equals,
307            SDLK_GREATER => Greater,
308            SDLK_QUESTION => Question,
309            SDLK_AT => At,
310            SDLK_LEFTBRACKET => LeftBracket,
311            SDLK_BACKSLASH => Backslash,
312            SDLK_RIGHTBRACKET => RightBracket,
313            SDLK_CARET => Caret,
314            SDLK_UNDERSCORE => Underscore,
315            SDLK_GRAVE => Grave,
316            SDLK_A => A,
317            SDLK_B => B,
318            SDLK_C => C,
319            SDLK_D => D,
320            SDLK_E => E,
321            SDLK_F => F,
322            SDLK_G => G,
323            SDLK_H => H,
324            SDLK_I => I,
325            SDLK_J => J,
326            SDLK_K => K,
327            SDLK_L => L,
328            SDLK_M => M,
329            SDLK_N => N,
330            SDLK_O => O,
331            SDLK_P => P,
332            SDLK_Q => Q,
333            SDLK_R => R,
334            SDLK_S => S,
335            SDLK_T => T,
336            SDLK_U => U,
337            SDLK_V => V,
338            SDLK_W => W,
339            SDLK_X => X,
340            SDLK_Y => Y,
341            SDLK_Z => Z,
342            SDLK_LEFTBRACE => LeftBrace,
343            SDLK_PIPE => Pipe,
344            SDLK_RIGHTBRACE => RightBrace,
345            SDLK_TILDE => Tilde,
346            SDLK_DELETE => Delete,
347            SDLK_PLUSMINUS => PlusMinus,
348            SDLK_CAPSLOCK => CapsLock,
349            SDLK_F1 => F1,
350            SDLK_F2 => F2,
351            SDLK_F3 => F3,
352            SDLK_F4 => F4,
353            SDLK_F5 => F5,
354            SDLK_F6 => F6,
355            SDLK_F7 => F7,
356            SDLK_F8 => F8,
357            SDLK_F9 => F9,
358            SDLK_F10 => F10,
359            SDLK_F11 => F11,
360            SDLK_F12 => F12,
361            SDLK_PRINTSCREEN => PrintScreen,
362            SDLK_SCROLLLOCK => ScrollLock,
363            SDLK_PAUSE => Pause,
364            SDLK_INSERT => Insert,
365            SDLK_HOME => Home,
366            SDLK_PAGEUP => PageUp,
367            SDLK_END => End,
368            SDLK_PAGEDOWN => PageDown,
369            SDLK_RIGHT => Right,
370            SDLK_LEFT => Left,
371            SDLK_DOWN => Down,
372            SDLK_UP => Up,
373            SDLK_NUMLOCKCLEAR => NumLockClear,
374            SDLK_KP_DIVIDE => KpDivide,
375            SDLK_KP_MULTIPLY => KpMultiply,
376            SDLK_KP_MINUS => KpMinus,
377            SDLK_KP_PLUS => KpPlus,
378            SDLK_KP_ENTER => KpEnter,
379            SDLK_KP_1 => Kp1,
380            SDLK_KP_2 => Kp2,
381            SDLK_KP_3 => Kp3,
382            SDLK_KP_4 => Kp4,
383            SDLK_KP_5 => Kp5,
384            SDLK_KP_6 => Kp6,
385            SDLK_KP_7 => Kp7,
386            SDLK_KP_8 => Kp8,
387            SDLK_KP_9 => Kp9,
388            SDLK_KP_0 => Kp0,
389            SDLK_KP_PERIOD => KpPeriod,
390            SDLK_APPLICATION => Application,
391            SDLK_POWER => Power,
392            SDLK_KP_EQUALS => KpEquals,
393            SDLK_F13 => F13,
394            SDLK_F14 => F14,
395            SDLK_F15 => F15,
396            SDLK_F16 => F16,
397            SDLK_F17 => F17,
398            SDLK_F18 => F18,
399            SDLK_F19 => F19,
400            SDLK_F20 => F20,
401            SDLK_F21 => F21,
402            SDLK_F22 => F22,
403            SDLK_F23 => F23,
404            SDLK_F24 => F24,
405            SDLK_EXECUTE => Execute,
406            SDLK_HELP => Help,
407            SDLK_MENU => Menu,
408            SDLK_SELECT => Select,
409            SDLK_STOP => Stop,
410            SDLK_AGAIN => Again,
411            SDLK_UNDO => Undo,
412            SDLK_CUT => Cut,
413            SDLK_COPY => Copy,
414            SDLK_PASTE => Paste,
415            SDLK_FIND => Find,
416            SDLK_MUTE => Mute,
417            SDLK_VOLUMEUP => VolumeUp,
418            SDLK_VOLUMEDOWN => VolumeDown,
419            SDLK_KP_COMMA => KpComma,
420            SDLK_KP_EQUALSAS400 => KpEqualsAs400,
421            SDLK_ALTERASE => AltErase,
422            SDLK_SYSREQ => SysReq,
423            SDLK_CANCEL => Cancel,
424            SDLK_CLEAR => Clear,
425            SDLK_PRIOR => Prior,
426            SDLK_RETURN2 => Return2,
427            SDLK_SEPARATOR => Separator,
428            SDLK_OUT => Out,
429            SDLK_OPER => Oper,
430            SDLK_CLEARAGAIN => ClearAgain,
431            SDLK_CRSEL => CrSel,
432            SDLK_EXSEL => ExSel,
433            SDLK_KP_00 => Kp00,
434            SDLK_KP_000 => Kp000,
435            SDLK_THOUSANDSSEPARATOR => ThousandsSeparator,
436            SDLK_DECIMALSEPARATOR => DecimalSeparator,
437            SDLK_CURRENCYUNIT => CurrencyUnit,
438            SDLK_CURRENCYSUBUNIT => CurrencySubunit,
439            SDLK_KP_LEFTPAREN => KpLeftParen,
440            SDLK_KP_RIGHTPAREN => KpRightParen,
441            SDLK_KP_LEFTBRACE => KpLeftBrace,
442            SDLK_KP_RIGHTBRACE => KpRightBrace,
443            SDLK_KP_TAB => KpTab,
444            SDLK_KP_BACKSPACE => KpBackspace,
445            SDLK_KP_A => KpA,
446            SDLK_KP_B => KpB,
447            SDLK_KP_C => KpC,
448            SDLK_KP_D => KpD,
449            SDLK_KP_E => KpE,
450            SDLK_KP_F => KpF,
451            SDLK_KP_XOR => KpXor,
452            SDLK_KP_POWER => KpPower,
453            SDLK_KP_PERCENT => KpPercent,
454            SDLK_KP_LESS => KpLess,
455            SDLK_KP_GREATER => KpGreater,
456            SDLK_KP_AMPERSAND => KpAmpersand,
457            SDLK_KP_DBLAMPERSAND => KpDblAmpersand,
458            SDLK_KP_VERTICALBAR => KpVerticalBar,
459            SDLK_KP_DBLVERTICALBAR => KpDblVerticalBar,
460            SDLK_KP_COLON => KpColon,
461            SDLK_KP_HASH => KpHash,
462            SDLK_KP_SPACE => KpSpace,
463            SDLK_KP_AT => KpAt,
464            SDLK_KP_EXCLAM => KpExclam,
465            SDLK_KP_MEMSTORE => KpMemStore,
466            SDLK_KP_MEMRECALL => KpMemRecall,
467            SDLK_KP_MEMCLEAR => KpMemClear,
468            SDLK_KP_MEMADD => KpMemAdd,
469            SDLK_KP_MEMSUBTRACT => KpMemSubtract,
470            SDLK_KP_MEMMULTIPLY => KpMemMultiply,
471            SDLK_KP_MEMDIVIDE => KpMemDivide,
472            SDLK_KP_PLUSMINUS => KpPlusMinus,
473            SDLK_KP_CLEAR => KpClear,
474            SDLK_KP_CLEARENTRY => KpClearEntry,
475            SDLK_KP_BINARY => KpBinary,
476            SDLK_KP_OCTAL => KpOctal,
477            SDLK_KP_DECIMAL => KpDecimal,
478            SDLK_KP_HEXADECIMAL => KpHexadecimal,
479            SDLK_LCTRL => LCtrl,
480            SDLK_LSHIFT => LShift,
481            SDLK_LALT => LAlt,
482            SDLK_LGUI => LGui,
483            SDLK_RCTRL => RCtrl,
484            SDLK_RSHIFT => RShift,
485            SDLK_RALT => RAlt,
486            SDLK_RGUI => RGui,
487            SDLK_MODE => Mode,
488            SDLK_SLEEP => Sleep,
489            SDLK_WAKE => Wake,
490            SDLK_CHANNEL_INCREMENT => ChannelIncrement,
491            SDLK_CHANNEL_DECREMENT => ChannelDecrement,
492            SDLK_MEDIA_PLAY => MediaPlay,
493            SDLK_MEDIA_PAUSE => MediaPause,
494            SDLK_MEDIA_RECORD => MediaRecord,
495            SDLK_MEDIA_FAST_FORWARD => MediaFastForward,
496            SDLK_MEDIA_REWIND => MediaRewind,
497            SDLK_MEDIA_NEXT_TRACK => MediaNextTrack,
498            SDLK_MEDIA_PREVIOUS_TRACK => MediaPreviousTrack,
499            SDLK_MEDIA_STOP => MediaStop,
500            SDLK_MEDIA_EJECT => MediaEject,
501            SDLK_MEDIA_PLAY_PAUSE => MediaPlayPause,
502            SDLK_MEDIA_SELECT => MediaSelect,
503            SDLK_AC_NEW => AcNew,
504            SDLK_AC_OPEN => AcOpen,
505            SDLK_AC_CLOSE => AcClose,
506            SDLK_AC_EXIT => AcExit,
507            SDLK_AC_SAVE => AcSave,
508            SDLK_AC_PRINT => AcPrint,
509            SDLK_AC_PROPERTIES => AcProperties,
510            SDLK_AC_SEARCH => AcSearch,
511            SDLK_AC_HOME => AcHome,
512            SDLK_AC_BACK => AcBack,
513            SDLK_AC_FORWARD => AcForward,
514            SDLK_AC_STOP => AcStop,
515            SDLK_AC_REFRESH => AcRefresh,
516            SDLK_AC_BOOKMARKS => AcBookmarks,
517            SDLK_SOFTLEFT => SoftLeft,
518            SDLK_SOFTRIGHT => SoftRight,
519            SDLK_CALL => Call,
520            SDLK_ENDCALL => EndCall,
521            _ => return None,
522        })
523    }
524
525    pub fn to_ll(self) -> SDL_Keycode {
526        unsafe { transmute(self as i32) }
527    }
528}
529
530use std::fmt;
531
532impl fmt::Display for Keycode {
533    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
534        write!(f, "{}", self.name())
535    }
536}
537
538impl From<Keycode> for SDL_Keycode {
539    fn from(k: Keycode) -> SDL_Keycode {
540        k.to_ll()
541    }
542}
543
544use crate::keyboard::Scancode;
545
546impl Keycode {
547    /// Gets the virtual key from a scancode. Returns None if there is no corresponding virtual key.
548    #[doc(alias = "SDL_GetKeyFromScancode")]
549    pub fn from_scancode(
550        scancode: Scancode,
551        modstate: SDL_Keymod,
552        key_event: bool,
553    ) -> Option<Keycode> {
554        const UNKNOWN: u32 = sys::keycode::SDLK_UNKNOWN;
555        unsafe {
556            match sys::keyboard::SDL_GetKeyFromScancode(
557                transmute::<u32, sys::scancode::SDL_Scancode>(scancode as u32),
558                modstate,
559                key_event,
560            ) {
561                UNKNOWN => None,
562                keycode_id => Keycode::from_i32(keycode_id as i32),
563            }
564        }
565    }
566
567    #[doc(alias = "SDL_GetKeyFromName")]
568    pub fn from_name(name: &str) -> Option<Keycode> {
569        const UNKNOWN: u32 = sys::keycode::SDLK_UNKNOWN;
570        unsafe {
571            match CString::new(name) {
572                Ok(name) => match sys::keyboard::SDL_GetKeyFromName(name.as_ptr() as *const c_char)
573                {
574                    UNKNOWN => None,
575                    keycode_id => Some(Keycode::from_i32(keycode_id as i32).unwrap()),
576                },
577                // string contains a nul byte - it won't match anything.
578                Err(_) => None,
579            }
580        }
581    }
582
583    #[doc(alias = "SDL_GetKeyName")]
584    pub fn name(self) -> String {
585        // The name string pointer's contents _might_ change, depending on the last call to SDL_GetKeyName.
586        // Knowing this, we must always return a new string.
587        unsafe {
588            let buf = sys::keyboard::SDL_GetKeyName(self.to_ll());
589            CStr::from_ptr(buf as *const _).to_str().unwrap().to_owned()
590        }
591    }
592}