Skip to content

Commit

Permalink
feat: map strings to keys and modifiers in single pass
Browse files Browse the repository at this point in the history
feat: parse modifiers in single pass

refactor: use simple match for faster conversion of strings to keys
  • Loading branch information
lavafroth committed Jul 4, 2024
1 parent f8d0b7b commit b3d73d0
Show file tree
Hide file tree
Showing 7 changed files with 362 additions and 53 deletions.
95 changes: 94 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ edition = "2021"
[dependencies]
anyhow = "1.0.80"
bitflags = "2.5.0"
evdev = "0.12.2"
itertools = "0.12.1"
pest = "2.7.7"
pest_derive = "2.7.7"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Here's what has been worked on so far.
- [x] Warn user if input config is not a regular file
- [x] Set a maximum file size cap for configs
- [ ] Lock files and map them into memory
- [ ] Map keys and modifiers to internal representation (evdev enum variants) in a single pass
- [x] Map keys and modifiers to internal representation (evdev enum variants) in a single pass


Want to learn how the code works? Check out [my blog](https://lavafroth.is-a.dev/tags/google-summer-of-code/) where I cover each topic as I implement them.
Expand Down
155 changes: 155 additions & 0 deletions src/evdev_mappings.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
use crate::ParseError;

pub fn convert(s: &str) -> Result<evdev::Key, ParseError> {
let val = match s {
"q" => evdev::Key::KEY_Q,
"w" => evdev::Key::KEY_W,
"e" => evdev::Key::KEY_E,
"r" => evdev::Key::KEY_R,
"t" => evdev::Key::KEY_T,
"y" => evdev::Key::KEY_Y,
"u" => evdev::Key::KEY_U,
"i" => evdev::Key::KEY_I,
"o" => evdev::Key::KEY_O,
"p" => evdev::Key::KEY_P,
"a" => evdev::Key::KEY_A,
"s" => evdev::Key::KEY_S,
"d" => evdev::Key::KEY_D,
"f" => evdev::Key::KEY_F,
"g" => evdev::Key::KEY_G,
"h" => evdev::Key::KEY_H,
"j" => evdev::Key::KEY_J,
"k" => evdev::Key::KEY_K,
"l" => evdev::Key::KEY_L,
"z" => evdev::Key::KEY_Z,
"x" => evdev::Key::KEY_X,
"c" => evdev::Key::KEY_C,
"v" => evdev::Key::KEY_V,
"b" => evdev::Key::KEY_B,
"n" => evdev::Key::KEY_N,
"m" => evdev::Key::KEY_M,
"1" => evdev::Key::KEY_1,
"2" => evdev::Key::KEY_2,
"3" => evdev::Key::KEY_3,
"4" => evdev::Key::KEY_4,
"5" => evdev::Key::KEY_5,
"6" => evdev::Key::KEY_6,
"7" => evdev::Key::KEY_7,
"8" => evdev::Key::KEY_8,
"9" => evdev::Key::KEY_9,
"0" => evdev::Key::KEY_0,
"escape" => evdev::Key::KEY_ESC,
"backspace" => evdev::Key::KEY_BACKSPACE,
"capslock" => evdev::Key::KEY_CAPSLOCK,
"return" => evdev::Key::KEY_ENTER,
"enter" => evdev::Key::KEY_ENTER,
"tab" => evdev::Key::KEY_TAB,
"space" => evdev::Key::KEY_SPACE,
"plus" => evdev::Key::KEY_KPPLUS, // Shouldn't this be kpplu?
"kp0" => evdev::Key::KEY_KP0,
"kp1" => evdev::Key::KEY_KP1,
"kp2" => evdev::Key::KEY_KP2,
"kp3" => evdev::Key::KEY_KP3,
"kp4" => evdev::Key::KEY_KP4,
"kp5" => evdev::Key::KEY_KP5,
"kp6" => evdev::Key::KEY_KP6,
"kp7" => evdev::Key::KEY_KP7,
"kp8" => evdev::Key::KEY_KP8,
"kp9" => evdev::Key::KEY_KP9,
"kpasterisk" => evdev::Key::KEY_KPASTERISK,
"kpcomma" => evdev::Key::KEY_KPCOMMA,
"kpdot" => evdev::Key::KEY_KPDOT,
"kpenter" => evdev::Key::KEY_KPENTER,
"kpequal" => evdev::Key::KEY_KPEQUAL,
"kpjpcomma" => evdev::Key::KEY_KPJPCOMMA,
"kpleftparen" => evdev::Key::KEY_KPLEFTPAREN,
"kpminus" => evdev::Key::KEY_KPMINUS,
"kpplusminus" => evdev::Key::KEY_KPPLUSMINUS,
"kprightparen" => evdev::Key::KEY_KPRIGHTPAREN,
"minus" => evdev::Key::KEY_MINUS,
"-" => evdev::Key::KEY_MINUS,
"equal" => evdev::Key::KEY_EQUAL,
"=" => evdev::Key::KEY_EQUAL,
"grave" => evdev::Key::KEY_GRAVE,
"`" => evdev::Key::KEY_GRAVE,
"print" => evdev::Key::KEY_SYSRQ,
"volumeup" => evdev::Key::KEY_VOLUMEUP,
"xf86audioraisevolume" => evdev::Key::KEY_VOLUMEUP,
"volumedown" => evdev::Key::KEY_VOLUMEDOWN,
"xf86audiolowervolume" => evdev::Key::KEY_VOLUMEDOWN,
"mute" => evdev::Key::KEY_MUTE,
"xf86audiomute" => evdev::Key::KEY_MUTE,
"brightnessup" => evdev::Key::KEY_BRIGHTNESSUP,
"xf86monbrightnessup" => evdev::Key::KEY_BRIGHTNESSUP,
"brightnessdown" => evdev::Key::KEY_BRIGHTNESSDOWN,
"xf86audiomedia" => evdev::Key::KEY_MEDIA,
"xf86audiomicmute" => evdev::Key::KEY_MICMUTE,
"micmute" => evdev::Key::KEY_MICMUTE,
"xf86audionext" => evdev::Key::KEY_NEXTSONG,
"xf86audioplay" => evdev::Key::KEY_PLAYPAUSE,
"xf86audioprev" => evdev::Key::KEY_PREVIOUSSONG,
"xf86audiostop" => evdev::Key::KEY_STOP,
"xf86monbrightnessdown" => evdev::Key::KEY_BRIGHTNESSDOWN,
"," => evdev::Key::KEY_COMMA,
"comma" => evdev::Key::KEY_COMMA,
"." => evdev::Key::KEY_DOT,
"dot" => evdev::Key::KEY_DOT,
"period" => evdev::Key::KEY_DOT,
"/" => evdev::Key::KEY_SLASH,
"question" => evdev::Key::KEY_QUESTION,
"slash" => evdev::Key::KEY_SLASH,
"backslash" => evdev::Key::KEY_BACKSLASH,
"\\" => evdev::Key::KEY_BACKSLASH,
"leftbrace" => evdev::Key::KEY_LEFTBRACE,
"[" => evdev::Key::KEY_LEFTBRACE,
"bracketleft" => evdev::Key::KEY_LEFTBRACE,
"rightbrace" => evdev::Key::KEY_RIGHTBRACE,
"]" => evdev::Key::KEY_RIGHTBRACE,
"bracketright" => evdev::Key::KEY_RIGHTBRACE,
";" => evdev::Key::KEY_SEMICOLON,
"scroll_lock" => evdev::Key::KEY_SCROLLLOCK,
"semicolon" => evdev::Key::KEY_SEMICOLON,
"'" => evdev::Key::KEY_APOSTROPHE,
"apostrophe" => evdev::Key::KEY_APOSTROPHE,
"left" => evdev::Key::KEY_LEFT,
"right" => evdev::Key::KEY_RIGHT,
"up" => evdev::Key::KEY_UP,
"down" => evdev::Key::KEY_DOWN,
"pause" => evdev::Key::KEY_PAUSE,
"home" => evdev::Key::KEY_HOME,
"delete" => evdev::Key::KEY_DELETE,
"insert" => evdev::Key::KEY_INSERT,
"end" => evdev::Key::KEY_END,
"pause" => evdev::Key::KEY_PAUSE,
"prior" => evdev::Key::KEY_PAGEDOWN,
"next" => evdev::Key::KEY_PAGEUP,
"pagedown" => evdev::Key::KEY_PAGEDOWN,
"pageup" => evdev::Key::KEY_PAGEUP,
"f1" => evdev::Key::KEY_F1,
"f2" => evdev::Key::KEY_F2,
"f3" => evdev::Key::KEY_F3,
"f4" => evdev::Key::KEY_F4,
"f5" => evdev::Key::KEY_F5,
"f6" => evdev::Key::KEY_F6,
"f7" => evdev::Key::KEY_F7,
"f8" => evdev::Key::KEY_F8,
"f9" => evdev::Key::KEY_F9,
"f10" => evdev::Key::KEY_F10,
"f11" => evdev::Key::KEY_F11,
"f12" => evdev::Key::KEY_F12,
"f13" => evdev::Key::KEY_F13,
"f14" => evdev::Key::KEY_F14,
"f15" => evdev::Key::KEY_F15,
"f16" => evdev::Key::KEY_F16,
"f17" => evdev::Key::KEY_F17,
"f18" => evdev::Key::KEY_F18,
"f19" => evdev::Key::KEY_F19,
"f20" => evdev::Key::KEY_F20,
"f21" => evdev::Key::KEY_F21,
"f22" => evdev::Key::KEY_F22,
"f23" => evdev::Key::KEY_F23,
"f24" => evdev::Key::KEY_F24,
_ => return Err(ParseError::InvalidKey(s.to_string())),
};
Ok(val)
}
Loading

0 comments on commit b3d73d0

Please sign in to comment.