From 2bb12ef3f55d82dfe0322e18ce9296c84e699ae5 Mon Sep 17 00:00:00 2001 From: Himadri Bhattacharjee <107522312+lavafroth@users.noreply.github.com> Date: Sat, 10 Jan 2026 12:29:32 +0530 Subject: [PATCH] refactor: matching keystate into a method --- src/main.rs | 1194 +++++++++++++++++++++++++-------------------------- 1 file changed, 588 insertions(+), 606 deletions(-) diff --git a/src/main.rs b/src/main.rs index f76ef18..a5ee4ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,10 +28,12 @@ impl Debug for KeyState { } impl KeyState { - fn morph(&self, time: SystemTime) -> KeyState { - match self { + fn transition(&mut self, time: SystemTime) { + *self = match self { KeyState::Latched(last_press) => { - if time.duration_since(*last_press).unwrap() < Duration::from_millis(500) { + if let Ok(elapsed) = time.duration_since(*last_press) + && elapsed < Duration::from_millis(500) + { KeyState::Locked } else { KeyState::None @@ -41,51 +43,40 @@ impl KeyState { KeyState::None => KeyState::Latched(time), } } + + fn pressed_state(&self) -> i32 { + match self { + KeyState::Locked | KeyState::Latched(_) => 1, + KeyState::None => 0, + } + } } #[derive(Debug)] -pub struct InternalState { - map: BTreeMap, -} +pub struct InternalState(BTreeMap); impl InternalState { - fn morph( - &mut self, - key: KeyCode, - pressed: i32, - timestamp: SystemTime, - ) -> Option> { - if let Some(v) = self.map.get(&key) { - if pressed == 0 { - return None; + fn transition(&mut self, key: KeyCode, pressed: i32, timestamp: SystemTime) -> Vec { + if let Some(key_state) = self.0.get_mut(&key) { + if pressed == 1 { + key_state.transition(timestamp); } - let morphed = v.morph(timestamp); - self.map.insert(key, morphed); - return match morphed { - KeyState::None => Some(vec![*KeyEvent::new(key, 0)]), - KeyState::Latched(_) => Some(vec![*KeyEvent::new(key, 1)]), - _ => None, - }; + return vec![*KeyEvent::new(key, key_state.pressed_state())]; }; let mut events = vec![*KeyEvent::new(key, pressed)]; - let mut empty = Vec::new(); - for key in self.map.keys() { - if let Some(KeyState::Latched(_)) = self.map.get(key) { + for (key, key_state) in self.0.iter_mut() { + if let KeyState::Latched(_) = key_state { + *key_state = KeyState::None; events.push(*KeyEvent::new(*key, 0)); - empty.push(*key); } } - for key in empty { - self.map.insert(key, KeyState::None); - } - - Some(events) + events } fn led_state(&self) -> i32 { - if self.map.values().any(|v| !matches!(v, KeyState::None)) { + if self.0.values().any(|v| v.pressed_state() > 0) { i32::MAX } else { 0 @@ -96,37 +87,31 @@ impl InternalState { fn pick_device() -> Option { evdev::enumerate() .map(|(_, device)| device) - .filter(|d| d.name().is_some_and(|name| name.contains("keyboard"))) - .next() + .find(|d| d.name().is_some_and(|name| name.contains("keyboard"))) } #[tokio::main] async fn main() -> Result<(), Box> { - let (Some(mut d), Some(mut led_sink)) = (pick_device(), pick_device()) else { + let (Some(mut keyboard), Some(mut led_sink)) = (pick_device(), pick_device()) else { return Ok(()); }; - while !d.is_grabbed() { - // println!("trying to grab"); - let _ = d.grab(); - } + while keyboard.grab().is_err() {} - println!("{}", d.name().unwrap_or("some keyboard ig")); - let mut events = d.into_event_stream()?; - let keys: AttributeSet = get_all_keys().into_iter().collect(); + println!("Found {}", keyboard.name().unwrap_or("a keyboard")); + let mut events = keyboard.into_event_stream()?; + let keys: AttributeSet = get_all_keys().iter().collect(); - let mut device = VirtualDevice::builder()? + let mut lollipop_virtual_device = VirtualDevice::builder()? .name("lollipop") .with_keys(&keys)? .build()?; - for path in device.enumerate_dev_nodes_blocking()? { + for path in lollipop_virtual_device.enumerate_dev_nodes_blocking()? { let path = path?; println!("Available as {}", path.display()); } - let mut state = InternalState { - map: BTreeMap::default(), - }; + let mut state = InternalState(BTreeMap::default()); for key in [ KeyCode::KEY_LEFTSHIFT, @@ -134,573 +119,570 @@ async fn main() -> Result<(), Box> { KeyCode::KEY_LEFTCTRL, KeyCode::KEY_LEFTALT, ] { - state.map.insert(key, KeyState::None); + state.0.insert(key, KeyState::None); } loop { - match events.next_event().await?.destructure() { - evdev::EventSummary::Key(key_event, key_code, pressed) => { - if let Some(events) = state.morph(key_code, pressed, key_event.timestamp()) { - // println!("{state:#?}"); - device.emit(&events)?; - }; - - led_sink.send_events(&[*LedEvent::new(LedCode::LED_CAPSL, state.led_state())])?; - } - _ => {} + if let evdev::EventSummary::Key(key_event, key_code, pressed) = + events.next_event().await?.destructure() + { + let events = state.transition(key_code, pressed, key_event.timestamp()); + // println!("{state:#?}"); + lollipop_virtual_device.emit(&events)?; + led_sink.send_events(&[*LedEvent::new(LedCode::LED_CAPSL, state.led_state())])?; } } } pub fn get_all_keys() -> &'static [KeyCode] { &[ - evdev::KeyCode::KEY_RESERVED, - evdev::KeyCode::KEY_ESC, - evdev::KeyCode::KEY_1, - evdev::KeyCode::KEY_2, - evdev::KeyCode::KEY_3, - evdev::KeyCode::KEY_4, - evdev::KeyCode::KEY_5, - evdev::KeyCode::KEY_6, - evdev::KeyCode::KEY_7, - evdev::KeyCode::KEY_8, - evdev::KeyCode::KEY_9, - evdev::KeyCode::KEY_0, - evdev::KeyCode::KEY_MINUS, - evdev::KeyCode::KEY_EQUAL, - evdev::KeyCode::KEY_BACKSPACE, - evdev::KeyCode::KEY_TAB, - evdev::KeyCode::KEY_Q, - evdev::KeyCode::KEY_W, - evdev::KeyCode::KEY_E, - evdev::KeyCode::KEY_R, - evdev::KeyCode::KEY_T, - evdev::KeyCode::KEY_Y, - evdev::KeyCode::KEY_U, - evdev::KeyCode::KEY_I, - evdev::KeyCode::KEY_O, - evdev::KeyCode::KEY_P, - evdev::KeyCode::KEY_LEFTBRACE, - evdev::KeyCode::KEY_RIGHTBRACE, - evdev::KeyCode::KEY_ENTER, - evdev::KeyCode::KEY_LEFTCTRL, - evdev::KeyCode::KEY_A, - evdev::KeyCode::KEY_S, - evdev::KeyCode::KEY_D, - evdev::KeyCode::KEY_F, - evdev::KeyCode::KEY_G, - evdev::KeyCode::KEY_H, - evdev::KeyCode::KEY_J, - evdev::KeyCode::KEY_K, - evdev::KeyCode::KEY_L, - evdev::KeyCode::KEY_SEMICOLON, - evdev::KeyCode::KEY_APOSTROPHE, - evdev::KeyCode::KEY_GRAVE, - evdev::KeyCode::KEY_LEFTSHIFT, - evdev::KeyCode::KEY_BACKSLASH, - evdev::KeyCode::KEY_Z, - evdev::KeyCode::KEY_X, - evdev::KeyCode::KEY_C, - evdev::KeyCode::KEY_V, - evdev::KeyCode::KEY_B, - evdev::KeyCode::KEY_N, - evdev::KeyCode::KEY_M, - evdev::KeyCode::KEY_COMMA, - evdev::KeyCode::KEY_DOT, - evdev::KeyCode::KEY_SLASH, - evdev::KeyCode::KEY_RIGHTSHIFT, - evdev::KeyCode::KEY_KPASTERISK, - evdev::KeyCode::KEY_LEFTALT, - evdev::KeyCode::KEY_SPACE, - evdev::KeyCode::KEY_CAPSLOCK, - evdev::KeyCode::KEY_F1, - evdev::KeyCode::KEY_F2, - evdev::KeyCode::KEY_F3, - evdev::KeyCode::KEY_F4, - evdev::KeyCode::KEY_F5, - evdev::KeyCode::KEY_F6, - evdev::KeyCode::KEY_F7, - evdev::KeyCode::KEY_F8, - evdev::KeyCode::KEY_F9, - evdev::KeyCode::KEY_F10, - evdev::KeyCode::KEY_NUMLOCK, - evdev::KeyCode::KEY_SCROLLLOCK, - evdev::KeyCode::KEY_KP7, - evdev::KeyCode::KEY_KP8, - evdev::KeyCode::KEY_KP9, - evdev::KeyCode::KEY_KPMINUS, - evdev::KeyCode::KEY_KP4, - evdev::KeyCode::KEY_KP5, - evdev::KeyCode::KEY_KP6, - evdev::KeyCode::KEY_KPPLUS, - evdev::KeyCode::KEY_KP1, - evdev::KeyCode::KEY_KP2, - evdev::KeyCode::KEY_KP3, - evdev::KeyCode::KEY_KP0, - evdev::KeyCode::KEY_KPDOT, - evdev::KeyCode::KEY_ZENKAKUHANKAKU, - evdev::KeyCode::KEY_102ND, - evdev::KeyCode::KEY_F11, - evdev::KeyCode::KEY_F12, - evdev::KeyCode::KEY_RO, - evdev::KeyCode::KEY_KATAKANA, - evdev::KeyCode::KEY_HIRAGANA, - evdev::KeyCode::KEY_HENKAN, - evdev::KeyCode::KEY_KATAKANAHIRAGANA, - evdev::KeyCode::KEY_MUHENKAN, - evdev::KeyCode::KEY_KPJPCOMMA, - evdev::KeyCode::KEY_KPENTER, - evdev::KeyCode::KEY_RIGHTCTRL, - evdev::KeyCode::KEY_KPSLASH, - evdev::KeyCode::KEY_SYSRQ, - evdev::KeyCode::KEY_RIGHTALT, - evdev::KeyCode::KEY_LINEFEED, - evdev::KeyCode::KEY_HOME, - evdev::KeyCode::KEY_UP, - evdev::KeyCode::KEY_PAGEUP, - evdev::KeyCode::KEY_LEFT, - evdev::KeyCode::KEY_RIGHT, - evdev::KeyCode::KEY_END, - evdev::KeyCode::KEY_DOWN, - evdev::KeyCode::KEY_PAGEDOWN, - evdev::KeyCode::KEY_INSERT, - evdev::KeyCode::KEY_DELETE, - evdev::KeyCode::KEY_MACRO, - evdev::KeyCode::KEY_MUTE, - evdev::KeyCode::KEY_VOLUMEDOWN, - evdev::KeyCode::KEY_VOLUMEUP, - evdev::KeyCode::KEY_POWER, - evdev::KeyCode::KEY_KPEQUAL, - evdev::KeyCode::KEY_KPPLUSMINUS, - evdev::KeyCode::KEY_PAUSE, - evdev::KeyCode::KEY_SCALE, - evdev::KeyCode::KEY_KPCOMMA, - evdev::KeyCode::KEY_HANGEUL, - evdev::KeyCode::KEY_HANJA, - evdev::KeyCode::KEY_YEN, - evdev::KeyCode::KEY_LEFTMETA, - evdev::KeyCode::KEY_RIGHTMETA, - evdev::KeyCode::KEY_COMPOSE, - evdev::KeyCode::KEY_STOP, - evdev::KeyCode::KEY_AGAIN, - evdev::KeyCode::KEY_PROPS, - evdev::KeyCode::KEY_UNDO, - evdev::KeyCode::KEY_FRONT, - evdev::KeyCode::KEY_COPY, - evdev::KeyCode::KEY_OPEN, - evdev::KeyCode::KEY_PASTE, - evdev::KeyCode::KEY_FIND, - evdev::KeyCode::KEY_CUT, - evdev::KeyCode::KEY_HELP, - evdev::KeyCode::KEY_MENU, - evdev::KeyCode::KEY_CALC, - evdev::KeyCode::KEY_SETUP, - evdev::KeyCode::KEY_SLEEP, - evdev::KeyCode::KEY_WAKEUP, - evdev::KeyCode::KEY_FILE, - evdev::KeyCode::KEY_SENDFILE, - evdev::KeyCode::KEY_DELETEFILE, - evdev::KeyCode::KEY_XFER, - evdev::KeyCode::KEY_PROG1, - evdev::KeyCode::KEY_PROG2, - evdev::KeyCode::KEY_WWW, - evdev::KeyCode::KEY_MSDOS, - evdev::KeyCode::KEY_COFFEE, - evdev::KeyCode::KEY_DIRECTION, - evdev::KeyCode::KEY_ROTATE_DISPLAY, - evdev::KeyCode::KEY_CYCLEWINDOWS, - evdev::KeyCode::KEY_MAIL, - evdev::KeyCode::KEY_BOOKMARKS, - evdev::KeyCode::KEY_COMPUTER, - evdev::KeyCode::KEY_BACK, - evdev::KeyCode::KEY_FORWARD, - evdev::KeyCode::KEY_CLOSECD, - evdev::KeyCode::KEY_EJECTCD, - evdev::KeyCode::KEY_EJECTCLOSECD, - evdev::KeyCode::KEY_NEXTSONG, - evdev::KeyCode::KEY_PLAYPAUSE, - evdev::KeyCode::KEY_PREVIOUSSONG, - evdev::KeyCode::KEY_STOPCD, - evdev::KeyCode::KEY_RECORD, - evdev::KeyCode::KEY_REWIND, - evdev::KeyCode::KEY_PHONE, - evdev::KeyCode::KEY_ISO, - evdev::KeyCode::KEY_CONFIG, - evdev::KeyCode::KEY_HOMEPAGE, - evdev::KeyCode::KEY_REFRESH, - evdev::KeyCode::KEY_EXIT, - evdev::KeyCode::KEY_MOVE, - evdev::KeyCode::KEY_EDIT, - evdev::KeyCode::KEY_SCROLLUP, - evdev::KeyCode::KEY_SCROLLDOWN, - evdev::KeyCode::KEY_KPLEFTPAREN, - evdev::KeyCode::KEY_KPRIGHTPAREN, - evdev::KeyCode::KEY_NEW, - evdev::KeyCode::KEY_REDO, - evdev::KeyCode::KEY_F13, - evdev::KeyCode::KEY_F14, - evdev::KeyCode::KEY_F15, - evdev::KeyCode::KEY_F16, - evdev::KeyCode::KEY_F17, - evdev::KeyCode::KEY_F18, - evdev::KeyCode::KEY_F19, - evdev::KeyCode::KEY_F20, - evdev::KeyCode::KEY_F21, - evdev::KeyCode::KEY_F22, - evdev::KeyCode::KEY_F23, - evdev::KeyCode::KEY_F24, - evdev::KeyCode::KEY_PLAYCD, - evdev::KeyCode::KEY_PAUSECD, - evdev::KeyCode::KEY_PROG3, - evdev::KeyCode::KEY_PROG4, - evdev::KeyCode::KEY_DASHBOARD, - evdev::KeyCode::KEY_SUSPEND, - evdev::KeyCode::KEY_CLOSE, - evdev::KeyCode::KEY_PLAY, - evdev::KeyCode::KEY_FASTFORWARD, - evdev::KeyCode::KEY_BASSBOOST, - evdev::KeyCode::KEY_PRINT, - evdev::KeyCode::KEY_HP, - evdev::KeyCode::KEY_CAMERA, - evdev::KeyCode::KEY_SOUND, - evdev::KeyCode::KEY_QUESTION, - evdev::KeyCode::KEY_EMAIL, - evdev::KeyCode::KEY_CHAT, - evdev::KeyCode::KEY_SEARCH, - evdev::KeyCode::KEY_CONNECT, - evdev::KeyCode::KEY_FINANCE, - evdev::KeyCode::KEY_SPORT, - evdev::KeyCode::KEY_SHOP, - evdev::KeyCode::KEY_ALTERASE, - evdev::KeyCode::KEY_CANCEL, - evdev::KeyCode::KEY_BRIGHTNESSDOWN, - evdev::KeyCode::KEY_BRIGHTNESSUP, - evdev::KeyCode::KEY_MEDIA, - evdev::KeyCode::KEY_SWITCHVIDEOMODE, - evdev::KeyCode::KEY_KBDILLUMTOGGLE, - evdev::KeyCode::KEY_KBDILLUMDOWN, - evdev::KeyCode::KEY_KBDILLUMUP, - evdev::KeyCode::KEY_SEND, - evdev::KeyCode::KEY_REPLY, - evdev::KeyCode::KEY_FORWARDMAIL, - evdev::KeyCode::KEY_SAVE, - evdev::KeyCode::KEY_DOCUMENTS, - evdev::KeyCode::KEY_BATTERY, - evdev::KeyCode::KEY_BLUETOOTH, - evdev::KeyCode::KEY_WLAN, - evdev::KeyCode::KEY_UWB, - evdev::KeyCode::KEY_UNKNOWN, - evdev::KeyCode::KEY_VIDEO_NEXT, - evdev::KeyCode::KEY_VIDEO_PREV, - evdev::KeyCode::KEY_BRIGHTNESS_CYCLE, - evdev::KeyCode::KEY_BRIGHTNESS_AUTO, - evdev::KeyCode::KEY_DISPLAY_OFF, - evdev::KeyCode::KEY_WWAN, - evdev::KeyCode::KEY_RFKILL, - evdev::KeyCode::KEY_MICMUTE, - evdev::KeyCode::BTN_0, - evdev::KeyCode::BTN_1, - evdev::KeyCode::BTN_2, - evdev::KeyCode::BTN_3, - evdev::KeyCode::BTN_4, - evdev::KeyCode::BTN_5, - evdev::KeyCode::BTN_6, - evdev::KeyCode::BTN_7, - evdev::KeyCode::BTN_8, - evdev::KeyCode::BTN_9, - evdev::KeyCode::BTN_LEFT, - evdev::KeyCode::BTN_RIGHT, - evdev::KeyCode::BTN_MIDDLE, - evdev::KeyCode::BTN_SIDE, - evdev::KeyCode::BTN_EXTRA, - evdev::KeyCode::BTN_FORWARD, - evdev::KeyCode::BTN_BACK, - evdev::KeyCode::BTN_TASK, - evdev::KeyCode::BTN_TRIGGER, - evdev::KeyCode::BTN_THUMB, - evdev::KeyCode::BTN_THUMB2, - evdev::KeyCode::BTN_TOP, - evdev::KeyCode::BTN_TOP2, - evdev::KeyCode::BTN_PINKIE, - evdev::KeyCode::BTN_BASE, - evdev::KeyCode::BTN_BASE2, - evdev::KeyCode::BTN_BASE3, - evdev::KeyCode::BTN_BASE4, - evdev::KeyCode::BTN_BASE5, - evdev::KeyCode::BTN_BASE6, - evdev::KeyCode::BTN_DEAD, - evdev::KeyCode::BTN_SOUTH, - evdev::KeyCode::BTN_EAST, - evdev::KeyCode::BTN_C, - evdev::KeyCode::BTN_NORTH, - evdev::KeyCode::BTN_WEST, - evdev::KeyCode::BTN_Z, - evdev::KeyCode::BTN_TL, - evdev::KeyCode::BTN_TR, - evdev::KeyCode::BTN_TL2, - evdev::KeyCode::BTN_TR2, - evdev::KeyCode::BTN_SELECT, - evdev::KeyCode::BTN_START, - evdev::KeyCode::BTN_MODE, - evdev::KeyCode::BTN_THUMBL, - evdev::KeyCode::BTN_THUMBR, - evdev::KeyCode::BTN_TOOL_PEN, - evdev::KeyCode::BTN_TOOL_RUBBER, - evdev::KeyCode::BTN_TOOL_BRUSH, - evdev::KeyCode::BTN_TOOL_PENCIL, - evdev::KeyCode::BTN_TOOL_AIRBRUSH, - evdev::KeyCode::BTN_TOOL_FINGER, - evdev::KeyCode::BTN_TOOL_MOUSE, - evdev::KeyCode::BTN_TOOL_LENS, - evdev::KeyCode::BTN_TOOL_QUINTTAP, - evdev::KeyCode::BTN_TOUCH, - evdev::KeyCode::BTN_STYLUS, - evdev::KeyCode::BTN_STYLUS2, - evdev::KeyCode::BTN_TOOL_DOUBLETAP, - evdev::KeyCode::BTN_TOOL_TRIPLETAP, - evdev::KeyCode::BTN_TOOL_QUADTAP, - evdev::KeyCode::BTN_GEAR_DOWN, - evdev::KeyCode::BTN_GEAR_UP, - evdev::KeyCode::KEY_OK, - evdev::KeyCode::KEY_SELECT, - evdev::KeyCode::KEY_GOTO, - evdev::KeyCode::KEY_CLEAR, - evdev::KeyCode::KEY_POWER2, - evdev::KeyCode::KEY_OPTION, - evdev::KeyCode::KEY_INFO, - evdev::KeyCode::KEY_TIME, - evdev::KeyCode::KEY_VENDOR, - evdev::KeyCode::KEY_ARCHIVE, - evdev::KeyCode::KEY_PROGRAM, - evdev::KeyCode::KEY_CHANNEL, - evdev::KeyCode::KEY_FAVORITES, - evdev::KeyCode::KEY_EPG, - evdev::KeyCode::KEY_PVR, - evdev::KeyCode::KEY_MHP, - evdev::KeyCode::KEY_LANGUAGE, - evdev::KeyCode::KEY_TITLE, - evdev::KeyCode::KEY_SUBTITLE, - evdev::KeyCode::KEY_ANGLE, - evdev::KeyCode::KEY_ZOOM, - evdev::KeyCode::KEY_FULL_SCREEN, - evdev::KeyCode::KEY_MODE, - evdev::KeyCode::KEY_KEYBOARD, - evdev::KeyCode::KEY_SCREEN, - evdev::KeyCode::KEY_PC, - evdev::KeyCode::KEY_TV, - evdev::KeyCode::KEY_TV2, - evdev::KeyCode::KEY_VCR, - evdev::KeyCode::KEY_VCR2, - evdev::KeyCode::KEY_SAT, - evdev::KeyCode::KEY_SAT2, - evdev::KeyCode::KEY_CD, - evdev::KeyCode::KEY_TAPE, - evdev::KeyCode::KEY_RADIO, - evdev::KeyCode::KEY_TUNER, - evdev::KeyCode::KEY_PLAYER, - evdev::KeyCode::KEY_TEXT, - evdev::KeyCode::KEY_DVD, - evdev::KeyCode::KEY_AUX, - evdev::KeyCode::KEY_MP3, - evdev::KeyCode::KEY_AUDIO, - evdev::KeyCode::KEY_VIDEO, - evdev::KeyCode::KEY_DIRECTORY, - evdev::KeyCode::KEY_LIST, - evdev::KeyCode::KEY_MEMO, - evdev::KeyCode::KEY_CALENDAR, - evdev::KeyCode::KEY_RED, - evdev::KeyCode::KEY_GREEN, - evdev::KeyCode::KEY_YELLOW, - evdev::KeyCode::KEY_BLUE, - evdev::KeyCode::KEY_CHANNELUP, - evdev::KeyCode::KEY_CHANNELDOWN, - evdev::KeyCode::KEY_FIRST, - evdev::KeyCode::KEY_LAST, - evdev::KeyCode::KEY_AB, - evdev::KeyCode::KEY_NEXT, - evdev::KeyCode::KEY_RESTART, - evdev::KeyCode::KEY_SLOW, - evdev::KeyCode::KEY_SHUFFLE, - evdev::KeyCode::KEY_BREAK, - evdev::KeyCode::KEY_PREVIOUS, - evdev::KeyCode::KEY_DIGITS, - evdev::KeyCode::KEY_TEEN, - evdev::KeyCode::KEY_TWEN, - evdev::KeyCode::KEY_VIDEOPHONE, - evdev::KeyCode::KEY_GAMES, - evdev::KeyCode::KEY_ZOOMIN, - evdev::KeyCode::KEY_ZOOMOUT, - evdev::KeyCode::KEY_ZOOMRESET, - evdev::KeyCode::KEY_WORDPROCESSOR, - evdev::KeyCode::KEY_EDITOR, - evdev::KeyCode::KEY_SPREADSHEET, - evdev::KeyCode::KEY_GRAPHICSEDITOR, - evdev::KeyCode::KEY_PRESENTATION, - evdev::KeyCode::KEY_DATABASE, - evdev::KeyCode::KEY_NEWS, - evdev::KeyCode::KEY_VOICEMAIL, - evdev::KeyCode::KEY_ADDRESSBOOK, - evdev::KeyCode::KEY_MESSENGER, - evdev::KeyCode::KEY_DISPLAYTOGGLE, - evdev::KeyCode::KEY_SPELLCHECK, - evdev::KeyCode::KEY_LOGOFF, - evdev::KeyCode::KEY_DOLLAR, - evdev::KeyCode::KEY_EURO, - evdev::KeyCode::KEY_FRAMEBACK, - evdev::KeyCode::KEY_FRAMEFORWARD, - evdev::KeyCode::KEY_CONTEXT_MENU, - evdev::KeyCode::KEY_MEDIA_REPEAT, - evdev::KeyCode::KEY_10CHANNELSUP, - evdev::KeyCode::KEY_10CHANNELSDOWN, - evdev::KeyCode::KEY_IMAGES, - evdev::KeyCode::KEY_DEL_EOL, - evdev::KeyCode::KEY_DEL_EOS, - evdev::KeyCode::KEY_INS_LINE, - evdev::KeyCode::KEY_DEL_LINE, - evdev::KeyCode::KEY_FN, - evdev::KeyCode::KEY_FN_ESC, - evdev::KeyCode::KEY_FN_F1, - evdev::KeyCode::KEY_FN_F2, - evdev::KeyCode::KEY_FN_F3, - evdev::KeyCode::KEY_FN_F4, - evdev::KeyCode::KEY_FN_F5, - evdev::KeyCode::KEY_FN_F6, - evdev::KeyCode::KEY_FN_F7, - evdev::KeyCode::KEY_FN_F8, - evdev::KeyCode::KEY_FN_F9, - evdev::KeyCode::KEY_FN_F10, - evdev::KeyCode::KEY_FN_F11, - evdev::KeyCode::KEY_FN_F12, - evdev::KeyCode::KEY_FN_1, - evdev::KeyCode::KEY_FN_2, - evdev::KeyCode::KEY_FN_D, - evdev::KeyCode::KEY_FN_E, - evdev::KeyCode::KEY_FN_F, - evdev::KeyCode::KEY_FN_S, - evdev::KeyCode::KEY_FN_B, - evdev::KeyCode::KEY_BRL_DOT1, - evdev::KeyCode::KEY_BRL_DOT2, - evdev::KeyCode::KEY_BRL_DOT3, - evdev::KeyCode::KEY_BRL_DOT4, - evdev::KeyCode::KEY_BRL_DOT5, - evdev::KeyCode::KEY_BRL_DOT6, - evdev::KeyCode::KEY_BRL_DOT7, - evdev::KeyCode::KEY_BRL_DOT8, - evdev::KeyCode::KEY_BRL_DOT9, - evdev::KeyCode::KEY_BRL_DOT10, - evdev::KeyCode::KEY_NUMERIC_0, - evdev::KeyCode::KEY_NUMERIC_1, - evdev::KeyCode::KEY_NUMERIC_2, - evdev::KeyCode::KEY_NUMERIC_3, - evdev::KeyCode::KEY_NUMERIC_4, - evdev::KeyCode::KEY_NUMERIC_5, - evdev::KeyCode::KEY_NUMERIC_6, - evdev::KeyCode::KEY_NUMERIC_7, - evdev::KeyCode::KEY_NUMERIC_8, - evdev::KeyCode::KEY_NUMERIC_9, - evdev::KeyCode::KEY_NUMERIC_STAR, - evdev::KeyCode::KEY_NUMERIC_POUND, - evdev::KeyCode::KEY_NUMERIC_A, - evdev::KeyCode::KEY_NUMERIC_B, - evdev::KeyCode::KEY_NUMERIC_C, - evdev::KeyCode::KEY_NUMERIC_D, - evdev::KeyCode::KEY_CAMERA_FOCUS, - evdev::KeyCode::KEY_WPS_BUTTON, - evdev::KeyCode::KEY_TOUCHPAD_TOGGLE, - evdev::KeyCode::KEY_TOUCHPAD_ON, - evdev::KeyCode::KEY_TOUCHPAD_OFF, - evdev::KeyCode::KEY_CAMERA_ZOOMIN, - evdev::KeyCode::KEY_CAMERA_ZOOMOUT, - evdev::KeyCode::KEY_CAMERA_UP, - evdev::KeyCode::KEY_CAMERA_DOWN, - evdev::KeyCode::KEY_CAMERA_LEFT, - evdev::KeyCode::KEY_CAMERA_RIGHT, - evdev::KeyCode::KEY_ATTENDANT_ON, - evdev::KeyCode::KEY_ATTENDANT_OFF, - evdev::KeyCode::KEY_ATTENDANT_TOGGLE, - evdev::KeyCode::KEY_LIGHTS_TOGGLE, - evdev::KeyCode::BTN_DPAD_UP, - evdev::KeyCode::BTN_DPAD_DOWN, - evdev::KeyCode::BTN_DPAD_LEFT, - evdev::KeyCode::BTN_DPAD_RIGHT, - evdev::KeyCode::KEY_ALS_TOGGLE, - evdev::KeyCode::KEY_BUTTONCONFIG, - evdev::KeyCode::KEY_TASKMANAGER, - evdev::KeyCode::KEY_JOURNAL, - evdev::KeyCode::KEY_CONTROLPANEL, - evdev::KeyCode::KEY_APPSELECT, - evdev::KeyCode::KEY_SCREENSAVER, - evdev::KeyCode::KEY_VOICECOMMAND, - evdev::KeyCode::KEY_ASSISTANT, - evdev::KeyCode::KEY_KBD_LAYOUT_NEXT, - evdev::KeyCode::KEY_BRIGHTNESS_MIN, - evdev::KeyCode::KEY_BRIGHTNESS_MAX, - evdev::KeyCode::KEY_KBDINPUTASSIST_PREV, - evdev::KeyCode::KEY_KBDINPUTASSIST_NEXT, - evdev::KeyCode::KEY_KBDINPUTASSIST_PREVGROUP, - evdev::KeyCode::KEY_KBDINPUTASSIST_NEXTGROUP, - evdev::KeyCode::KEY_KBDINPUTASSIST_ACCEPT, - evdev::KeyCode::KEY_KBDINPUTASSIST_CANCEL, - evdev::KeyCode::KEY_RIGHT_UP, - evdev::KeyCode::KEY_RIGHT_DOWN, - evdev::KeyCode::KEY_LEFT_UP, - evdev::KeyCode::KEY_LEFT_DOWN, - evdev::KeyCode::KEY_ROOT_MENU, - evdev::KeyCode::KEY_MEDIA_TOP_MENU, - evdev::KeyCode::KEY_NUMERIC_11, - evdev::KeyCode::KEY_NUMERIC_12, - evdev::KeyCode::KEY_AUDIO_DESC, - evdev::KeyCode::KEY_3D_MODE, - evdev::KeyCode::KEY_NEXT_FAVORITE, - evdev::KeyCode::KEY_STOP_RECORD, - evdev::KeyCode::KEY_PAUSE_RECORD, - evdev::KeyCode::KEY_VOD, - evdev::KeyCode::KEY_UNMUTE, - evdev::KeyCode::KEY_FASTREVERSE, - evdev::KeyCode::KEY_SLOWREVERSE, - evdev::KeyCode::KEY_DATA, - evdev::KeyCode::KEY_ONSCREEN_KEYBOARD, - evdev::KeyCode::KEY_PRIVACY_SCREEN_TOGGLE, - evdev::KeyCode::KEY_SELECTIVE_SCREENSHOT, - evdev::KeyCode::BTN_TRIGGER_HAPPY1, - evdev::KeyCode::BTN_TRIGGER_HAPPY2, - evdev::KeyCode::BTN_TRIGGER_HAPPY3, - evdev::KeyCode::BTN_TRIGGER_HAPPY4, - evdev::KeyCode::BTN_TRIGGER_HAPPY5, - evdev::KeyCode::BTN_TRIGGER_HAPPY6, - evdev::KeyCode::BTN_TRIGGER_HAPPY7, - evdev::KeyCode::BTN_TRIGGER_HAPPY8, - evdev::KeyCode::BTN_TRIGGER_HAPPY9, - evdev::KeyCode::BTN_TRIGGER_HAPPY10, - evdev::KeyCode::BTN_TRIGGER_HAPPY11, - evdev::KeyCode::BTN_TRIGGER_HAPPY12, - evdev::KeyCode::BTN_TRIGGER_HAPPY13, - evdev::KeyCode::BTN_TRIGGER_HAPPY14, - evdev::KeyCode::BTN_TRIGGER_HAPPY15, - evdev::KeyCode::BTN_TRIGGER_HAPPY16, - evdev::KeyCode::BTN_TRIGGER_HAPPY17, - evdev::KeyCode::BTN_TRIGGER_HAPPY18, - evdev::KeyCode::BTN_TRIGGER_HAPPY19, - evdev::KeyCode::BTN_TRIGGER_HAPPY20, - evdev::KeyCode::BTN_TRIGGER_HAPPY21, - evdev::KeyCode::BTN_TRIGGER_HAPPY22, - evdev::KeyCode::BTN_TRIGGER_HAPPY23, - evdev::KeyCode::BTN_TRIGGER_HAPPY24, - evdev::KeyCode::BTN_TRIGGER_HAPPY25, - evdev::KeyCode::BTN_TRIGGER_HAPPY26, - evdev::KeyCode::BTN_TRIGGER_HAPPY27, - evdev::KeyCode::BTN_TRIGGER_HAPPY28, - evdev::KeyCode::BTN_TRIGGER_HAPPY29, - evdev::KeyCode::BTN_TRIGGER_HAPPY30, - evdev::KeyCode::BTN_TRIGGER_HAPPY31, - evdev::KeyCode::BTN_TRIGGER_HAPPY32, - evdev::KeyCode::BTN_TRIGGER_HAPPY33, - evdev::KeyCode::BTN_TRIGGER_HAPPY34, - evdev::KeyCode::BTN_TRIGGER_HAPPY35, - evdev::KeyCode::BTN_TRIGGER_HAPPY36, - evdev::KeyCode::BTN_TRIGGER_HAPPY37, - evdev::KeyCode::BTN_TRIGGER_HAPPY38, - evdev::KeyCode::BTN_TRIGGER_HAPPY39, - evdev::KeyCode::BTN_TRIGGER_HAPPY40, + KeyCode::KEY_RESERVED, + KeyCode::KEY_ESC, + KeyCode::KEY_1, + KeyCode::KEY_2, + KeyCode::KEY_3, + KeyCode::KEY_4, + KeyCode::KEY_5, + KeyCode::KEY_6, + KeyCode::KEY_7, + KeyCode::KEY_8, + KeyCode::KEY_9, + KeyCode::KEY_0, + KeyCode::KEY_MINUS, + KeyCode::KEY_EQUAL, + KeyCode::KEY_BACKSPACE, + KeyCode::KEY_TAB, + KeyCode::KEY_Q, + KeyCode::KEY_W, + KeyCode::KEY_E, + KeyCode::KEY_R, + KeyCode::KEY_T, + KeyCode::KEY_Y, + KeyCode::KEY_U, + KeyCode::KEY_I, + KeyCode::KEY_O, + KeyCode::KEY_P, + KeyCode::KEY_LEFTBRACE, + KeyCode::KEY_RIGHTBRACE, + KeyCode::KEY_ENTER, + KeyCode::KEY_LEFTCTRL, + KeyCode::KEY_A, + KeyCode::KEY_S, + KeyCode::KEY_D, + KeyCode::KEY_F, + KeyCode::KEY_G, + KeyCode::KEY_H, + KeyCode::KEY_J, + KeyCode::KEY_K, + KeyCode::KEY_L, + KeyCode::KEY_SEMICOLON, + KeyCode::KEY_APOSTROPHE, + KeyCode::KEY_GRAVE, + KeyCode::KEY_LEFTSHIFT, + KeyCode::KEY_BACKSLASH, + KeyCode::KEY_Z, + KeyCode::KEY_X, + KeyCode::KEY_C, + KeyCode::KEY_V, + KeyCode::KEY_B, + KeyCode::KEY_N, + KeyCode::KEY_M, + KeyCode::KEY_COMMA, + KeyCode::KEY_DOT, + KeyCode::KEY_SLASH, + KeyCode::KEY_RIGHTSHIFT, + KeyCode::KEY_KPASTERISK, + KeyCode::KEY_LEFTALT, + KeyCode::KEY_SPACE, + KeyCode::KEY_CAPSLOCK, + KeyCode::KEY_F1, + KeyCode::KEY_F2, + KeyCode::KEY_F3, + KeyCode::KEY_F4, + KeyCode::KEY_F5, + KeyCode::KEY_F6, + KeyCode::KEY_F7, + KeyCode::KEY_F8, + KeyCode::KEY_F9, + KeyCode::KEY_F10, + KeyCode::KEY_NUMLOCK, + KeyCode::KEY_SCROLLLOCK, + KeyCode::KEY_KP7, + KeyCode::KEY_KP8, + KeyCode::KEY_KP9, + KeyCode::KEY_KPMINUS, + KeyCode::KEY_KP4, + KeyCode::KEY_KP5, + KeyCode::KEY_KP6, + KeyCode::KEY_KPPLUS, + KeyCode::KEY_KP1, + KeyCode::KEY_KP2, + KeyCode::KEY_KP3, + KeyCode::KEY_KP0, + KeyCode::KEY_KPDOT, + KeyCode::KEY_ZENKAKUHANKAKU, + KeyCode::KEY_102ND, + KeyCode::KEY_F11, + KeyCode::KEY_F12, + KeyCode::KEY_RO, + KeyCode::KEY_KATAKANA, + KeyCode::KEY_HIRAGANA, + KeyCode::KEY_HENKAN, + KeyCode::KEY_KATAKANAHIRAGANA, + KeyCode::KEY_MUHENKAN, + KeyCode::KEY_KPJPCOMMA, + KeyCode::KEY_KPENTER, + KeyCode::KEY_RIGHTCTRL, + KeyCode::KEY_KPSLASH, + KeyCode::KEY_SYSRQ, + KeyCode::KEY_RIGHTALT, + KeyCode::KEY_LINEFEED, + KeyCode::KEY_HOME, + KeyCode::KEY_UP, + KeyCode::KEY_PAGEUP, + KeyCode::KEY_LEFT, + KeyCode::KEY_RIGHT, + KeyCode::KEY_END, + KeyCode::KEY_DOWN, + KeyCode::KEY_PAGEDOWN, + KeyCode::KEY_INSERT, + KeyCode::KEY_DELETE, + KeyCode::KEY_MACRO, + KeyCode::KEY_MUTE, + KeyCode::KEY_VOLUMEDOWN, + KeyCode::KEY_VOLUMEUP, + KeyCode::KEY_POWER, + KeyCode::KEY_KPEQUAL, + KeyCode::KEY_KPPLUSMINUS, + KeyCode::KEY_PAUSE, + KeyCode::KEY_SCALE, + KeyCode::KEY_KPCOMMA, + KeyCode::KEY_HANGEUL, + KeyCode::KEY_HANJA, + KeyCode::KEY_YEN, + KeyCode::KEY_LEFTMETA, + KeyCode::KEY_RIGHTMETA, + KeyCode::KEY_COMPOSE, + KeyCode::KEY_STOP, + KeyCode::KEY_AGAIN, + KeyCode::KEY_PROPS, + KeyCode::KEY_UNDO, + KeyCode::KEY_FRONT, + KeyCode::KEY_COPY, + KeyCode::KEY_OPEN, + KeyCode::KEY_PASTE, + KeyCode::KEY_FIND, + KeyCode::KEY_CUT, + KeyCode::KEY_HELP, + KeyCode::KEY_MENU, + KeyCode::KEY_CALC, + KeyCode::KEY_SETUP, + KeyCode::KEY_SLEEP, + KeyCode::KEY_WAKEUP, + KeyCode::KEY_FILE, + KeyCode::KEY_SENDFILE, + KeyCode::KEY_DELETEFILE, + KeyCode::KEY_XFER, + KeyCode::KEY_PROG1, + KeyCode::KEY_PROG2, + KeyCode::KEY_WWW, + KeyCode::KEY_MSDOS, + KeyCode::KEY_COFFEE, + KeyCode::KEY_DIRECTION, + KeyCode::KEY_ROTATE_DISPLAY, + KeyCode::KEY_CYCLEWINDOWS, + KeyCode::KEY_MAIL, + KeyCode::KEY_BOOKMARKS, + KeyCode::KEY_COMPUTER, + KeyCode::KEY_BACK, + KeyCode::KEY_FORWARD, + KeyCode::KEY_CLOSECD, + KeyCode::KEY_EJECTCD, + KeyCode::KEY_EJECTCLOSECD, + KeyCode::KEY_NEXTSONG, + KeyCode::KEY_PLAYPAUSE, + KeyCode::KEY_PREVIOUSSONG, + KeyCode::KEY_STOPCD, + KeyCode::KEY_RECORD, + KeyCode::KEY_REWIND, + KeyCode::KEY_PHONE, + KeyCode::KEY_ISO, + KeyCode::KEY_CONFIG, + KeyCode::KEY_HOMEPAGE, + KeyCode::KEY_REFRESH, + KeyCode::KEY_EXIT, + KeyCode::KEY_MOVE, + KeyCode::KEY_EDIT, + KeyCode::KEY_SCROLLUP, + KeyCode::KEY_SCROLLDOWN, + KeyCode::KEY_KPLEFTPAREN, + KeyCode::KEY_KPRIGHTPAREN, + KeyCode::KEY_NEW, + KeyCode::KEY_REDO, + KeyCode::KEY_F13, + KeyCode::KEY_F14, + KeyCode::KEY_F15, + KeyCode::KEY_F16, + KeyCode::KEY_F17, + KeyCode::KEY_F18, + KeyCode::KEY_F19, + KeyCode::KEY_F20, + KeyCode::KEY_F21, + KeyCode::KEY_F22, + KeyCode::KEY_F23, + KeyCode::KEY_F24, + KeyCode::KEY_PLAYCD, + KeyCode::KEY_PAUSECD, + KeyCode::KEY_PROG3, + KeyCode::KEY_PROG4, + KeyCode::KEY_DASHBOARD, + KeyCode::KEY_SUSPEND, + KeyCode::KEY_CLOSE, + KeyCode::KEY_PLAY, + KeyCode::KEY_FASTFORWARD, + KeyCode::KEY_BASSBOOST, + KeyCode::KEY_PRINT, + KeyCode::KEY_HP, + KeyCode::KEY_CAMERA, + KeyCode::KEY_SOUND, + KeyCode::KEY_QUESTION, + KeyCode::KEY_EMAIL, + KeyCode::KEY_CHAT, + KeyCode::KEY_SEARCH, + KeyCode::KEY_CONNECT, + KeyCode::KEY_FINANCE, + KeyCode::KEY_SPORT, + KeyCode::KEY_SHOP, + KeyCode::KEY_ALTERASE, + KeyCode::KEY_CANCEL, + KeyCode::KEY_BRIGHTNESSDOWN, + KeyCode::KEY_BRIGHTNESSUP, + KeyCode::KEY_MEDIA, + KeyCode::KEY_SWITCHVIDEOMODE, + KeyCode::KEY_KBDILLUMTOGGLE, + KeyCode::KEY_KBDILLUMDOWN, + KeyCode::KEY_KBDILLUMUP, + KeyCode::KEY_SEND, + KeyCode::KEY_REPLY, + KeyCode::KEY_FORWARDMAIL, + KeyCode::KEY_SAVE, + KeyCode::KEY_DOCUMENTS, + KeyCode::KEY_BATTERY, + KeyCode::KEY_BLUETOOTH, + KeyCode::KEY_WLAN, + KeyCode::KEY_UWB, + KeyCode::KEY_UNKNOWN, + KeyCode::KEY_VIDEO_NEXT, + KeyCode::KEY_VIDEO_PREV, + KeyCode::KEY_BRIGHTNESS_CYCLE, + KeyCode::KEY_BRIGHTNESS_AUTO, + KeyCode::KEY_DISPLAY_OFF, + KeyCode::KEY_WWAN, + KeyCode::KEY_RFKILL, + KeyCode::KEY_MICMUTE, + KeyCode::BTN_0, + KeyCode::BTN_1, + KeyCode::BTN_2, + KeyCode::BTN_3, + KeyCode::BTN_4, + KeyCode::BTN_5, + KeyCode::BTN_6, + KeyCode::BTN_7, + KeyCode::BTN_8, + KeyCode::BTN_9, + KeyCode::BTN_LEFT, + KeyCode::BTN_RIGHT, + KeyCode::BTN_MIDDLE, + KeyCode::BTN_SIDE, + KeyCode::BTN_EXTRA, + KeyCode::BTN_FORWARD, + KeyCode::BTN_BACK, + KeyCode::BTN_TASK, + KeyCode::BTN_TRIGGER, + KeyCode::BTN_THUMB, + KeyCode::BTN_THUMB2, + KeyCode::BTN_TOP, + KeyCode::BTN_TOP2, + KeyCode::BTN_PINKIE, + KeyCode::BTN_BASE, + KeyCode::BTN_BASE2, + KeyCode::BTN_BASE3, + KeyCode::BTN_BASE4, + KeyCode::BTN_BASE5, + KeyCode::BTN_BASE6, + KeyCode::BTN_DEAD, + KeyCode::BTN_SOUTH, + KeyCode::BTN_EAST, + KeyCode::BTN_C, + KeyCode::BTN_NORTH, + KeyCode::BTN_WEST, + KeyCode::BTN_Z, + KeyCode::BTN_TL, + KeyCode::BTN_TR, + KeyCode::BTN_TL2, + KeyCode::BTN_TR2, + KeyCode::BTN_SELECT, + KeyCode::BTN_START, + KeyCode::BTN_MODE, + KeyCode::BTN_THUMBL, + KeyCode::BTN_THUMBR, + KeyCode::BTN_TOOL_PEN, + KeyCode::BTN_TOOL_RUBBER, + KeyCode::BTN_TOOL_BRUSH, + KeyCode::BTN_TOOL_PENCIL, + KeyCode::BTN_TOOL_AIRBRUSH, + KeyCode::BTN_TOOL_FINGER, + KeyCode::BTN_TOOL_MOUSE, + KeyCode::BTN_TOOL_LENS, + KeyCode::BTN_TOOL_QUINTTAP, + KeyCode::BTN_TOUCH, + KeyCode::BTN_STYLUS, + KeyCode::BTN_STYLUS2, + KeyCode::BTN_TOOL_DOUBLETAP, + KeyCode::BTN_TOOL_TRIPLETAP, + KeyCode::BTN_TOOL_QUADTAP, + KeyCode::BTN_GEAR_DOWN, + KeyCode::BTN_GEAR_UP, + KeyCode::KEY_OK, + KeyCode::KEY_SELECT, + KeyCode::KEY_GOTO, + KeyCode::KEY_CLEAR, + KeyCode::KEY_POWER2, + KeyCode::KEY_OPTION, + KeyCode::KEY_INFO, + KeyCode::KEY_TIME, + KeyCode::KEY_VENDOR, + KeyCode::KEY_ARCHIVE, + KeyCode::KEY_PROGRAM, + KeyCode::KEY_CHANNEL, + KeyCode::KEY_FAVORITES, + KeyCode::KEY_EPG, + KeyCode::KEY_PVR, + KeyCode::KEY_MHP, + KeyCode::KEY_LANGUAGE, + KeyCode::KEY_TITLE, + KeyCode::KEY_SUBTITLE, + KeyCode::KEY_ANGLE, + KeyCode::KEY_ZOOM, + KeyCode::KEY_FULL_SCREEN, + KeyCode::KEY_MODE, + KeyCode::KEY_KEYBOARD, + KeyCode::KEY_SCREEN, + KeyCode::KEY_PC, + KeyCode::KEY_TV, + KeyCode::KEY_TV2, + KeyCode::KEY_VCR, + KeyCode::KEY_VCR2, + KeyCode::KEY_SAT, + KeyCode::KEY_SAT2, + KeyCode::KEY_CD, + KeyCode::KEY_TAPE, + KeyCode::KEY_RADIO, + KeyCode::KEY_TUNER, + KeyCode::KEY_PLAYER, + KeyCode::KEY_TEXT, + KeyCode::KEY_DVD, + KeyCode::KEY_AUX, + KeyCode::KEY_MP3, + KeyCode::KEY_AUDIO, + KeyCode::KEY_VIDEO, + KeyCode::KEY_DIRECTORY, + KeyCode::KEY_LIST, + KeyCode::KEY_MEMO, + KeyCode::KEY_CALENDAR, + KeyCode::KEY_RED, + KeyCode::KEY_GREEN, + KeyCode::KEY_YELLOW, + KeyCode::KEY_BLUE, + KeyCode::KEY_CHANNELUP, + KeyCode::KEY_CHANNELDOWN, + KeyCode::KEY_FIRST, + KeyCode::KEY_LAST, + KeyCode::KEY_AB, + KeyCode::KEY_NEXT, + KeyCode::KEY_RESTART, + KeyCode::KEY_SLOW, + KeyCode::KEY_SHUFFLE, + KeyCode::KEY_BREAK, + KeyCode::KEY_PREVIOUS, + KeyCode::KEY_DIGITS, + KeyCode::KEY_TEEN, + KeyCode::KEY_TWEN, + KeyCode::KEY_VIDEOPHONE, + KeyCode::KEY_GAMES, + KeyCode::KEY_ZOOMIN, + KeyCode::KEY_ZOOMOUT, + KeyCode::KEY_ZOOMRESET, + KeyCode::KEY_WORDPROCESSOR, + KeyCode::KEY_EDITOR, + KeyCode::KEY_SPREADSHEET, + KeyCode::KEY_GRAPHICSEDITOR, + KeyCode::KEY_PRESENTATION, + KeyCode::KEY_DATABASE, + KeyCode::KEY_NEWS, + KeyCode::KEY_VOICEMAIL, + KeyCode::KEY_ADDRESSBOOK, + KeyCode::KEY_MESSENGER, + KeyCode::KEY_DISPLAYTOGGLE, + KeyCode::KEY_SPELLCHECK, + KeyCode::KEY_LOGOFF, + KeyCode::KEY_DOLLAR, + KeyCode::KEY_EURO, + KeyCode::KEY_FRAMEBACK, + KeyCode::KEY_FRAMEFORWARD, + KeyCode::KEY_CONTEXT_MENU, + KeyCode::KEY_MEDIA_REPEAT, + KeyCode::KEY_10CHANNELSUP, + KeyCode::KEY_10CHANNELSDOWN, + KeyCode::KEY_IMAGES, + KeyCode::KEY_DEL_EOL, + KeyCode::KEY_DEL_EOS, + KeyCode::KEY_INS_LINE, + KeyCode::KEY_DEL_LINE, + KeyCode::KEY_FN, + KeyCode::KEY_FN_ESC, + KeyCode::KEY_FN_F1, + KeyCode::KEY_FN_F2, + KeyCode::KEY_FN_F3, + KeyCode::KEY_FN_F4, + KeyCode::KEY_FN_F5, + KeyCode::KEY_FN_F6, + KeyCode::KEY_FN_F7, + KeyCode::KEY_FN_F8, + KeyCode::KEY_FN_F9, + KeyCode::KEY_FN_F10, + KeyCode::KEY_FN_F11, + KeyCode::KEY_FN_F12, + KeyCode::KEY_FN_1, + KeyCode::KEY_FN_2, + KeyCode::KEY_FN_D, + KeyCode::KEY_FN_E, + KeyCode::KEY_FN_F, + KeyCode::KEY_FN_S, + KeyCode::KEY_FN_B, + KeyCode::KEY_BRL_DOT1, + KeyCode::KEY_BRL_DOT2, + KeyCode::KEY_BRL_DOT3, + KeyCode::KEY_BRL_DOT4, + KeyCode::KEY_BRL_DOT5, + KeyCode::KEY_BRL_DOT6, + KeyCode::KEY_BRL_DOT7, + KeyCode::KEY_BRL_DOT8, + KeyCode::KEY_BRL_DOT9, + KeyCode::KEY_BRL_DOT10, + KeyCode::KEY_NUMERIC_0, + KeyCode::KEY_NUMERIC_1, + KeyCode::KEY_NUMERIC_2, + KeyCode::KEY_NUMERIC_3, + KeyCode::KEY_NUMERIC_4, + KeyCode::KEY_NUMERIC_5, + KeyCode::KEY_NUMERIC_6, + KeyCode::KEY_NUMERIC_7, + KeyCode::KEY_NUMERIC_8, + KeyCode::KEY_NUMERIC_9, + KeyCode::KEY_NUMERIC_STAR, + KeyCode::KEY_NUMERIC_POUND, + KeyCode::KEY_NUMERIC_A, + KeyCode::KEY_NUMERIC_B, + KeyCode::KEY_NUMERIC_C, + KeyCode::KEY_NUMERIC_D, + KeyCode::KEY_CAMERA_FOCUS, + KeyCode::KEY_WPS_BUTTON, + KeyCode::KEY_TOUCHPAD_TOGGLE, + KeyCode::KEY_TOUCHPAD_ON, + KeyCode::KEY_TOUCHPAD_OFF, + KeyCode::KEY_CAMERA_ZOOMIN, + KeyCode::KEY_CAMERA_ZOOMOUT, + KeyCode::KEY_CAMERA_UP, + KeyCode::KEY_CAMERA_DOWN, + KeyCode::KEY_CAMERA_LEFT, + KeyCode::KEY_CAMERA_RIGHT, + KeyCode::KEY_ATTENDANT_ON, + KeyCode::KEY_ATTENDANT_OFF, + KeyCode::KEY_ATTENDANT_TOGGLE, + KeyCode::KEY_LIGHTS_TOGGLE, + KeyCode::BTN_DPAD_UP, + KeyCode::BTN_DPAD_DOWN, + KeyCode::BTN_DPAD_LEFT, + KeyCode::BTN_DPAD_RIGHT, + KeyCode::KEY_ALS_TOGGLE, + KeyCode::KEY_BUTTONCONFIG, + KeyCode::KEY_TASKMANAGER, + KeyCode::KEY_JOURNAL, + KeyCode::KEY_CONTROLPANEL, + KeyCode::KEY_APPSELECT, + KeyCode::KEY_SCREENSAVER, + KeyCode::KEY_VOICECOMMAND, + KeyCode::KEY_ASSISTANT, + KeyCode::KEY_KBD_LAYOUT_NEXT, + KeyCode::KEY_BRIGHTNESS_MIN, + KeyCode::KEY_BRIGHTNESS_MAX, + KeyCode::KEY_KBDINPUTASSIST_PREV, + KeyCode::KEY_KBDINPUTASSIST_NEXT, + KeyCode::KEY_KBDINPUTASSIST_PREVGROUP, + KeyCode::KEY_KBDINPUTASSIST_NEXTGROUP, + KeyCode::KEY_KBDINPUTASSIST_ACCEPT, + KeyCode::KEY_KBDINPUTASSIST_CANCEL, + KeyCode::KEY_RIGHT_UP, + KeyCode::KEY_RIGHT_DOWN, + KeyCode::KEY_LEFT_UP, + KeyCode::KEY_LEFT_DOWN, + KeyCode::KEY_ROOT_MENU, + KeyCode::KEY_MEDIA_TOP_MENU, + KeyCode::KEY_NUMERIC_11, + KeyCode::KEY_NUMERIC_12, + KeyCode::KEY_AUDIO_DESC, + KeyCode::KEY_3D_MODE, + KeyCode::KEY_NEXT_FAVORITE, + KeyCode::KEY_STOP_RECORD, + KeyCode::KEY_PAUSE_RECORD, + KeyCode::KEY_VOD, + KeyCode::KEY_UNMUTE, + KeyCode::KEY_FASTREVERSE, + KeyCode::KEY_SLOWREVERSE, + KeyCode::KEY_DATA, + KeyCode::KEY_ONSCREEN_KEYBOARD, + KeyCode::KEY_PRIVACY_SCREEN_TOGGLE, + KeyCode::KEY_SELECTIVE_SCREENSHOT, + KeyCode::BTN_TRIGGER_HAPPY1, + KeyCode::BTN_TRIGGER_HAPPY2, + KeyCode::BTN_TRIGGER_HAPPY3, + KeyCode::BTN_TRIGGER_HAPPY4, + KeyCode::BTN_TRIGGER_HAPPY5, + KeyCode::BTN_TRIGGER_HAPPY6, + KeyCode::BTN_TRIGGER_HAPPY7, + KeyCode::BTN_TRIGGER_HAPPY8, + KeyCode::BTN_TRIGGER_HAPPY9, + KeyCode::BTN_TRIGGER_HAPPY10, + KeyCode::BTN_TRIGGER_HAPPY11, + KeyCode::BTN_TRIGGER_HAPPY12, + KeyCode::BTN_TRIGGER_HAPPY13, + KeyCode::BTN_TRIGGER_HAPPY14, + KeyCode::BTN_TRIGGER_HAPPY15, + KeyCode::BTN_TRIGGER_HAPPY16, + KeyCode::BTN_TRIGGER_HAPPY17, + KeyCode::BTN_TRIGGER_HAPPY18, + KeyCode::BTN_TRIGGER_HAPPY19, + KeyCode::BTN_TRIGGER_HAPPY20, + KeyCode::BTN_TRIGGER_HAPPY21, + KeyCode::BTN_TRIGGER_HAPPY22, + KeyCode::BTN_TRIGGER_HAPPY23, + KeyCode::BTN_TRIGGER_HAPPY24, + KeyCode::BTN_TRIGGER_HAPPY25, + KeyCode::BTN_TRIGGER_HAPPY26, + KeyCode::BTN_TRIGGER_HAPPY27, + KeyCode::BTN_TRIGGER_HAPPY28, + KeyCode::BTN_TRIGGER_HAPPY29, + KeyCode::BTN_TRIGGER_HAPPY30, + KeyCode::BTN_TRIGGER_HAPPY31, + KeyCode::BTN_TRIGGER_HAPPY32, + KeyCode::BTN_TRIGGER_HAPPY33, + KeyCode::BTN_TRIGGER_HAPPY34, + KeyCode::BTN_TRIGGER_HAPPY35, + KeyCode::BTN_TRIGGER_HAPPY36, + KeyCode::BTN_TRIGGER_HAPPY37, + KeyCode::BTN_TRIGGER_HAPPY38, + KeyCode::BTN_TRIGGER_HAPPY39, + KeyCode::BTN_TRIGGER_HAPPY40, ] }