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 #[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 Err(_) => None,
579 }
580 }
581 }
582
583 #[doc(alias = "SDL_GetKeyName")]
584 pub fn name(self) -> String {
585 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}