kanata_parser/keys/
mod.rs

1//! Platform specific code for OS key code mappings.
2
3use 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
110/// Replaces the stateful custom `String` to `OsCode` mapping in this module with the input
111/// mapping.
112///
113/// This will change how `str_to_oscode` behaves. One could imagine that a new `struct` could be
114/// created and `str_to_oscode` would become a method on that struct instead of a standalone
115/// function. I'm too lazy to do that right now and based on how `keys` is used right now, it
116/// should not be a problem. A potential immediate issue that comes to mind is concurrent tests
117/// that have `defcustomkeys`.
118pub 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
126/// Clears the stateful custom `String` to `OsCode` mapping in this module.
127pub 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
133/// Used for backwards compatibility. If there is hardcoded key name in `str_to_oscode` that would
134/// be useful to remap via `defcustomkeys`, then it should be moved into here. This is so that the
135/// key name can be remapped while also working for older configurations that already use it.
136fn 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        // Mapped as backslash because in some locales/fonts, yen=backslash
153        ("yen", OsCode::KEY_BACKSLASH),
154        // Unicode yen is probably the yen key, so map this to a separate oscode by default.
155        ("¥", 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/// Convert a `&str` to an `OsCode`.
165///
166/// kmonad's str to key mapping is found here as a reference:
167/// https://github.com/kmonad/kmonad/blob/master/src/KMonad/Keyboard/Keycode.hs
168///
169/// Do your best to keep the str side a maximum character length of 4 so that configuration file
170/// can stay clean.
171#[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        // The kp<etc> keys are also known as the numpad keys. E.g. below is numpad enter.
231        "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        // Typically the Non-US backslash, near the left shift key
253        "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        // Also known as Windows, GUI, Comand, Super
266        "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        // NOTE: these are linux-only right now due to missing the mappings in windows.rs
359        #[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        // Keys that behave as no-ops but can be used in sequences.
373        // Also see: POTENTIAL PROBLEM - G-keys
374        "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        // has no output mapping. only intended to be used in the input
386        // position, in conjunction with `mouse-movement-key mvmt`
387        "mvmt" | "mousemovement" | "🖰mv" => OsCode::KEY_766,
388
389        _ => return None,
390    })
391}
392
393/// This is a shameless copy of evdev_rs::enums::EV_KEY.
394/// I've added the Copy trait and I'll be able
395/// to added my own Impl(s) to it
396#[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, // 0x290 : KEY_MACRO1:
1057    KEY_657 = 657, // https://github.com/torvalds/linux/commit/b5625db9d23e58a573eb10a7f6d0c2ae060bc0e8
1058    KEY_658 = 658, // ...
1059    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, // 0x2a4: KEY_MACRO21
1077    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, // ...
1085    KEY_685 = 685, // 0x2ad: KEY_MACRO30
1086    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    // Mouse wheel events are not a part of EV_KEY, so they technically
1147    // shouldn't be there, but they're still there, because this way
1148    // it's easier to implement allowing to add them to defsrc without
1149    // making tons of changes all over the codebase.
1150    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, // aliased to mvmt as a dummy input for use with mouse-movement-key
1173
1174    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}