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 #[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 Err(_) => None,
566 }
567 }
568 }
569
570 #[doc(alias = "SDL_GetScancodeName")]
571 pub fn name(self) -> &'static str {
572 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}