1use kanata_keyberon::key_code::*;
4use once_cell::sync::Lazy;
5use parking_lot::Mutex;
6use rustc_hash::FxHashMap as HashMap;
7
8#[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
9mod linux;
10#[cfg(any(target_os = "macos", target_os = "unknown"))]
11mod macos;
12#[cfg(any(target_os = "windows", target_os = "unknown"))]
13mod windows;
14#[cfg(any(target_os = "macos", target_os = "unknown"))]
15pub use macos::PageCode;
16
17#[cfg(target_os = "windows")]
18pub use windows::VK_KPENTER_FAKE;
19
20mod mappings;
21
22#[cfg(target_os = "unknown")]
23#[derive(Clone, Copy)]
24pub enum Platform {
25 Win,
26 Linux,
27 Macos,
28}
29
30#[cfg(target_os = "unknown")]
31pub static OSCODE_MAPPING_VARIANT: Mutex<Platform> = Mutex::new(Platform::Linux);
32
33impl OsCode {
34 pub fn as_u16(self) -> u16 {
35 #[cfg(target_os = "unknown")]
36 return match *OSCODE_MAPPING_VARIANT.lock() {
37 Platform::Win => self.as_u16_windows(),
38 Platform::Linux => self.as_u16_linux(),
39 Platform::Macos => self.as_u16_macos(),
40 };
41
42 #[cfg(any(target_os = "linux", target_os = "android"))]
43 return self.as_u16_linux();
44
45 #[cfg(target_os = "windows")]
46 return self.as_u16_windows();
47
48 #[cfg(target_os = "macos")]
49 return self.as_u16_macos();
50 }
51
52 pub fn from_u16(code: u16) -> Option<Self> {
53 #[cfg(target_os = "unknown")]
54 return match *OSCODE_MAPPING_VARIANT.lock() {
55 Platform::Win => OsCode::from_u16_windows(code),
56 Platform::Linux => OsCode::from_u16_linux(code),
57 Platform::Macos => OsCode::from_u16_macos(code),
58 };
59
60 #[cfg(any(target_os = "linux", target_os = "android"))]
61 return OsCode::from_u16_linux(code);
62
63 #[cfg(target_os = "windows")]
64 return OsCode::from_u16_windows(code);
65
66 #[cfg(target_os = "macos")]
67 return OsCode::from_u16_macos(code);
68 }
69
70 pub fn is_modifier(self) -> bool {
71 matches!(
72 self,
73 OsCode::KEY_LEFTSHIFT
74 | OsCode::KEY_RIGHTSHIFT
75 | OsCode::KEY_LEFTMETA
76 | OsCode::KEY_RIGHTMETA
77 | OsCode::KEY_LEFTCTRL
78 | OsCode::KEY_RIGHTCTRL
79 | OsCode::KEY_LEFTALT
80 | OsCode::KEY_RIGHTALT
81 )
82 }
83
84 #[cfg(feature = "zippychord")]
85 pub fn is_zippy_ignored(self) -> bool {
86 matches!(
87 self,
88 OsCode::KEY_LEFTSHIFT
89 | OsCode::KEY_RIGHTSHIFT
90 | OsCode::KEY_LEFTMETA
91 | OsCode::KEY_RIGHTMETA
92 | OsCode::KEY_LEFTCTRL
93 | OsCode::KEY_RIGHTCTRL
94 | OsCode::KEY_LEFTALT
95 | OsCode::KEY_RIGHTALT
96 | OsCode::KEY_ESC
97 | OsCode::KEY_BACKSPACE
98 | OsCode::KEY_DELETE
99 )
100 }
101}
102
103static CUSTOM_STRS_TO_OSCODES: Lazy<Mutex<HashMap<String, OsCode>>> = Lazy::new(|| {
104 let mut mappings = HashMap::default();
105 add_default_str_osc_mappings(&mut mappings);
106 mappings.shrink_to_fit();
107 Mutex::new(mappings)
108});
109
110pub fn replace_custom_str_oscode_mapping(mapping: &HashMap<String, OsCode>) {
119 let mut local_mapping = CUSTOM_STRS_TO_OSCODES.lock();
120 local_mapping.clear();
121 local_mapping.extend(mapping.iter().map(|kv| (kv.0.clone(), *kv.1)));
122 add_default_str_osc_mappings(&mut local_mapping);
123 local_mapping.shrink_to_fit();
124}
125
126pub fn clear_custom_str_oscode_mapping() {
128 let mut local_mapping = CUSTOM_STRS_TO_OSCODES.lock();
129 local_mapping.clear();
130 local_mapping.shrink_to_fit();
131}
132
133fn add_default_str_osc_mappings(mapping: &mut HashMap<String, OsCode>) {
137 const DEFAULT_MAPPINGS: &[(&str, OsCode)] = &[
138 ("+", OsCode::KEY_KPPLUS),
139 ("[", OsCode::KEY_LEFTBRACE),
140 ("]", OsCode::KEY_RIGHTBRACE),
141 ("{", OsCode::KEY_LEFTBRACE),
142 ("}", OsCode::KEY_RIGHTBRACE),
143 ("/", OsCode::KEY_SLASH),
144 (";", OsCode::KEY_SEMICOLON),
145 ("`", OsCode::KEY_GRAVE),
146 ("=", OsCode::KEY_EQUAL),
147 ("-", OsCode::KEY_MINUS),
148 ("'", OsCode::KEY_APOSTROPHE),
149 (",", OsCode::KEY_COMMA),
150 (".", OsCode::KEY_DOT),
151 ("\\", OsCode::KEY_BACKSLASH),
152 ("yen", OsCode::KEY_BACKSLASH),
154 ("¥", OsCode::KEY_YEN),
156 ("right", OsCode::KEY_RIGHT),
157 ("grave", OsCode::KEY_GRAVE),
158 ];
159 for dm in DEFAULT_MAPPINGS {
160 mapping.entry(dm.0.into()).or_insert(dm.1);
161 }
162}
163
164#[rustfmt::skip]
172pub fn str_to_oscode(s: &str) -> Option<OsCode> {
173 if let Some(osc) = CUSTOM_STRS_TO_OSCODES.lock().get(s) {
174 return Some(*osc);
175 }
176 Some(match s {
177 "Backquote" | "grv" | "ˋ" | "˜" => OsCode::KEY_GRAVE,
178 "Digit1" | "1" => OsCode::KEY_1,
179 "Digit2" | "2" => OsCode::KEY_2,
180 "Digit3" | "3" => OsCode::KEY_3,
181 "Digit4" | "4" => OsCode::KEY_4,
182 "Digit5" | "5" => OsCode::KEY_5,
183 "Digit6" | "6" => OsCode::KEY_6,
184 "Digit7" | "7" => OsCode::KEY_7,
185 "Digit8" | "8" => OsCode::KEY_8,
186 "Digit9" | "9" => OsCode::KEY_9,
187 "Digit0" | "0" => OsCode::KEY_0,
188 "Minus" | "min" | "‐" => OsCode::KEY_MINUS,
189 "Equal" | "eql" | "₌" => OsCode::KEY_EQUAL,
190 "Backspace" | "bspc" | "bks" | "␈" | "⌫" => OsCode::KEY_BACKSPACE,
191 "Tab" | "tab" | "⭾" | "↹" => OsCode::KEY_TAB,
192 "KeyQ" | "q" => OsCode::KEY_Q,
193 "KeyW" | "w" => OsCode::KEY_W,
194 "KeyE" | "e" => OsCode::KEY_E,
195 "KeyR" | "r" => OsCode::KEY_R,
196 "KeyT" | "t" => OsCode::KEY_T,
197 "KeyY" | "y" => OsCode::KEY_Y,
198 "KeyU" | "u" => OsCode::KEY_U,
199 "KeyI" | "i" => OsCode::KEY_I,
200 "KeyO" | "o" => OsCode::KEY_O,
201 "KeyP" | "p" => OsCode::KEY_P,
202 "BracketLeft" | "lbrc" | "【" | "「" | "〔" | "⎡" => OsCode::KEY_LEFTBRACE,
203 "BracketRight" | "rbrc" | "】" | "」" | "〕" | "⎣" => OsCode::KEY_RIGHTBRACE,
204 "CapsLock" | "caps" | "⇪" => OsCode::KEY_CAPSLOCK,
205 "KeyA" | "a" => OsCode::KEY_A,
206 "KeyS" | "s" => OsCode::KEY_S,
207 "KeyD" | "d" => OsCode::KEY_D,
208 "KeyF" | "f" => OsCode::KEY_F,
209 "KeyG" | "g" => OsCode::KEY_G,
210 "KeyH" | "h" => OsCode::KEY_H,
211 "KeyJ" | "j" => OsCode::KEY_J,
212 "KeyK" | "k" => OsCode::KEY_K,
213 "KeyL" | "l" => OsCode::KEY_L,
214 "Semicolon" | "scln" | "︔" => OsCode::KEY_SEMICOLON,
215 "Quote" | "apo" | "apos" => OsCode::KEY_APOSTROPHE,
216 "Enter" | "ret" | "return" | "ent" | "enter" | "⏎" | "↩" | "↵" | "↲" | "⤶" | "⎆" | "⌤" | "" => OsCode::KEY_ENTER,
217 "ShiftLeft" | "lshift" | "lshft" | "lsft" | "shft" | "sft" | "‹⇧" => OsCode::KEY_LEFTSHIFT,
218 "KeyZ" | "z" => OsCode::KEY_Z,
219 "KeyX" | "x" => OsCode::KEY_X,
220 "KeyC" | "c" => OsCode::KEY_C,
221 "KeyV" | "v" => OsCode::KEY_V,
222 "KeyB" | "b" => OsCode::KEY_B,
223 "KeyN" | "n" => OsCode::KEY_N,
224 "KeyM" | "m" => OsCode::KEY_M,
225 "Comma" | "comm" | "⸴" => OsCode::KEY_COMMA,
226 "Period" | "." => OsCode::KEY_DOT,
227 "Slash" | "⁄" => OsCode::KEY_SLASH,
228 "Backslash" | "bksl" | "⧵" | "\" => OsCode::KEY_BACKSLASH,
229 "kp=" | "clr" => OsCode::KEY_CLEAR,
230 "Numpad0" | "kp0" | "🔢₀" => OsCode::KEY_KP0,
232 "Numpad1" | "kp1" | "🔢₁" => OsCode::KEY_KP1,
233 "Numpad2" | "kp2" | "🔢₂" => OsCode::KEY_KP2,
234 "Numpad3" | "kp3" | "🔢₃" => OsCode::KEY_KP3,
235 "Numpad4" | "kp4" | "🔢₄" => OsCode::KEY_KP4,
236 "Numpad5" | "kp5" | "🔢₅" => OsCode::KEY_KP5,
237 "Numpad6" | "kp6" | "🔢₆" => OsCode::KEY_KP6,
238 "Numpad7" | "kp7" | "🔢₇" => OsCode::KEY_KP7,
239 "Numpad8" | "kp8" | "🔢₈" => OsCode::KEY_KP8,
240 "Numpad9" | "kp9" | "🔢₉" => OsCode::KEY_KP9,
241 "NumpadEnter" | "kprt" | "🔢⏎" | "🔢↩" | "🔢↵" | "🔢↲" | "🔢⤶" | "🔢⎆" | "🔢⌤" | "🔢" => OsCode::KEY_KPENTER,
242 "NumpadDivide" | "kp/" | "🔢⁄" => OsCode::KEY_KPSLASH,
243 "NumpadAdd" | "kp+" | "🔢₊" => OsCode::KEY_KPPLUS,
244 "NumpadMultiply" | "kp*" | "🔢∗" => OsCode::KEY_KPASTERISK,
245 "NumpadEqual" | "🔢₌" => OsCode::KEY_KPEQUAL,
246 "NumpadSubtract" | "kp-" | "🔢₋" => OsCode::KEY_KPMINUS,
247 "NumpadDecimal" | "kp." | "🔢." => OsCode::KEY_KPDOT,
248 "NumpadComma" | "kp," | "🔢⸴" =>OsCode::KEY_KPCOMMA,
249 "NumpadLeftParen" | "leftparen" | "lpar" | "kp(" | "🔢₍" => OsCode::KEY_KPLEFTPAREN,
250 "NumpadRightParen" | "rightparen" | "rpar" | "kp)" | "🔢₎" => OsCode::KEY_KPRIGHTPAREN,
251 "ssrq" | "sys" => OsCode::KEY_SYSRQ,
252 "IntlBackslash" | "102d" | "lsgt" | "nubs" | "nonusbslash" | "﹨" | "<" => OsCode::KEY_102ND,
254 "ScrollLock" | "scrlck" | "slck" | "⇳🔒" => OsCode::KEY_SCROLLLOCK,
255 "Pause" | "pause" | "break" | "brk" => OsCode::KEY_PAUSE,
256 "WakeUp" | "wkup" => OsCode::KEY_WAKEUP,
257 "Escape" | "esc" | "⎋" => OsCode::KEY_ESC,
258 "ShiftRight" | "RightShift" | "rshift" | "rshft" | "rsft" | "⇧›" => OsCode::KEY_RIGHTSHIFT,
259 "ControlLeft" | "lctrl" | "lctl" | "ctl" | "‹⎈" | "‹⌃" => OsCode::KEY_LEFTCTRL,
260 "AltLeft" | "lalt" | "alt" | "‹⎇" | "‹⌥" => OsCode::KEY_LEFTALT,
261 "Space" | "spc" | "␠" | "␣" => OsCode::KEY_SPACE,
262 "AltRight" | "ralt" | "altgr" | "⎇›" | "⌥›" | "⇮" => OsCode::KEY_RIGHTALT,
263 "ContextMenu" | "comp" | "cmps" | "cmp" | "menu" | "apps" | "▤" | "☰" | "𝌆" => OsCode::KEY_COMPOSE,
264 "🎛" => OsCode::KEY_DASHBOARD,
265 "MetaLeft" | "lmeta" | "lmet" | "met" | "‹◆" | "‹⌘" | "‹❖" | "‹⊞" => OsCode::KEY_LEFTMETA,
267 "MetaRight" | "rmeta" | "rmet" | "◆›" | "⌘›" | "❖›" | "⊞›" => OsCode::KEY_RIGHTMETA,
268 "ControlRight" | "rctrl" | "rctl" | "⎈›" | "⌃›" => OsCode::KEY_RIGHTCTRL,
269 "Delete" | "del" | "␡" | "⌦" => OsCode::KEY_DELETE,
270 "Insert" | "ins" | "⎀" => OsCode::KEY_INSERT,
271 "BrowserBack" | "bck" => OsCode::KEY_BACK,
272 "BrowserForward" | "fwd" => OsCode::KEY_FORWARD,
273 "PageUp" | "pgup" | "⇞" | "⎗" => OsCode::KEY_PAGEUP,
274 "PageDown" | "pgdn" | "⇟" | "⎘" => OsCode::KEY_PAGEDOWN,
275 "ArrowUp" | "up" | "▲" | "↑" => OsCode::KEY_UP,
276 "ArrowDown" | "down" | "▼" | "↓" => OsCode::KEY_DOWN,
277 "ArrowLeft" | "lft" | "left" | "◀" | "←" => OsCode::KEY_LEFT,
278 "ArrowRight" | "rght" | "▶" | "→" => OsCode::KEY_RIGHT,
279 "Home" | "home" | "⇤" | "⤒" | "↖" | "⇱" => OsCode::KEY_HOME,
280 "End" | "end" | "⇥" | "⤓" | "↘" | "⇲" => OsCode::KEY_END,
281 "NumLock" | "nlck" | "nlk" | "⇭"=> OsCode::KEY_NUMLOCK,
282 "VolumeMute" | "mute" | "🔇" | "🔈⓪" | "🔈⓿" | "🔈₀" => OsCode::KEY_MUTE,
283 "VolumeUp" | "volu" | "🔊" | "🔈+" | "🔈➕" | "🔈₊" | "🔈⊕" => OsCode::KEY_VOLUMEUP,
284 "VolumeDown" | "voldwn" | "vold" | "🔉" | "🔈−" | "🔈➖" | "🔈₋" | "🔈⊖" => OsCode::KEY_VOLUMEDOWN,
285 "EjectCD" | "eject" => OsCode::KEY_EJECTCD,
286 "brup" | "bru" | "🔆" => OsCode::KEY_BRIGHTNESSUP,
287 "brdown" | "brdwn" | "brdn" | "🔅" => OsCode::KEY_BRIGHTNESSDOWN,
288 "blup" | "⌨💡+" | "⌨💡➕" | "⌨💡₊" | "⌨💡⊕" => OsCode::KEY_KBDILLUMUP,
289 "bldn" | "⌨💡−" | "⌨💡➖" | "⌨💡₋" | "⌨💡⊖" => OsCode::KEY_KBDILLUMDOWN,
290 "MediaTrackNext" | "next" | "▶▶" => OsCode::KEY_NEXTSONG,
291 "MediaPlayPause" | "pp" | "▶⏸" => OsCode::KEY_PLAYPAUSE,
292 "MediaTrackPrevious" | "prev" | "◀◀" => OsCode::KEY_PREVIOUSSONG,
293 "F1" | "f1" => OsCode::KEY_F1,
294 "F2" | "f2" => OsCode::KEY_F2,
295 "F3" | "f3" => OsCode::KEY_F3,
296 "F4" | "f4" => OsCode::KEY_F4,
297 "F5" | "f5" => OsCode::KEY_F5,
298 "F6" | "f6" => OsCode::KEY_F6,
299 "F7" | "f7" => OsCode::KEY_F7,
300 "F8" | "f8" => OsCode::KEY_F8,
301 "F9" | "f9" => OsCode::KEY_F9,
302 "F10" | "f10" => OsCode::KEY_F10,
303 "F11" | "f11" => OsCode::KEY_F11,
304 "F12" | "f12" => OsCode::KEY_F12,
305 "F13" | "f13" => OsCode::KEY_F13,
306 "F14" | "f14" => OsCode::KEY_F14,
307 "F15" | "f15" => OsCode::KEY_F15,
308 "F16" | "f16" => OsCode::KEY_F16,
309 "F17" | "f17" => OsCode::KEY_F17,
310 "F18" | "f18" => OsCode::KEY_F18,
311 "F19" | "f19" => OsCode::KEY_F19,
312 "F20" | "f20" => OsCode::KEY_F20,
313 "F21" | "f21" => OsCode::KEY_F21,
314 "F22" | "f22" => OsCode::KEY_F22,
315 "F23" | "f23" => OsCode::KEY_F23,
316 "F24" | "f24" => OsCode::KEY_F24,
317 #[cfg(any(target_os = "macos", target_os = "unknown"))]
318 "fn" | "🌐" | "ƒ" | "ⓕ" | "Ⓕ" | "🄵" | "🅕" | "🅵" => OsCode::KEY_FN,
319 #[cfg(target_os = "windows")]
320 "kana" | "katakana" | "katakanahiragana" => OsCode::KEY_HANGEUL,
321 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
322 "kana" | "katakanahiragana" => OsCode::KEY_KATAKANAHIRAGANA,
323 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
324 "hiragana" => OsCode::KEY_HIRAGANA,
325 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
326 "katakana" => OsCode::KEY_KATAKANA,
327 "cnv" | "conv" | "henk" | "hnk" | "henkan" => OsCode::KEY_HENKAN,
328 "ncnv" | "mhnk" | "muhenkan" => OsCode::KEY_MUHENKAN,
329 #[cfg(target_os = "macos")]
330 "Lang1" | "kana" => OsCode::KEY_HANGEUL,
331 #[cfg(any(target_os = "macos", target_os = "unknown"))]
332 "Lang2" | "eisu" => OsCode::KEY_HANJA,
333
334 #[cfg(any(target_os = "windows", target_os = "macos"))]
335 "IntlRo" | "ro" => OsCode::KEY_RO,
336
337 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
338 "PrintScreen" | "prtsc" | "prnt" | "⎙" => OsCode::KEY_SYSRQ,
339 #[cfg(target_os = "windows")]
340 "PrintScreen" | "prtsc" | "prnt" | "⎙" => OsCode::KEY_PRINT,
341
342 "mlft" | "mouseleft" | "🖰1" | "‹🖰" => OsCode::BTN_LEFT,
343 "mrgt" | "mouseright" | "🖰2" | "🖰›" => OsCode::BTN_RIGHT,
344 "mmid" | "mousemid" | "🖰3" => OsCode::BTN_MIDDLE,
345 "mbck" | "mousebackward" | "🖰4" => OsCode::BTN_SIDE,
346 "mfwd" | "mouseforward" | "🖰5" => OsCode::BTN_EXTRA,
347 "mwu" | "mousewheelup" => OsCode::MouseWheelUp,
348 "mwd" | "mousewheeldown" => OsCode::MouseWheelDown,
349 "mwl" | "mousewheelleft" => OsCode::MouseWheelLeft,
350 "mwr" | "mousewheelright" => OsCode::MouseWheelRight,
351
352 "hmpg" | "homepage" => OsCode::KEY_HOMEPAGE,
353 "mdia" | "media" => OsCode::KEY_MEDIA,
354 "LaunchMail" | "mail" => OsCode::KEY_MAIL,
355 "email" => OsCode::KEY_EMAIL,
356 "calc" => OsCode::KEY_CALC,
357
358 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
360 "plyr" | "player" => OsCode::KEY_PLAYER,
361 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
362 "powr" | "power" => OsCode::KEY_POWER,
363 #[cfg(any(target_os = "linux", target_os = "android", target_os = "unknown"))]
364 "zzz" | "sleep" => OsCode::KEY_SLEEP,
365
366 "sls" | "SpotLightSearch" => OsCode::KEY_249,
367 "dtn" | "Dictation" => OsCode::KEY_250,
368 "dnd" | "DoNotDisturb" => OsCode::KEY_251,
369 "mctl" | "MissionControl" => OsCode::KEY_252,
370 "lpad" | "LaunchPad" => OsCode::KEY_253,
371
372 "nop0" => OsCode::KEY_676,
375 "nop1" => OsCode::KEY_677,
376 "nop2" => OsCode::KEY_678,
377 "nop3" => OsCode::KEY_679,
378 "nop4" => OsCode::KEY_680,
379 "nop5" => OsCode::KEY_681,
380 "nop6" => OsCode::KEY_682,
381 "nop7" => OsCode::KEY_683,
382 "nop8" => OsCode::KEY_684,
383 "nop9" => OsCode::KEY_685,
384
385 "mvmt" | "mousemovement" | "🖰mv" => OsCode::KEY_766,
388
389 _ => return None,
390 })
391}
392
393#[repr(u16)]
397#[allow(non_camel_case_types)]
398#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
399pub enum OsCode {
400 KEY_RESERVED = 0,
401 KEY_ESC = 1,
402 KEY_1 = 2,
403 KEY_2 = 3,
404 KEY_3 = 4,
405 KEY_4 = 5,
406 KEY_5 = 6,
407 KEY_6 = 7,
408 KEY_7 = 8,
409 KEY_8 = 9,
410 KEY_9 = 10,
411 KEY_0 = 11,
412 KEY_MINUS = 12,
413 KEY_EQUAL = 13,
414 KEY_BACKSPACE = 14,
415 KEY_TAB = 15,
416 KEY_Q = 16,
417 KEY_W = 17,
418 KEY_E = 18,
419 KEY_R = 19,
420 KEY_T = 20,
421 KEY_Y = 21,
422 KEY_U = 22,
423 KEY_I = 23,
424 KEY_O = 24,
425 KEY_P = 25,
426 KEY_LEFTBRACE = 26,
427 KEY_RIGHTBRACE = 27,
428 KEY_ENTER = 28,
429 KEY_LEFTCTRL = 29,
430 KEY_A = 30,
431 KEY_S = 31,
432 KEY_D = 32,
433 KEY_F = 33,
434 KEY_G = 34,
435 KEY_H = 35,
436 KEY_J = 36,
437 KEY_K = 37,
438 KEY_L = 38,
439 KEY_SEMICOLON = 39,
440 KEY_APOSTROPHE = 40,
441 KEY_GRAVE = 41,
442 KEY_LEFTSHIFT = 42,
443 KEY_BACKSLASH = 43,
444 KEY_Z = 44,
445 KEY_X = 45,
446 KEY_C = 46,
447 KEY_V = 47,
448 KEY_B = 48,
449 KEY_N = 49,
450 KEY_M = 50,
451 KEY_COMMA = 51,
452 KEY_DOT = 52,
453 KEY_SLASH = 53,
454 KEY_RIGHTSHIFT = 54,
455 KEY_KPASTERISK = 55,
456 KEY_LEFTALT = 56,
457 KEY_SPACE = 57,
458 KEY_CAPSLOCK = 58,
459 KEY_F1 = 59,
460 KEY_F2 = 60,
461 KEY_F3 = 61,
462 KEY_F4 = 62,
463 KEY_F5 = 63,
464 KEY_F6 = 64,
465 KEY_F7 = 65,
466 KEY_F8 = 66,
467 KEY_F9 = 67,
468 KEY_F10 = 68,
469 KEY_NUMLOCK = 69,
470 KEY_SCROLLLOCK = 70,
471 KEY_KP7 = 71,
472 KEY_KP8 = 72,
473 KEY_KP9 = 73,
474 KEY_KPMINUS = 74,
475 KEY_KP4 = 75,
476 KEY_KP5 = 76,
477 KEY_KP6 = 77,
478 KEY_KPPLUS = 78,
479 KEY_KP1 = 79,
480 KEY_KP2 = 80,
481 KEY_KP3 = 81,
482 KEY_KP0 = 82,
483 KEY_KPDOT = 83,
484 KEY_84 = 84,
485 KEY_ZENKAKUHANKAKU = 85,
486 KEY_102ND = 86,
487 KEY_F11 = 87,
488 KEY_F12 = 88,
489 KEY_RO = 89,
490 KEY_KATAKANA = 90,
491 KEY_HIRAGANA = 91,
492 KEY_HENKAN = 92,
493 KEY_KATAKANAHIRAGANA = 93,
494 KEY_MUHENKAN = 94,
495 KEY_KPJPCOMMA = 95,
496 KEY_KPENTER = 96,
497 KEY_RIGHTCTRL = 97,
498 KEY_KPSLASH = 98,
499 KEY_SYSRQ = 99,
500 KEY_RIGHTALT = 100,
501 KEY_LINEFEED = 101,
502 KEY_HOME = 102,
503 KEY_UP = 103,
504 KEY_PAGEUP = 104,
505 KEY_LEFT = 105,
506 KEY_RIGHT = 106,
507 KEY_END = 107,
508 KEY_DOWN = 108,
509 KEY_PAGEDOWN = 109,
510 KEY_INSERT = 110,
511 KEY_DELETE = 111,
512 KEY_MACRO = 112,
513 KEY_MUTE = 113,
514 KEY_VOLUMEDOWN = 114,
515 KEY_VOLUMEUP = 115,
516 KEY_POWER = 116,
517 KEY_KPEQUAL = 117,
518 KEY_KPPLUSMINUS = 118,
519 KEY_PAUSE = 119,
520 KEY_SCALE = 120,
521 KEY_KPCOMMA = 121,
522 KEY_HANGEUL = 122,
523 KEY_HANJA = 123,
524 KEY_YEN = 124,
525 KEY_LEFTMETA = 125,
526 KEY_RIGHTMETA = 126,
527 KEY_COMPOSE = 127,
528 KEY_STOP = 128,
529 KEY_AGAIN = 129,
530 KEY_PROPS = 130,
531 KEY_UNDO = 131,
532 KEY_FRONT = 132,
533 KEY_COPY = 133,
534 KEY_OPEN = 134,
535 KEY_PASTE = 135,
536 KEY_FIND = 136,
537 KEY_CUT = 137,
538 KEY_HELP = 138,
539 KEY_MENU = 139,
540 KEY_CALC = 140,
541 KEY_SETUP = 141,
542 KEY_SLEEP = 142,
543 KEY_WAKEUP = 143,
544 KEY_FILE = 144,
545 KEY_SENDFILE = 145,
546 KEY_DELETEFILE = 146,
547 KEY_XFER = 147,
548 KEY_PROG1 = 148,
549 KEY_PROG2 = 149,
550 KEY_WWW = 150,
551 KEY_MSDOS = 151,
552 KEY_COFFEE = 152,
553 KEY_ROTATE_DISPLAY = 153,
554 KEY_CYCLEWINDOWS = 154,
555 KEY_MAIL = 155,
556 KEY_BOOKMARKS = 156,
557 KEY_COMPUTER = 157,
558 KEY_BACK = 158,
559 KEY_FORWARD = 159,
560 KEY_CLOSECD = 160,
561 KEY_EJECTCD = 161,
562 KEY_EJECTCLOSECD = 162,
563 KEY_NEXTSONG = 163,
564 KEY_PLAYPAUSE = 164,
565 KEY_PREVIOUSSONG = 165,
566 KEY_STOPCD = 166,
567 KEY_RECORD = 167,
568 KEY_REWIND = 168,
569 KEY_PHONE = 169,
570 KEY_ISO = 170,
571 KEY_CONFIG = 171,
572 KEY_HOMEPAGE = 172,
573 KEY_REFRESH = 173,
574 KEY_EXIT = 174,
575 KEY_MOVE = 175,
576 KEY_EDIT = 176,
577 KEY_SCROLLUP = 177,
578 KEY_SCROLLDOWN = 178,
579 KEY_KPLEFTPAREN = 179,
580 KEY_KPRIGHTPAREN = 180,
581 KEY_NEW = 181,
582 KEY_REDO = 182,
583 KEY_F13 = 183,
584 KEY_F14 = 184,
585 KEY_F15 = 185,
586 KEY_F16 = 186,
587 KEY_F17 = 187,
588 KEY_F18 = 188,
589 KEY_F19 = 189,
590 KEY_F20 = 190,
591 KEY_F21 = 191,
592 KEY_F22 = 192,
593 KEY_F23 = 193,
594 KEY_F24 = 194,
595 KEY_195 = 195,
596 KEY_196 = 196,
597 KEY_197 = 197,
598 KEY_198 = 198,
599 KEY_199 = 199,
600 KEY_PLAYCD = 200,
601 KEY_PAUSECD = 201,
602 KEY_PROG3 = 202,
603 KEY_PROG4 = 203,
604 KEY_DASHBOARD = 204,
605 KEY_SUSPEND = 205,
606 KEY_CLOSE = 206,
607 KEY_PLAY = 207,
608 KEY_FASTFORWARD = 208,
609 KEY_BASSBOOST = 209,
610 KEY_PRINT = 210,
611 KEY_HP = 211,
612 KEY_CAMERA = 212,
613 KEY_SOUND = 213,
614 KEY_QUESTION = 214,
615 KEY_EMAIL = 215,
616 KEY_CHAT = 216,
617 KEY_SEARCH = 217,
618 KEY_CONNECT = 218,
619 KEY_FINANCE = 219,
620 KEY_SPORT = 220,
621 KEY_SHOP = 221,
622 KEY_ALTERASE = 222,
623 KEY_CANCEL = 223,
624 KEY_BRIGHTNESSDOWN = 224,
625 KEY_BRIGHTNESSUP = 225,
626 KEY_MEDIA = 226,
627 KEY_SWITCHVIDEOMODE = 227,
628 KEY_KBDILLUMTOGGLE = 228,
629 KEY_KBDILLUMDOWN = 229,
630 KEY_KBDILLUMUP = 230,
631 KEY_SEND = 231,
632 KEY_REPLY = 232,
633 KEY_FORWARDMAIL = 233,
634 KEY_SAVE = 234,
635 KEY_DOCUMENTS = 235,
636 KEY_BATTERY = 236,
637 KEY_BLUETOOTH = 237,
638 KEY_WLAN = 238,
639 KEY_UWB = 239,
640 KEY_UNKNOWN = 240,
641 KEY_VIDEO_NEXT = 241,
642 KEY_VIDEO_PREV = 242,
643 KEY_BRIGHTNESS_CYCLE = 243,
644 KEY_BRIGHTNESS_AUTO = 244,
645 KEY_DISPLAY_OFF = 245,
646 KEY_WWAN = 246,
647 KEY_RFKILL = 247,
648 KEY_MICMUTE = 248,
649 KEY_249 = 249,
650 KEY_250 = 250,
651 KEY_251 = 251,
652 KEY_252 = 252,
653 KEY_253 = 253,
654 KEY_254 = 254,
655 KEY_255 = 255,
656 BTN_0 = 256,
657 BTN_1 = 257,
658 BTN_2 = 258,
659 BTN_3 = 259,
660 BTN_4 = 260,
661 BTN_5 = 261,
662 BTN_6 = 262,
663 BTN_7 = 263,
664 BTN_8 = 264,
665 BTN_9 = 265,
666 KEY_266 = 266,
667 KEY_267 = 267,
668 KEY_268 = 268,
669 KEY_269 = 269,
670 KEY_270 = 270,
671 KEY_271 = 271,
672 BTN_LEFT = 272,
673 BTN_RIGHT = 273,
674 BTN_MIDDLE = 274,
675 BTN_SIDE = 275,
676 BTN_EXTRA = 276,
677 BTN_FORWARD = 277,
678 BTN_BACK = 278,
679 BTN_TASK = 279,
680 KEY_280 = 280,
681 KEY_281 = 281,
682 KEY_282 = 282,
683 KEY_283 = 283,
684 KEY_284 = 284,
685 KEY_285 = 285,
686 KEY_286 = 286,
687 KEY_287 = 287,
688 BTN_TRIGGER = 288,
689 BTN_THUMB = 289,
690 BTN_THUMB2 = 290,
691 BTN_TOP = 291,
692 BTN_TOP2 = 292,
693 BTN_PINKIE = 293,
694 BTN_BASE = 294,
695 BTN_BASE2 = 295,
696 BTN_BASE3 = 296,
697 BTN_BASE4 = 297,
698 BTN_BASE5 = 298,
699 BTN_BASE6 = 299,
700 KEY_300 = 300,
701 KEY_301 = 301,
702 KEY_302 = 302,
703 BTN_DEAD = 303,
704 BTN_SOUTH = 304,
705 BTN_EAST = 305,
706 BTN_C = 306,
707 BTN_NORTH = 307,
708 BTN_WEST = 308,
709 BTN_Z = 309,
710 BTN_TL = 310,
711 BTN_TR = 311,
712 BTN_TL2 = 312,
713 BTN_TR2 = 313,
714 BTN_SELECT = 314,
715 BTN_START = 315,
716 BTN_MODE = 316,
717 BTN_THUMBL = 317,
718 BTN_THUMBR = 318,
719 KEY_319 = 319,
720 BTN_TOOL_PEN = 320,
721 BTN_TOOL_RUBBER = 321,
722 BTN_TOOL_BRUSH = 322,
723 BTN_TOOL_PENCIL = 323,
724 BTN_TOOL_AIRBRUSH = 324,
725 BTN_TOOL_FINGER = 325,
726 BTN_TOOL_MOUSE = 326,
727 BTN_TOOL_LENS = 327,
728 BTN_TOOL_QUINTTAP = 328,
729 BTN_STYLUS3 = 329,
730 BTN_TOUCH = 330,
731 BTN_STYLUS = 331,
732 BTN_STYLUS2 = 332,
733 BTN_TOOL_DOUBLETAP = 333,
734 BTN_TOOL_TRIPLETAP = 334,
735 BTN_TOOL_QUADTAP = 335,
736 BTN_GEAR_DOWN = 336,
737 BTN_GEAR_UP = 337,
738 KEY_338 = 338,
739 KEY_339 = 339,
740 KEY_340 = 340,
741 KEY_341 = 341,
742 KEY_342 = 342,
743 KEY_343 = 343,
744 KEY_344 = 344,
745 KEY_345 = 345,
746 KEY_346 = 346,
747 KEY_347 = 347,
748 KEY_348 = 348,
749 KEY_349 = 349,
750 KEY_350 = 350,
751 KEY_351 = 351,
752 KEY_OK = 352,
753 KEY_SELECT = 353,
754 KEY_GOTO = 354,
755 KEY_CLEAR = 355,
756 KEY_POWER2 = 356,
757 KEY_OPTION = 357,
758 KEY_INFO = 358,
759 KEY_TIME = 359,
760 KEY_VENDOR = 360,
761 KEY_ARCHIVE = 361,
762 KEY_PROGRAM = 362,
763 KEY_CHANNEL = 363,
764 KEY_FAVORITES = 364,
765 KEY_EPG = 365,
766 KEY_PVR = 366,
767 KEY_MHP = 367,
768 KEY_LANGUAGE = 368,
769 KEY_TITLE = 369,
770 KEY_SUBTITLE = 370,
771 KEY_ANGLE = 371,
772 KEY_FULL_SCREEN = 372,
773 KEY_MODE = 373,
774 KEY_KEYBOARD = 374,
775 KEY_ASPECT_RATIO = 375,
776 KEY_PC = 376,
777 KEY_TV = 377,
778 KEY_TV2 = 378,
779 KEY_VCR = 379,
780 KEY_VCR2 = 380,
781 KEY_SAT = 381,
782 KEY_SAT2 = 382,
783 KEY_CD = 383,
784 KEY_TAPE = 384,
785 KEY_RADIO = 385,
786 KEY_TUNER = 386,
787 KEY_PLAYER = 387,
788 KEY_TEXT = 388,
789 KEY_DVD = 389,
790 KEY_AUX = 390,
791 KEY_MP3 = 391,
792 KEY_AUDIO = 392,
793 KEY_VIDEO = 393,
794 KEY_DIRECTORY = 394,
795 KEY_LIST = 395,
796 KEY_MEMO = 396,
797 KEY_CALENDAR = 397,
798 KEY_RED = 398,
799 KEY_GREEN = 399,
800 KEY_YELLOW = 400,
801 KEY_BLUE = 401,
802 KEY_CHANNELUP = 402,
803 KEY_CHANNELDOWN = 403,
804 KEY_FIRST = 404,
805 KEY_LAST = 405,
806 KEY_AB = 406,
807 KEY_NEXT = 407,
808 KEY_RESTART = 408,
809 KEY_SLOW = 409,
810 KEY_SHUFFLE = 410,
811 KEY_BREAK = 411,
812 KEY_PREVIOUS = 412,
813 KEY_DIGITS = 413,
814 KEY_TEEN = 414,
815 KEY_TWEN = 415,
816 KEY_VIDEOPHONE = 416,
817 KEY_GAMES = 417,
818 KEY_ZOOMIN = 418,
819 KEY_ZOOMOUT = 419,
820 KEY_ZOOMRESET = 420,
821 KEY_WORDPROCESSOR = 421,
822 KEY_EDITOR = 422,
823 KEY_SPREADSHEET = 423,
824 KEY_GRAPHICSEDITOR = 424,
825 KEY_PRESENTATION = 425,
826 KEY_DATABASE = 426,
827 KEY_NEWS = 427,
828 KEY_VOICEMAIL = 428,
829 KEY_ADDRESSBOOK = 429,
830 KEY_MESSENGER = 430,
831 KEY_DISPLAYTOGGLE = 431,
832 KEY_SPELLCHECK = 432,
833 KEY_LOGOFF = 433,
834 KEY_DOLLAR = 434,
835 KEY_EURO = 435,
836 KEY_FRAMEBACK = 436,
837 KEY_FRAMEFORWARD = 437,
838 KEY_CONTEXT_MENU = 438,
839 KEY_MEDIA_REPEAT = 439,
840 KEY_10CHANNELSUP = 440,
841 KEY_10CHANNELSDOWN = 441,
842 KEY_IMAGES = 442,
843 KEY_443 = 443,
844 KEY_444 = 444,
845 KEY_445 = 445,
846 KEY_446 = 446,
847 KEY_447 = 447,
848 KEY_DEL_EOL = 448,
849 KEY_DEL_EOS = 449,
850 KEY_INS_LINE = 450,
851 KEY_DEL_LINE = 451,
852 KEY_452 = 452,
853 KEY_453 = 453,
854 KEY_454 = 454,
855 KEY_455 = 455,
856 KEY_456 = 456,
857 KEY_457 = 457,
858 KEY_458 = 458,
859 KEY_459 = 459,
860 KEY_460 = 460,
861 KEY_461 = 461,
862 KEY_462 = 462,
863 KEY_463 = 463,
864 KEY_FN = 464,
865 KEY_FN_ESC = 465,
866 KEY_FN_F1 = 466,
867 KEY_FN_F2 = 467,
868 KEY_FN_F3 = 468,
869 KEY_FN_F4 = 469,
870 KEY_FN_F5 = 470,
871 KEY_FN_F6 = 471,
872 KEY_FN_F7 = 472,
873 KEY_FN_F8 = 473,
874 KEY_FN_F9 = 474,
875 KEY_FN_F10 = 475,
876 KEY_FN_F11 = 476,
877 KEY_FN_F12 = 477,
878 KEY_FN_1 = 478,
879 KEY_FN_2 = 479,
880 KEY_FN_D = 480,
881 KEY_FN_E = 481,
882 KEY_FN_F = 482,
883 KEY_FN_S = 483,
884 KEY_FN_B = 484,
885 KEY_485 = 485,
886 KEY_486 = 486,
887 KEY_487 = 487,
888 KEY_488 = 488,
889 KEY_489 = 489,
890 KEY_490 = 490,
891 KEY_491 = 491,
892 KEY_492 = 492,
893 KEY_493 = 493,
894 KEY_494 = 494,
895 KEY_495 = 495,
896 KEY_496 = 496,
897 KEY_BRL_DOT1 = 497,
898 KEY_BRL_DOT2 = 498,
899 KEY_BRL_DOT3 = 499,
900 KEY_BRL_DOT4 = 500,
901 KEY_BRL_DOT5 = 501,
902 KEY_BRL_DOT6 = 502,
903 KEY_BRL_DOT7 = 503,
904 KEY_BRL_DOT8 = 504,
905 KEY_BRL_DOT9 = 505,
906 KEY_BRL_DOT10 = 506,
907 KEY_507 = 507,
908 KEY_508 = 508,
909 KEY_509 = 509,
910 KEY_510 = 510,
911 KEY_511 = 511,
912 KEY_NUMERIC_0 = 512,
913 KEY_NUMERIC_1 = 513,
914 KEY_NUMERIC_2 = 514,
915 KEY_NUMERIC_3 = 515,
916 KEY_NUMERIC_4 = 516,
917 KEY_NUMERIC_5 = 517,
918 KEY_NUMERIC_6 = 518,
919 KEY_NUMERIC_7 = 519,
920 KEY_NUMERIC_8 = 520,
921 KEY_NUMERIC_9 = 521,
922 KEY_NUMERIC_STAR = 522,
923 KEY_NUMERIC_POUND = 523,
924 KEY_NUMERIC_A = 524,
925 KEY_NUMERIC_B = 525,
926 KEY_NUMERIC_C = 526,
927 KEY_NUMERIC_D = 527,
928 KEY_CAMERA_FOCUS = 528,
929 KEY_WPS_BUTTON = 529,
930 KEY_TOUCHPAD_TOGGLE = 530,
931 KEY_TOUCHPAD_ON = 531,
932 KEY_TOUCHPAD_OFF = 532,
933 KEY_CAMERA_ZOOMIN = 533,
934 KEY_CAMERA_ZOOMOUT = 534,
935 KEY_CAMERA_UP = 535,
936 KEY_CAMERA_DOWN = 536,
937 KEY_CAMERA_LEFT = 537,
938 KEY_CAMERA_RIGHT = 538,
939 KEY_ATTENDANT_ON = 539,
940 KEY_ATTENDANT_OFF = 540,
941 KEY_ATTENDANT_TOGGLE = 541,
942 KEY_LIGHTS_TOGGLE = 542,
943 KEY_543 = 543,
944 BTN_DPAD_UP = 544,
945 BTN_DPAD_DOWN = 545,
946 BTN_DPAD_LEFT = 546,
947 BTN_DPAD_RIGHT = 547,
948 KEY_548 = 548,
949 KEY_549 = 549,
950 KEY_550 = 550,
951 KEY_551 = 551,
952 KEY_552 = 552,
953 KEY_553 = 553,
954 KEY_554 = 554,
955 KEY_555 = 555,
956 KEY_556 = 556,
957 KEY_557 = 557,
958 KEY_558 = 558,
959 KEY_559 = 559,
960 KEY_ALS_TOGGLE = 560,
961 KEY_ROTATE_LOCK_TOGGLE = 561,
962 KEY_562 = 562,
963 KEY_563 = 563,
964 KEY_564 = 564,
965 KEY_565 = 565,
966 KEY_566 = 566,
967 KEY_567 = 567,
968 KEY_568 = 568,
969 KEY_569 = 569,
970 KEY_570 = 570,
971 KEY_571 = 571,
972 KEY_572 = 572,
973 KEY_573 = 573,
974 KEY_574 = 574,
975 KEY_575 = 575,
976 KEY_BUTTONCONFIG = 576,
977 KEY_TASKMANAGER = 577,
978 KEY_JOURNAL = 578,
979 KEY_CONTROLPANEL = 579,
980 KEY_APPSELECT = 580,
981 KEY_SCREENSAVER = 581,
982 KEY_VOICECOMMAND = 582,
983 KEY_ASSISTANT = 583,
984 KEY_KBD_LAYOUT_NEXT = 584,
985 KEY_585 = 585,
986 KEY_586 = 586,
987 KEY_587 = 587,
988 KEY_588 = 588,
989 KEY_589 = 589,
990 KEY_590 = 590,
991 KEY_591 = 591,
992 KEY_BRIGHTNESS_MIN = 592,
993 KEY_BRIGHTNESS_MAX = 593,
994 KEY_594 = 594,
995 KEY_595 = 595,
996 KEY_596 = 596,
997 KEY_597 = 597,
998 KEY_598 = 598,
999 KEY_599 = 599,
1000 KEY_600 = 600,
1001 KEY_601 = 601,
1002 KEY_602 = 602,
1003 KEY_603 = 603,
1004 KEY_604 = 604,
1005 KEY_605 = 605,
1006 KEY_606 = 606,
1007 KEY_607 = 607,
1008 KEY_KBDINPUTASSIST_PREV = 608,
1009 KEY_KBDINPUTASSIST_NEXT = 609,
1010 KEY_KBDINPUTASSIST_PREVGROUP = 610,
1011 KEY_KBDINPUTASSIST_NEXTGROUP = 611,
1012 KEY_KBDINPUTASSIST_ACCEPT = 612,
1013 KEY_KBDINPUTASSIST_CANCEL = 613,
1014 KEY_RIGHT_UP = 614,
1015 KEY_RIGHT_DOWN = 615,
1016 KEY_LEFT_UP = 616,
1017 KEY_LEFT_DOWN = 617,
1018 KEY_ROOT_MENU = 618,
1019 KEY_MEDIA_TOP_MENU = 619,
1020 KEY_NUMERIC_11 = 620,
1021 KEY_NUMERIC_12 = 621,
1022 KEY_AUDIO_DESC = 622,
1023 KEY_3D_MODE = 623,
1024 KEY_NEXT_FAVORITE = 624,
1025 KEY_STOP_RECORD = 625,
1026 KEY_PAUSE_RECORD = 626,
1027 KEY_VOD = 627,
1028 KEY_UNMUTE = 628,
1029 KEY_FASTREVERSE = 629,
1030 KEY_SLOWREVERSE = 630,
1031 KEY_DATA = 631,
1032 KEY_ONSCREEN_KEYBOARD = 632,
1033 KEY_633 = 633,
1034 KEY_634 = 634,
1035 KEY_635 = 635,
1036 KEY_636 = 636,
1037 KEY_637 = 637,
1038 KEY_638 = 638,
1039 KEY_639 = 639,
1040 KEY_640 = 640,
1041 KEY_641 = 641,
1042 KEY_642 = 642,
1043 KEY_643 = 643,
1044 KEY_644 = 644,
1045 KEY_645 = 645,
1046 KEY_646 = 646,
1047 KEY_647 = 647,
1048 KEY_648 = 648,
1049 KEY_649 = 649,
1050 KEY_650 = 650,
1051 KEY_651 = 651,
1052 KEY_652 = 652,
1053 KEY_653 = 653,
1054 KEY_654 = 654,
1055 KEY_655 = 655,
1056 KEY_656 = 656, KEY_657 = 657, KEY_658 = 658, KEY_659 = 659,
1060 KEY_660 = 660,
1061 KEY_661 = 661,
1062 KEY_662 = 662,
1063 KEY_663 = 663,
1064 KEY_664 = 664,
1065 KEY_665 = 665,
1066 KEY_666 = 666,
1067 KEY_667 = 667,
1068 KEY_668 = 668,
1069 KEY_669 = 669,
1070 KEY_670 = 670,
1071 KEY_671 = 671,
1072 KEY_672 = 672,
1073 KEY_673 = 673,
1074 KEY_674 = 674,
1075 KEY_675 = 675,
1076 KEY_676 = 676, KEY_677 = 677,
1078 KEY_678 = 678,
1079 KEY_679 = 679,
1080 KEY_680 = 680,
1081 KEY_681 = 681,
1082 KEY_682 = 682,
1083 KEY_683 = 683,
1084 KEY_684 = 684, KEY_685 = 685, KEY_686 = 686,
1087 KEY_687 = 687,
1088 KEY_688 = 688,
1089 KEY_689 = 689,
1090 KEY_690 = 690,
1091 KEY_691 = 691,
1092 KEY_692 = 692,
1093 KEY_693 = 693,
1094 KEY_694 = 694,
1095 KEY_695 = 695,
1096 KEY_696 = 696,
1097 KEY_697 = 697,
1098 KEY_698 = 698,
1099 KEY_699 = 699,
1100 KEY_700 = 700,
1101 KEY_701 = 701,
1102 KEY_702 = 702,
1103 KEY_703 = 703,
1104 BTN_TRIGGER_HAPPY1 = 704,
1105 BTN_TRIGGER_HAPPY2 = 705,
1106 BTN_TRIGGER_HAPPY3 = 706,
1107 BTN_TRIGGER_HAPPY4 = 707,
1108 BTN_TRIGGER_HAPPY5 = 708,
1109 BTN_TRIGGER_HAPPY6 = 709,
1110 BTN_TRIGGER_HAPPY7 = 710,
1111 BTN_TRIGGER_HAPPY8 = 711,
1112 BTN_TRIGGER_HAPPY9 = 712,
1113 BTN_TRIGGER_HAPPY10 = 713,
1114 BTN_TRIGGER_HAPPY11 = 714,
1115 BTN_TRIGGER_HAPPY12 = 715,
1116 BTN_TRIGGER_HAPPY13 = 716,
1117 BTN_TRIGGER_HAPPY14 = 717,
1118 BTN_TRIGGER_HAPPY15 = 718,
1119 BTN_TRIGGER_HAPPY16 = 719,
1120 BTN_TRIGGER_HAPPY17 = 720,
1121 BTN_TRIGGER_HAPPY18 = 721,
1122 BTN_TRIGGER_HAPPY19 = 722,
1123 BTN_TRIGGER_HAPPY20 = 723,
1124 BTN_TRIGGER_HAPPY21 = 724,
1125 BTN_TRIGGER_HAPPY22 = 725,
1126 BTN_TRIGGER_HAPPY23 = 726,
1127 BTN_TRIGGER_HAPPY24 = 727,
1128 BTN_TRIGGER_HAPPY25 = 728,
1129 BTN_TRIGGER_HAPPY26 = 729,
1130 BTN_TRIGGER_HAPPY27 = 730,
1131 BTN_TRIGGER_HAPPY28 = 731,
1132 BTN_TRIGGER_HAPPY29 = 732,
1133 BTN_TRIGGER_HAPPY30 = 733,
1134 BTN_TRIGGER_HAPPY31 = 734,
1135 BTN_TRIGGER_HAPPY32 = 735,
1136 BTN_TRIGGER_HAPPY33 = 736,
1137 BTN_TRIGGER_HAPPY34 = 737,
1138 BTN_TRIGGER_HAPPY35 = 738,
1139 BTN_TRIGGER_HAPPY36 = 739,
1140 BTN_TRIGGER_HAPPY37 = 740,
1141 BTN_TRIGGER_HAPPY38 = 741,
1142 BTN_TRIGGER_HAPPY39 = 742,
1143 BTN_TRIGGER_HAPPY40 = 743,
1144 BTN_MAX = 744,
1145
1146 MouseWheelUp = 745,
1151 MouseWheelDown = 746,
1152 MouseWheelLeft = 747,
1153 MouseWheelRight = 748,
1154
1155 KEY_749 = 749,
1156 KEY_750 = 750,
1157 KEY_751 = 751,
1158 KEY_752 = 752,
1159 KEY_753 = 753,
1160 KEY_754 = 754,
1161 KEY_755 = 755,
1162 KEY_756 = 756,
1163 KEY_757 = 757,
1164 KEY_758 = 758,
1165 KEY_759 = 759,
1166 KEY_760 = 760,
1167 KEY_761 = 761,
1168 KEY_762 = 762,
1169 KEY_763 = 763,
1170 KEY_764 = 764,
1171 KEY_765 = 765,
1172 KEY_766 = 766, KEY_MAX = 767,
1175}
1176
1177impl OsCode {
1178 pub fn is_mouse_code(&self) -> bool {
1179 use OsCode::*;
1180 matches!(
1181 self,
1182 BTN_LEFT
1183 | BTN_RIGHT
1184 | BTN_MIDDLE
1185 | BTN_SIDE
1186 | BTN_EXTRA
1187 | MouseWheelUp
1188 | MouseWheelDown
1189 | MouseWheelLeft
1190 | MouseWheelRight
1191 )
1192 }
1193}
1194
1195use core::fmt;
1196impl fmt::Display for OsCode {
1197 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1198 let self_dbg = format!("{self:?}");
1199 if let Some(key) = self_dbg.strip_prefix("KEY_") {
1200 write!(f, "{key}")
1201 } else {
1202 write!(f, "{self:?}")
1203 }
1204 }
1205}
1206
1207#[test]
1208fn parser_key_max_lt_keyberon_key_max() {
1209 assert!(u16::from(OsCode::KEY_MAX) < KEY_MAX);
1210}
1211
1212impl TryFrom<usize> for OsCode {
1213 type Error = ();
1214 fn try_from(item: usize) -> Result<Self, Self::Error> {
1215 match Self::from_u16(item as u16) {
1216 Some(kc) => Ok(kc),
1217 _ => Err(()),
1218 }
1219 }
1220}
1221
1222impl From<u32> for OsCode {
1223 fn from(item: u32) -> Self {
1224 Self::from_u16(item as u16).unwrap_or_else(|| panic!("Invalid KeyCode: {item}"))
1225 }
1226}
1227
1228impl From<u16> for OsCode {
1229 fn from(item: u16) -> Self {
1230 Self::from_u16(item).unwrap_or_else(|| panic!("Invalid KeyCode: {item}"))
1231 }
1232}
1233
1234impl From<OsCode> for usize {
1235 fn from(item: OsCode) -> Self {
1236 item.as_u16() as usize
1237 }
1238}
1239
1240impl From<OsCode> for u32 {
1241 fn from(item: OsCode) -> Self {
1242 item.as_u16() as u32
1243 }
1244}
1245
1246impl From<OsCode> for i32 {
1247 fn from(item: OsCode) -> Self {
1248 item.as_u16() as i32
1249 }
1250}
1251
1252impl From<OsCode> for u16 {
1253 fn from(item: OsCode) -> Self {
1254 item.as_u16()
1255 }
1256}
1257
1258impl From<&OsCode> for KeyCode {
1259 fn from(item: &OsCode) -> KeyCode {
1260 (*item).into()
1261 }
1262}
1263impl From<&KeyCode> for OsCode {
1264 fn from(item: &KeyCode) -> Self {
1265 (*item).into()
1266 }
1267}