sdl3/keyboard/
scancode.rs

1#![allow(unreachable_patterns)]
2
3use std::ffi::{CStr, CString};
4use std::mem::transmute;
5
6use crate::sys;
7use crate::sys::scancode::*;
8
9#[repr(i32)]
10#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
11pub enum Scancode {
12    Unknown = SDL_SCANCODE_UNKNOWN.0,
13    A = SDL_SCANCODE_A.0,
14    B = SDL_SCANCODE_B.0,
15    C = SDL_SCANCODE_C.0,
16    D = SDL_SCANCODE_D.0,
17    E = SDL_SCANCODE_E.0,
18    F = SDL_SCANCODE_F.0,
19    G = SDL_SCANCODE_G.0,
20    H = SDL_SCANCODE_H.0,
21    I = SDL_SCANCODE_I.0,
22    J = SDL_SCANCODE_J.0,
23    K = SDL_SCANCODE_K.0,
24    L = SDL_SCANCODE_L.0,
25    M = SDL_SCANCODE_M.0,
26    N = SDL_SCANCODE_N.0,
27    O = SDL_SCANCODE_O.0,
28    P = SDL_SCANCODE_P.0,
29    Q = SDL_SCANCODE_Q.0,
30    R = SDL_SCANCODE_R.0,
31    S = SDL_SCANCODE_S.0,
32    T = SDL_SCANCODE_T.0,
33    U = SDL_SCANCODE_U.0,
34    V = SDL_SCANCODE_V.0,
35    W = SDL_SCANCODE_W.0,
36    X = SDL_SCANCODE_X.0,
37    Y = SDL_SCANCODE_Y.0,
38    Z = SDL_SCANCODE_Z.0,
39    _1 = SDL_SCANCODE_1.0,
40    _2 = SDL_SCANCODE_2.0,
41    _3 = SDL_SCANCODE_3.0,
42    _4 = SDL_SCANCODE_4.0,
43    _5 = SDL_SCANCODE_5.0,
44    _6 = SDL_SCANCODE_6.0,
45    _7 = SDL_SCANCODE_7.0,
46    _8 = SDL_SCANCODE_8.0,
47    _9 = SDL_SCANCODE_9.0,
48    _0 = SDL_SCANCODE_0.0,
49    Return = SDL_SCANCODE_RETURN.0,
50    Escape = SDL_SCANCODE_ESCAPE.0,
51    Backspace = SDL_SCANCODE_BACKSPACE.0,
52    Tab = SDL_SCANCODE_TAB.0,
53    Space = SDL_SCANCODE_SPACE.0,
54    Minus = SDL_SCANCODE_MINUS.0,
55    Equals = SDL_SCANCODE_EQUALS.0,
56    LeftBracket = SDL_SCANCODE_LEFTBRACKET.0,
57    RightBracket = SDL_SCANCODE_RIGHTBRACKET.0,
58    Backslash = SDL_SCANCODE_BACKSLASH.0,
59    NonUsHash = SDL_SCANCODE_NONUSHASH.0,
60    Semicolon = SDL_SCANCODE_SEMICOLON.0,
61    Apostrophe = SDL_SCANCODE_APOSTROPHE.0,
62    Grave = SDL_SCANCODE_GRAVE.0,
63    Comma = SDL_SCANCODE_COMMA.0,
64    Period = SDL_SCANCODE_PERIOD.0,
65    Slash = SDL_SCANCODE_SLASH.0,
66    CapsLock = SDL_SCANCODE_CAPSLOCK.0,
67    F1 = SDL_SCANCODE_F1.0,
68    F2 = SDL_SCANCODE_F2.0,
69    F3 = SDL_SCANCODE_F3.0,
70    F4 = SDL_SCANCODE_F4.0,
71    F5 = SDL_SCANCODE_F5.0,
72    F6 = SDL_SCANCODE_F6.0,
73    F7 = SDL_SCANCODE_F7.0,
74    F8 = SDL_SCANCODE_F8.0,
75    F9 = SDL_SCANCODE_F9.0,
76    F10 = SDL_SCANCODE_F10.0,
77    F11 = SDL_SCANCODE_F11.0,
78    F12 = SDL_SCANCODE_F12.0,
79    PrintScreen = SDL_SCANCODE_PRINTSCREEN.0,
80    ScrollLock = SDL_SCANCODE_SCROLLLOCK.0,
81    Pause = SDL_SCANCODE_PAUSE.0,
82    Insert = SDL_SCANCODE_INSERT.0,
83    Home = SDL_SCANCODE_HOME.0,
84    PageUp = SDL_SCANCODE_PAGEUP.0,
85    Delete = SDL_SCANCODE_DELETE.0,
86    End = SDL_SCANCODE_END.0,
87    PageDown = SDL_SCANCODE_PAGEDOWN.0,
88    Right = SDL_SCANCODE_RIGHT.0,
89    Left = SDL_SCANCODE_LEFT.0,
90    Down = SDL_SCANCODE_DOWN.0,
91    Up = SDL_SCANCODE_UP.0,
92    NumLockClear = SDL_SCANCODE_NUMLOCKCLEAR.0,
93    KpDivide = SDL_SCANCODE_KP_DIVIDE.0,
94    KpMultiply = SDL_SCANCODE_KP_MULTIPLY.0,
95    KpMinus = SDL_SCANCODE_KP_MINUS.0,
96    KpPlus = SDL_SCANCODE_KP_PLUS.0,
97    KpEnter = SDL_SCANCODE_KP_ENTER.0,
98    Kp1 = SDL_SCANCODE_KP_1.0,
99    Kp2 = SDL_SCANCODE_KP_2.0,
100    Kp3 = SDL_SCANCODE_KP_3.0,
101    Kp4 = SDL_SCANCODE_KP_4.0,
102    Kp5 = SDL_SCANCODE_KP_5.0,
103    Kp6 = SDL_SCANCODE_KP_6.0,
104    Kp7 = SDL_SCANCODE_KP_7.0,
105    Kp8 = SDL_SCANCODE_KP_8.0,
106    Kp9 = SDL_SCANCODE_KP_9.0,
107    Kp0 = SDL_SCANCODE_KP_0.0,
108    KpPeriod = SDL_SCANCODE_KP_PERIOD.0,
109    NonUsBackslash = SDL_SCANCODE_NONUSBACKSLASH.0,
110    Application = SDL_SCANCODE_APPLICATION.0,
111    Power = SDL_SCANCODE_POWER.0,
112    KpEquals = SDL_SCANCODE_KP_EQUALS.0,
113    F13 = SDL_SCANCODE_F13.0,
114    F14 = SDL_SCANCODE_F14.0,
115    F15 = SDL_SCANCODE_F15.0,
116    F16 = SDL_SCANCODE_F16.0,
117    F17 = SDL_SCANCODE_F17.0,
118    F18 = SDL_SCANCODE_F18.0,
119    F19 = SDL_SCANCODE_F19.0,
120    F20 = SDL_SCANCODE_F20.0,
121    F21 = SDL_SCANCODE_F21.0,
122    F22 = SDL_SCANCODE_F22.0,
123    F23 = SDL_SCANCODE_F23.0,
124    F24 = SDL_SCANCODE_F24.0,
125    Execute = SDL_SCANCODE_EXECUTE.0,
126    Help = SDL_SCANCODE_HELP.0,
127    Menu = SDL_SCANCODE_MENU.0,
128    Select = SDL_SCANCODE_SELECT.0,
129    Stop = SDL_SCANCODE_STOP.0,
130    Again = SDL_SCANCODE_AGAIN.0,
131    Undo = SDL_SCANCODE_UNDO.0,
132    Cut = SDL_SCANCODE_CUT.0,
133    Copy = SDL_SCANCODE_COPY.0,
134    Paste = SDL_SCANCODE_PASTE.0,
135    Find = SDL_SCANCODE_FIND.0,
136    Mute = SDL_SCANCODE_MUTE.0,
137    VolumeUp = SDL_SCANCODE_VOLUMEUP.0,
138    VolumeDown = SDL_SCANCODE_VOLUMEDOWN.0,
139    KpComma = SDL_SCANCODE_KP_COMMA.0,
140    KpEqualsAs400 = SDL_SCANCODE_KP_EQUALSAS400.0,
141    International1 = SDL_SCANCODE_INTERNATIONAL1.0,
142    International2 = SDL_SCANCODE_INTERNATIONAL2.0,
143    International3 = SDL_SCANCODE_INTERNATIONAL3.0,
144    International4 = SDL_SCANCODE_INTERNATIONAL4.0,
145    International5 = SDL_SCANCODE_INTERNATIONAL5.0,
146    International6 = SDL_SCANCODE_INTERNATIONAL6.0,
147    International7 = SDL_SCANCODE_INTERNATIONAL7.0,
148    International8 = SDL_SCANCODE_INTERNATIONAL8.0,
149    International9 = SDL_SCANCODE_INTERNATIONAL9.0,
150    Lang1 = SDL_SCANCODE_LANG1.0,
151    Lang2 = SDL_SCANCODE_LANG2.0,
152    Lang3 = SDL_SCANCODE_LANG3.0,
153    Lang4 = SDL_SCANCODE_LANG4.0,
154    Lang5 = SDL_SCANCODE_LANG5.0,
155    Lang6 = SDL_SCANCODE_LANG6.0,
156    Lang7 = SDL_SCANCODE_LANG7.0,
157    Lang8 = SDL_SCANCODE_LANG8.0,
158    Lang9 = SDL_SCANCODE_LANG9.0,
159    AltErase = SDL_SCANCODE_ALTERASE.0,
160    SysReq = SDL_SCANCODE_SYSREQ.0,
161    Cancel = SDL_SCANCODE_CANCEL.0,
162    Clear = SDL_SCANCODE_CLEAR.0,
163    Prior = SDL_SCANCODE_PRIOR.0,
164    Return2 = SDL_SCANCODE_RETURN2.0,
165    Separator = SDL_SCANCODE_SEPARATOR.0,
166    Out = SDL_SCANCODE_OUT.0,
167    Oper = SDL_SCANCODE_OPER.0,
168    ClearAgain = SDL_SCANCODE_CLEARAGAIN.0,
169    CrSel = SDL_SCANCODE_CRSEL.0,
170    ExSel = SDL_SCANCODE_EXSEL.0,
171    Kp00 = SDL_SCANCODE_KP_00.0,
172    Kp000 = SDL_SCANCODE_KP_000.0,
173    ThousandsSeparator = SDL_SCANCODE_THOUSANDSSEPARATOR.0,
174    DecimalSeparator = SDL_SCANCODE_DECIMALSEPARATOR.0,
175    CurrencyUnit = SDL_SCANCODE_CURRENCYUNIT.0,
176    CurrencySubunit = SDL_SCANCODE_CURRENCYSUBUNIT.0,
177    KpLeftParen = SDL_SCANCODE_KP_LEFTPAREN.0,
178    KpRightParen = SDL_SCANCODE_KP_RIGHTPAREN.0,
179    KpLeftBrace = SDL_SCANCODE_KP_LEFTBRACE.0,
180    KpRightBrace = SDL_SCANCODE_KP_RIGHTBRACE.0,
181    KpTab = SDL_SCANCODE_KP_TAB.0,
182    KpBackspace = SDL_SCANCODE_KP_BACKSPACE.0,
183    KpA = SDL_SCANCODE_KP_A.0,
184    KpB = SDL_SCANCODE_KP_B.0,
185    KpC = SDL_SCANCODE_KP_C.0,
186    KpD = SDL_SCANCODE_KP_D.0,
187    KpE = SDL_SCANCODE_KP_E.0,
188    KpF = SDL_SCANCODE_KP_F.0,
189    KpXor = SDL_SCANCODE_KP_XOR.0,
190    KpPower = SDL_SCANCODE_KP_POWER.0,
191    KpPercent = SDL_SCANCODE_KP_PERCENT.0,
192    KpLess = SDL_SCANCODE_KP_LESS.0,
193    KpGreater = SDL_SCANCODE_KP_GREATER.0,
194    KpAmpersand = SDL_SCANCODE_KP_AMPERSAND.0,
195    KpDblAmpersand = SDL_SCANCODE_KP_DBLAMPERSAND.0,
196    KpVerticalBar = SDL_SCANCODE_KP_VERTICALBAR.0,
197    KpDblVerticalBar = SDL_SCANCODE_KP_DBLVERTICALBAR.0,
198    KpColon = SDL_SCANCODE_KP_COLON.0,
199    KpHash = SDL_SCANCODE_KP_HASH.0,
200    KpSpace = SDL_SCANCODE_KP_SPACE.0,
201    KpAt = SDL_SCANCODE_KP_AT.0,
202    KpExclam = SDL_SCANCODE_KP_EXCLAM.0,
203    KpMemStore = SDL_SCANCODE_KP_MEMSTORE.0,
204    KpMemRecall = SDL_SCANCODE_KP_MEMRECALL.0,
205    KpMemClear = SDL_SCANCODE_KP_MEMCLEAR.0,
206    KpMemAdd = SDL_SCANCODE_KP_MEMADD.0,
207    KpMemSubtract = SDL_SCANCODE_KP_MEMSUBTRACT.0,
208    KpMemMultiply = SDL_SCANCODE_KP_MEMMULTIPLY.0,
209    KpMemDivide = SDL_SCANCODE_KP_MEMDIVIDE.0,
210    KpPlusMinus = SDL_SCANCODE_KP_PLUSMINUS.0,
211    KpClear = SDL_SCANCODE_KP_CLEAR.0,
212    KpClearEntry = SDL_SCANCODE_KP_CLEARENTRY.0,
213    KpBinary = SDL_SCANCODE_KP_BINARY.0,
214    KpOctal = SDL_SCANCODE_KP_OCTAL.0,
215    KpDecimal = SDL_SCANCODE_KP_DECIMAL.0,
216    KpHexadecimal = SDL_SCANCODE_KP_HEXADECIMAL.0,
217    LCtrl = SDL_SCANCODE_LCTRL.0,
218    LShift = SDL_SCANCODE_LSHIFT.0,
219    LAlt = SDL_SCANCODE_LALT.0,
220    LGui = SDL_SCANCODE_LGUI.0,
221    RCtrl = SDL_SCANCODE_RCTRL.0,
222    RShift = SDL_SCANCODE_RSHIFT.0,
223    RAlt = SDL_SCANCODE_RALT.0,
224    RGui = SDL_SCANCODE_RGUI.0,
225    Mode = SDL_SCANCODE_MODE.0,
226    Sleep = SDL_SCANCODE_SLEEP.0,
227    Wake = SDL_SCANCODE_WAKE.0,
228    ChannelIncrement = SDL_SCANCODE_CHANNEL_INCREMENT.0,
229    ChannelDecrement = SDL_SCANCODE_CHANNEL_DECREMENT.0,
230    MediaPlay = SDL_SCANCODE_MEDIA_PLAY.0,
231    MediaPause = SDL_SCANCODE_MEDIA_PAUSE.0,
232    MediaRecord = SDL_SCANCODE_MEDIA_RECORD.0,
233    MediaFastForward = SDL_SCANCODE_MEDIA_FAST_FORWARD.0,
234    MediaRewind = SDL_SCANCODE_MEDIA_REWIND.0,
235    MediaNextTrack = SDL_SCANCODE_MEDIA_NEXT_TRACK.0,
236    MediaPreviousTrack = SDL_SCANCODE_MEDIA_PREVIOUS_TRACK.0,
237    MediaStop = SDL_SCANCODE_MEDIA_STOP.0,
238    MediaEject = SDL_SCANCODE_MEDIA_EJECT.0,
239    MediaPlayPause = SDL_SCANCODE_MEDIA_PLAY_PAUSE.0,
240    MediaSelect = SDL_SCANCODE_MEDIA_SELECT.0,
241    AcNew = SDL_SCANCODE_AC_NEW.0,
242    AcOpen = SDL_SCANCODE_AC_OPEN.0,
243    AcClose = SDL_SCANCODE_AC_CLOSE.0,
244    AcExit = SDL_SCANCODE_AC_EXIT.0,
245    AcSave = SDL_SCANCODE_AC_SAVE.0,
246    AcPrint = SDL_SCANCODE_AC_PRINT.0,
247    AcProperties = SDL_SCANCODE_AC_PROPERTIES.0,
248    AcSearch = SDL_SCANCODE_AC_SEARCH.0,
249    AcHome = SDL_SCANCODE_AC_HOME.0,
250    AcBack = SDL_SCANCODE_AC_BACK.0,
251    AcForward = SDL_SCANCODE_AC_FORWARD.0,
252    AcStop = SDL_SCANCODE_AC_STOP.0,
253    AcRefresh = SDL_SCANCODE_AC_REFRESH.0,
254    AcBookmarks = SDL_SCANCODE_AC_BOOKMARKS.0,
255    SoftLeft = SDL_SCANCODE_SOFTLEFT.0,
256    SoftRight = SDL_SCANCODE_SOFTRIGHT.0,
257    Call = SDL_SCANCODE_CALL.0,
258    EndCall = SDL_SCANCODE_ENDCALL.0,
259    Reserved = SDL_SCANCODE_RESERVED.0,
260    Count = SDL_SCANCODE_COUNT.0,
261}
262
263impl Scancode {
264    pub fn from_i32(n: i32) -> Option<Scancode> {
265        use self::Scancode::*;
266        let n = n as u32;
267
268        Some(match unsafe { transmute::<u32, SDL_Scancode>(n) } {
269            SDL_SCANCODE_UNKNOWN => Unknown,
270            SDL_SCANCODE_A => A,
271            SDL_SCANCODE_B => B,
272            SDL_SCANCODE_C => C,
273            SDL_SCANCODE_D => D,
274            SDL_SCANCODE_E => E,
275            SDL_SCANCODE_F => F,
276            SDL_SCANCODE_G => G,
277            SDL_SCANCODE_H => H,
278            SDL_SCANCODE_I => I,
279            SDL_SCANCODE_J => J,
280            SDL_SCANCODE_K => K,
281            SDL_SCANCODE_L => L,
282            SDL_SCANCODE_M => M,
283            SDL_SCANCODE_N => N,
284            SDL_SCANCODE_O => O,
285            SDL_SCANCODE_P => P,
286            SDL_SCANCODE_Q => Q,
287            SDL_SCANCODE_R => R,
288            SDL_SCANCODE_S => S,
289            SDL_SCANCODE_T => T,
290            SDL_SCANCODE_U => U,
291            SDL_SCANCODE_V => V,
292            SDL_SCANCODE_W => W,
293            SDL_SCANCODE_X => X,
294            SDL_SCANCODE_Y => Y,
295            SDL_SCANCODE_Z => Z,
296            SDL_SCANCODE_1 => _1,
297            SDL_SCANCODE_2 => _2,
298            SDL_SCANCODE_3 => _3,
299            SDL_SCANCODE_4 => _4,
300            SDL_SCANCODE_5 => _5,
301            SDL_SCANCODE_6 => _6,
302            SDL_SCANCODE_7 => _7,
303            SDL_SCANCODE_8 => _8,
304            SDL_SCANCODE_9 => _9,
305            SDL_SCANCODE_0 => _0,
306            SDL_SCANCODE_RETURN => Return,
307            SDL_SCANCODE_ESCAPE => Escape,
308            SDL_SCANCODE_BACKSPACE => Backspace,
309            SDL_SCANCODE_TAB => Tab,
310            SDL_SCANCODE_SPACE => Space,
311            SDL_SCANCODE_MINUS => Minus,
312            SDL_SCANCODE_EQUALS => Equals,
313            SDL_SCANCODE_LEFTBRACKET => LeftBracket,
314            SDL_SCANCODE_RIGHTBRACKET => RightBracket,
315            SDL_SCANCODE_BACKSLASH => Backslash,
316            SDL_SCANCODE_NONUSHASH => NonUsHash,
317            SDL_SCANCODE_SEMICOLON => Semicolon,
318            SDL_SCANCODE_APOSTROPHE => Apostrophe,
319            SDL_SCANCODE_GRAVE => Grave,
320            SDL_SCANCODE_COMMA => Comma,
321            SDL_SCANCODE_PERIOD => Period,
322            SDL_SCANCODE_SLASH => Slash,
323            SDL_SCANCODE_CAPSLOCK => CapsLock,
324            SDL_SCANCODE_F1 => F1,
325            SDL_SCANCODE_F2 => F2,
326            SDL_SCANCODE_F3 => F3,
327            SDL_SCANCODE_F4 => F4,
328            SDL_SCANCODE_F5 => F5,
329            SDL_SCANCODE_F6 => F6,
330            SDL_SCANCODE_F7 => F7,
331            SDL_SCANCODE_F8 => F8,
332            SDL_SCANCODE_F9 => F9,
333            SDL_SCANCODE_F10 => F10,
334            SDL_SCANCODE_F11 => F11,
335            SDL_SCANCODE_F12 => F12,
336            SDL_SCANCODE_PRINTSCREEN => PrintScreen,
337            SDL_SCANCODE_SCROLLLOCK => ScrollLock,
338            SDL_SCANCODE_PAUSE => Pause,
339            SDL_SCANCODE_INSERT => Insert,
340            SDL_SCANCODE_HOME => Home,
341            SDL_SCANCODE_PAGEUP => PageUp,
342            SDL_SCANCODE_DELETE => Delete,
343            SDL_SCANCODE_END => End,
344            SDL_SCANCODE_PAGEDOWN => PageDown,
345            SDL_SCANCODE_RIGHT => Right,
346            SDL_SCANCODE_LEFT => Left,
347            SDL_SCANCODE_DOWN => Down,
348            SDL_SCANCODE_UP => Up,
349            SDL_SCANCODE_NUMLOCKCLEAR => NumLockClear,
350            SDL_SCANCODE_KP_DIVIDE => KpDivide,
351            SDL_SCANCODE_KP_MULTIPLY => KpMultiply,
352            SDL_SCANCODE_KP_MINUS => KpMinus,
353            SDL_SCANCODE_KP_PLUS => KpPlus,
354            SDL_SCANCODE_KP_ENTER => KpEnter,
355            SDL_SCANCODE_KP_1 => Kp1,
356            SDL_SCANCODE_KP_2 => Kp2,
357            SDL_SCANCODE_KP_3 => Kp3,
358            SDL_SCANCODE_KP_4 => Kp4,
359            SDL_SCANCODE_KP_5 => Kp5,
360            SDL_SCANCODE_KP_6 => Kp6,
361            SDL_SCANCODE_KP_7 => Kp7,
362            SDL_SCANCODE_KP_8 => Kp8,
363            SDL_SCANCODE_KP_9 => Kp9,
364            SDL_SCANCODE_KP_0 => Kp0,
365            SDL_SCANCODE_KP_PERIOD => KpPeriod,
366            SDL_SCANCODE_NONUSBACKSLASH => NonUsBackslash,
367            SDL_SCANCODE_APPLICATION => Application,
368            SDL_SCANCODE_POWER => Power,
369            SDL_SCANCODE_KP_EQUALS => KpEquals,
370            SDL_SCANCODE_F13 => F13,
371            SDL_SCANCODE_F14 => F14,
372            SDL_SCANCODE_F15 => F15,
373            SDL_SCANCODE_F16 => F16,
374            SDL_SCANCODE_F17 => F17,
375            SDL_SCANCODE_F18 => F18,
376            SDL_SCANCODE_F19 => F19,
377            SDL_SCANCODE_F20 => F20,
378            SDL_SCANCODE_F21 => F21,
379            SDL_SCANCODE_F22 => F22,
380            SDL_SCANCODE_F23 => F23,
381            SDL_SCANCODE_F24 => F24,
382            SDL_SCANCODE_EXECUTE => Execute,
383            SDL_SCANCODE_HELP => Help,
384            SDL_SCANCODE_MENU => Menu,
385            SDL_SCANCODE_SELECT => Select,
386            SDL_SCANCODE_STOP => Stop,
387            SDL_SCANCODE_AGAIN => Again,
388            SDL_SCANCODE_UNDO => Undo,
389            SDL_SCANCODE_CUT => Cut,
390            SDL_SCANCODE_COPY => Copy,
391            SDL_SCANCODE_PASTE => Paste,
392            SDL_SCANCODE_FIND => Find,
393            SDL_SCANCODE_MUTE => Mute,
394            SDL_SCANCODE_VOLUMEUP => VolumeUp,
395            SDL_SCANCODE_VOLUMEDOWN => VolumeDown,
396            SDL_SCANCODE_KP_COMMA => KpComma,
397            SDL_SCANCODE_KP_EQUALSAS400 => KpEqualsAs400,
398            SDL_SCANCODE_INTERNATIONAL1 => International1,
399            SDL_SCANCODE_INTERNATIONAL2 => International2,
400            SDL_SCANCODE_INTERNATIONAL3 => International3,
401            SDL_SCANCODE_INTERNATIONAL4 => International4,
402            SDL_SCANCODE_INTERNATIONAL5 => International5,
403            SDL_SCANCODE_INTERNATIONAL6 => International6,
404            SDL_SCANCODE_INTERNATIONAL7 => International7,
405            SDL_SCANCODE_INTERNATIONAL8 => International8,
406            SDL_SCANCODE_INTERNATIONAL9 => International9,
407            SDL_SCANCODE_LANG1 => Lang1,
408            SDL_SCANCODE_LANG2 => Lang2,
409            SDL_SCANCODE_LANG3 => Lang3,
410            SDL_SCANCODE_LANG4 => Lang4,
411            SDL_SCANCODE_LANG5 => Lang5,
412            SDL_SCANCODE_LANG6 => Lang6,
413            SDL_SCANCODE_LANG7 => Lang7,
414            SDL_SCANCODE_LANG8 => Lang8,
415            SDL_SCANCODE_LANG9 => Lang9,
416            SDL_SCANCODE_ALTERASE => AltErase,
417            SDL_SCANCODE_SYSREQ => SysReq,
418            SDL_SCANCODE_CANCEL => Cancel,
419            SDL_SCANCODE_CLEAR => Clear,
420            SDL_SCANCODE_PRIOR => Prior,
421            SDL_SCANCODE_RETURN2 => Return2,
422            SDL_SCANCODE_SEPARATOR => Separator,
423            SDL_SCANCODE_OUT => Out,
424            SDL_SCANCODE_OPER => Oper,
425            SDL_SCANCODE_CLEARAGAIN => ClearAgain,
426            SDL_SCANCODE_CRSEL => CrSel,
427            SDL_SCANCODE_EXSEL => ExSel,
428            SDL_SCANCODE_KP_00 => Kp00,
429            SDL_SCANCODE_KP_000 => Kp000,
430            SDL_SCANCODE_THOUSANDSSEPARATOR => ThousandsSeparator,
431            SDL_SCANCODE_DECIMALSEPARATOR => DecimalSeparator,
432            SDL_SCANCODE_CURRENCYUNIT => CurrencyUnit,
433            SDL_SCANCODE_CURRENCYSUBUNIT => CurrencySubunit,
434            SDL_SCANCODE_KP_LEFTPAREN => KpLeftParen,
435            SDL_SCANCODE_KP_RIGHTPAREN => KpRightParen,
436            SDL_SCANCODE_KP_LEFTBRACE => KpLeftBrace,
437            SDL_SCANCODE_KP_RIGHTBRACE => KpRightBrace,
438            SDL_SCANCODE_KP_TAB => KpTab,
439            SDL_SCANCODE_KP_BACKSPACE => KpBackspace,
440            SDL_SCANCODE_KP_A => KpA,
441            SDL_SCANCODE_KP_B => KpB,
442            SDL_SCANCODE_KP_C => KpC,
443            SDL_SCANCODE_KP_D => KpD,
444            SDL_SCANCODE_KP_E => KpE,
445            SDL_SCANCODE_KP_F => KpF,
446            SDL_SCANCODE_KP_XOR => KpXor,
447            SDL_SCANCODE_KP_POWER => KpPower,
448            SDL_SCANCODE_KP_PERCENT => KpPercent,
449            SDL_SCANCODE_KP_LESS => KpLess,
450            SDL_SCANCODE_KP_GREATER => KpGreater,
451            SDL_SCANCODE_KP_AMPERSAND => KpAmpersand,
452            SDL_SCANCODE_KP_DBLAMPERSAND => KpDblAmpersand,
453            SDL_SCANCODE_KP_VERTICALBAR => KpVerticalBar,
454            SDL_SCANCODE_KP_DBLVERTICALBAR => KpDblVerticalBar,
455            SDL_SCANCODE_KP_COLON => KpColon,
456            SDL_SCANCODE_KP_HASH => KpHash,
457            SDL_SCANCODE_KP_SPACE => KpSpace,
458            SDL_SCANCODE_KP_AT => KpAt,
459            SDL_SCANCODE_KP_EXCLAM => KpExclam,
460            SDL_SCANCODE_KP_MEMSTORE => KpMemStore,
461            SDL_SCANCODE_KP_MEMRECALL => KpMemRecall,
462            SDL_SCANCODE_KP_MEMCLEAR => KpMemClear,
463            SDL_SCANCODE_KP_MEMADD => KpMemAdd,
464            SDL_SCANCODE_KP_MEMSUBTRACT => KpMemSubtract,
465            SDL_SCANCODE_KP_MEMMULTIPLY => KpMemMultiply,
466            SDL_SCANCODE_KP_MEMDIVIDE => KpMemDivide,
467            SDL_SCANCODE_KP_PLUSMINUS => KpPlusMinus,
468            SDL_SCANCODE_KP_CLEAR => KpClear,
469            SDL_SCANCODE_KP_CLEARENTRY => KpClearEntry,
470            SDL_SCANCODE_KP_BINARY => KpBinary,
471            SDL_SCANCODE_KP_OCTAL => KpOctal,
472            SDL_SCANCODE_KP_DECIMAL => KpDecimal,
473            SDL_SCANCODE_KP_HEXADECIMAL => KpHexadecimal,
474            SDL_SCANCODE_LCTRL => LCtrl,
475            SDL_SCANCODE_LSHIFT => LShift,
476            SDL_SCANCODE_LALT => LAlt,
477            SDL_SCANCODE_LGUI => LGui,
478            SDL_SCANCODE_RCTRL => RCtrl,
479            SDL_SCANCODE_RSHIFT => RShift,
480            SDL_SCANCODE_RALT => RAlt,
481            SDL_SCANCODE_RGUI => RGui,
482            SDL_SCANCODE_MODE => Mode,
483            SDL_SCANCODE_SLEEP => Sleep,
484            SDL_SCANCODE_WAKE => Wake,
485            SDL_SCANCODE_CHANNEL_INCREMENT => ChannelIncrement,
486            SDL_SCANCODE_CHANNEL_DECREMENT => ChannelDecrement,
487            SDL_SCANCODE_MEDIA_PLAY => MediaPlay,
488            SDL_SCANCODE_MEDIA_PAUSE => MediaPause,
489            SDL_SCANCODE_MEDIA_RECORD => MediaRecord,
490            SDL_SCANCODE_MEDIA_FAST_FORWARD => MediaFastForward,
491            SDL_SCANCODE_MEDIA_REWIND => MediaRewind,
492            SDL_SCANCODE_MEDIA_NEXT_TRACK => MediaNextTrack,
493            SDL_SCANCODE_MEDIA_PREVIOUS_TRACK => MediaPreviousTrack,
494            SDL_SCANCODE_MEDIA_STOP => MediaStop,
495            SDL_SCANCODE_MEDIA_EJECT => MediaEject,
496            SDL_SCANCODE_MEDIA_PLAY_PAUSE => MediaPlayPause,
497            SDL_SCANCODE_MEDIA_SELECT => MediaSelect,
498            SDL_SCANCODE_AC_NEW => AcNew,
499            SDL_SCANCODE_AC_OPEN => AcOpen,
500            SDL_SCANCODE_AC_CLOSE => AcClose,
501            SDL_SCANCODE_AC_EXIT => AcExit,
502            SDL_SCANCODE_AC_SAVE => AcSave,
503            SDL_SCANCODE_AC_PRINT => AcPrint,
504            SDL_SCANCODE_AC_PROPERTIES => AcProperties,
505            SDL_SCANCODE_AC_SEARCH => AcSearch,
506            SDL_SCANCODE_AC_HOME => AcHome,
507            SDL_SCANCODE_AC_BACK => AcBack,
508            SDL_SCANCODE_AC_FORWARD => AcForward,
509            SDL_SCANCODE_AC_STOP => AcStop,
510            SDL_SCANCODE_AC_REFRESH => AcRefresh,
511            SDL_SCANCODE_AC_BOOKMARKS => AcBookmarks,
512            SDL_SCANCODE_SOFTLEFT => SoftLeft,
513            SDL_SCANCODE_SOFTRIGHT => SoftRight,
514            SDL_SCANCODE_CALL => Call,
515            SDL_SCANCODE_ENDCALL => EndCall,
516            SDL_SCANCODE_RESERVED => Reserved,
517            SDL_SCANCODE_COUNT => Count,
518            _ => return None,
519        })
520    }
521
522    pub fn to_i32(self) -> i32 {
523        self as i32
524    }
525}
526
527impl From<Scancode> for SDL_Scancode {
528    fn from(scancode: Scancode) -> SDL_Scancode {
529        unsafe { transmute(scancode as u32) }
530    }
531}
532
533use std::fmt;
534use sys::keycode::SDL_Keymod;
535
536impl fmt::Display for Scancode {
537    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
538        write!(f, "{}", self.name())
539    }
540}
541
542use crate::keyboard::Keycode;
543
544impl Scancode {
545    /// Gets the scancode from a virtual key. Returns None if there is no corresponding scancode.
546    #[doc(alias = "SDL_GetScancodeFromKey")]
547    pub fn from_keycode(keycode: Keycode, modstate: *mut SDL_Keymod) -> Option<Scancode> {
548        unsafe {
549            match sys::keyboard::SDL_GetScancodeFromKey(keycode.into(), modstate) {
550                SDL_SCANCODE_UNKNOWN => None,
551                scancode_id => Scancode::from_i32(scancode_id.0),
552            }
553        }
554    }
555
556    #[doc(alias = "SDL_GetScancodeFromName")]
557    pub fn from_name(name: &str) -> Option<Scancode> {
558        unsafe {
559            match CString::new(name) {
560                Ok(name) => match sys::keyboard::SDL_GetScancodeFromName(name.as_ptr()) {
561                    SDL_SCANCODE_UNKNOWN => None,
562                    scancode_id => Some(Scancode::from_i32(scancode_id.0).unwrap()),
563                },
564                // string contains a nul byte - it won't match anything.
565                Err(_) => None,
566            }
567        }
568    }
569
570    #[doc(alias = "SDL_GetScancodeName")]
571    pub fn name(self) -> &'static str {
572        // The name string pointer lives in static, read-only memory.
573        // Knowing this, we can always return a string slice.
574        unsafe {
575            let buf =
576                sys::keyboard::SDL_GetScancodeName(transmute::<u32, SDL_Scancode>(self as u32));
577            ::std::str::from_utf8(CStr::from_ptr(buf as *const _).to_bytes()).unwrap()
578        }
579    }
580}