diff --git a/Cargo.lock b/Cargo.lock index b75efa8..ec1453e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,9 +174,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +checksum = "779e6b7d17797c0b42023d417228c02889300190e700cb074c3438d9c541d332" [[package]] name = "cfg-if" @@ -186,9 +186,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -196,9 +196,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -208,9 +208,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.5" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck", "proc-macro2", @@ -450,9 +450,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" @@ -523,9 +523,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -777,10 +777,11 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "sweet" version = "0.1.0" -source = "git+https://github.com/lavafroth/sweet.git#361be3320068c21ad4db4a6ea7831ab3ad1aeacd" +source = "git+https://github.com/lavafroth/sweet.git#30e44f4f1a765507203a9b5e869893d7422f3130" dependencies = [ "anyhow", "bitflags 2.6.0", + "evdev", "itertools 0.12.1", "pest", "pest_derive", diff --git a/flake.lock b/flake.lock index 900ef5a..b80c063 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1687977148, - "narHash": "sha256-gUcXiU2GgjYIc65GOIemdBJZ+lkQxuyIh7OkR9j0gCo=", + "lastModified": 1715499532, + "narHash": "sha256-9UJLb8rdi2VokYcfOBQHUzP3iNxOPNWcbK++ENElpk0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "60a783e00517fce85c42c8c53fe0ed05ded5b2a4", + "rev": "af8b9db5c00f1a8e4b83578acc578ff7d823b786", "type": "github" }, "original": { diff --git a/swhkd/src/config.rs b/swhkd/src/config.rs index 0d4b908..189d863 100644 --- a/swhkd/src/config.rs +++ b/swhkd/src/config.rs @@ -1,68 +1,13 @@ -use std::collections::HashMap; -use std::{ - fmt, - path::{Path, PathBuf}, -}; +use std::path::Path; use sweet::token::KeyAttribute; +use sweet::ParseError; use sweet::{Definition, SwhkdParser}; -#[derive(Debug)] -pub enum Error { - ConfigNotFound, - Io(std::io::Error), - InvalidConfig(ParseError), -} - -#[derive(Debug, PartialEq, Eq)] -pub enum ParseError { - // u32 is the line number where an error occured - UnknownSymbol(PathBuf, u32), - InvalidModifier(PathBuf, u32), - InvalidKeysym(PathBuf, u32), -} - -impl From for Error { - fn from(val: std::io::Error) -> Self { - if val.kind() == std::io::ErrorKind::NotFound { - Error::ConfigNotFound - } else { - Error::Io(val) - } - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Error::ConfigNotFound => "Config file not found.".fmt(f), - - Error::Io(io_err) => format!("I/O Error while parsing config file: {}", io_err).fmt(f), - Error::InvalidConfig(parse_err) => match parse_err { - ParseError::UnknownSymbol(path, line_nr) => format!( - "Error parsing config file {:?}. Unknown symbol at line {}.", - path, line_nr - ) - .fmt(f), - ParseError::InvalidKeysym(path, line_nr) => format!( - "Error parsing config file {:?}. Invalid keysym at line {}.", - path, line_nr - ) - .fmt(f), - ParseError::InvalidModifier(path, line_nr) => format!( - "Error parsing config file {:?}. Invalid modifier at line {}.", - path, line_nr - ) - .fmt(f), - }, - } - } -} - -/// TODO: implement these in the parser crate +/// TODO: implement these in the code side of the parser crate pub const MODE_ENTER_STATEMENT: &str = "@enter"; pub const MODE_ESCAPE_STATEMENT: &str = "@escape"; -pub fn load(path: &Path) -> Result, Error> { +pub fn load(path: &Path) -> Result, ParseError> { let config_self = sweet::SwhkdParser::from(sweet::ParserInput::Path(path)).unwrap(); parse_contents(config_self) } @@ -210,7 +155,7 @@ pub struct ModeOptions { pub oneoff: bool, } -pub fn parse_contents(contents: SwhkdParser) -> Result, Error> { +pub fn parse_contents(contents: SwhkdParser) -> Result, ParseError> { let mut default_mode = Mode::default(); for binding in &contents.bindings { @@ -248,179 +193,22 @@ pub fn parse_contents(contents: SwhkdParser) -> Result, Error> { /// the SWEET parser and the structures here. /// TODO: Bake this into the parser itself. fn sweet_def_to_kb(def: &Definition) -> KeyBinding { - // Don't forget to update valid key list on the man page if you do change this list. - let key_to_evdev_key: HashMap<&str, evdev::Key> = HashMap::from([ - ("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 kpplus? - ("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), - ("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), - ]); - // Don't forget to update modifier list on the man page if you do change this list. - let mod_to_mod_enum: HashMap<&str, Modifier> = HashMap::from([ - ("ctrl", Modifier::Control), - ("control", Modifier::Control), - ("super", Modifier::Super), - ("mod4", Modifier::Super), - ("alt", Modifier::Alt), - ("mod1", Modifier::Alt), - ("altgr", Modifier::Altgr), - ("mod5", Modifier::Altgr), - ("shift", Modifier::Shift), - ("any", Modifier::Any), - ]); - let keysym = key_to_evdev_key.get(def.key.key.to_lowercase().as_str()).cloned().unwrap(); let modifiers = def .modifiers .iter() - .map(|sweet::token::Modifier(modifier)| { - mod_to_mod_enum.get(modifier.to_lowercase().as_str()).cloned().unwrap() + .map(|m| match m { + sweet::token::Modifier::Super => Modifier::Super, + sweet::token::Modifier::Any => Modifier::Any, + sweet::token::Modifier::Control => Modifier::Control, + sweet::token::Modifier::Alt => Modifier::Alt, + sweet::token::Modifier::Altgr => Modifier::Altgr, + sweet::token::Modifier::Shift => Modifier::Shift, }) .collect(); + let send = def.key.attribute == KeyAttribute::Send; let on_release = def.key.attribute == KeyAttribute::OnRelease; - KeyBinding { keysym, modifiers, send, on_release } + KeyBinding { keysym: def.key.key, modifiers, send, on_release } }