|
|
|
@ -50,16 +50,16 @@ impl fmt::Display for Error {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
|
|
|
pub struct Hotkey {
|
|
|
|
|
pub mode: String,
|
|
|
|
|
pub keysym: evdev::Key,
|
|
|
|
|
pub mode: Option<String>,
|
|
|
|
|
pub keysym: rdev::Key,
|
|
|
|
|
pub modifiers: Vec<Modifier>,
|
|
|
|
|
pub command: String,
|
|
|
|
|
pub consume: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, PartialEq, Copy, Clone)]
|
|
|
|
|
#[derive(Debug, PartialEq, Copy, Clone, Hash, Eq)]
|
|
|
|
|
// TODO: make the commented-out modifiers available
|
|
|
|
|
pub enum Modifier {
|
|
|
|
|
Super,
|
|
|
|
@ -78,7 +78,7 @@ pub enum Modifier {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Hotkey {
|
|
|
|
|
pub fn new(mode: String, keysym: evdev::Key, modifiers: Vec<Modifier>, command: String, consume: bool) -> Self {
|
|
|
|
|
pub fn new(mode: Option<String>, keysym: rdev::Key, modifiers: Vec<Modifier>, command: String, consume: bool) -> Self {
|
|
|
|
|
Hotkey { mode, keysym, modifiers, command, consume }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -96,108 +96,113 @@ fn load_file_contents(path: path::PathBuf) -> Result<String, Error> {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn parse_contents(contents: String) -> Result<Vec<Hotkey>, Error> {
|
|
|
|
|
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),
|
|
|
|
|
("delete", evdev::Key::KEY_DELETE),
|
|
|
|
|
("backspace", evdev::Key::KEY_BACKSPACE),
|
|
|
|
|
("return", evdev::Key::KEY_ENTER),
|
|
|
|
|
("enter", evdev::Key::KEY_ENTER),
|
|
|
|
|
("tab", evdev::Key::KEY_TAB),
|
|
|
|
|
("space", evdev::Key::KEY_SPACE),
|
|
|
|
|
("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),
|
|
|
|
|
("brightnessdown", evdev::Key::KEY_BRIGHTNESSDOWN),
|
|
|
|
|
(",", evdev::Key::KEY_COMMA),
|
|
|
|
|
("comma", evdev::Key::KEY_COMMA),
|
|
|
|
|
(".", evdev::Key::KEY_DOT),
|
|
|
|
|
("dot", evdev::Key::KEY_DOT),
|
|
|
|
|
("/", evdev::Key::KEY_SLASH),
|
|
|
|
|
("slash", evdev::Key::KEY_SLASH),
|
|
|
|
|
("backslash", evdev::Key::KEY_BACKSLASH),
|
|
|
|
|
("leftbrace", evdev::Key::KEY_LEFTBRACE),
|
|
|
|
|
("[", evdev::Key::KEY_LEFTBRACE),
|
|
|
|
|
("rightbrace", evdev::Key::KEY_RIGHTBRACE),
|
|
|
|
|
("]", evdev::Key::KEY_RIGHTBRACE),
|
|
|
|
|
(";", evdev::Key::KEY_SEMICOLON),
|
|
|
|
|
("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),
|
|
|
|
|
("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),
|
|
|
|
|
let key_to_evdev_key: HashMap<&str, rdev::Key> = HashMap::from([
|
|
|
|
|
("q", rdev::Key::KeyQ),
|
|
|
|
|
("w", rdev::Key::KeyW),
|
|
|
|
|
("e", rdev::Key::KeyE),
|
|
|
|
|
("r", rdev::Key::KeyR),
|
|
|
|
|
("t", rdev::Key::KeyT),
|
|
|
|
|
("y", rdev::Key::KeyY),
|
|
|
|
|
("u", rdev::Key::KeyU),
|
|
|
|
|
("i", rdev::Key::KeyI),
|
|
|
|
|
("o", rdev::Key::KeyO),
|
|
|
|
|
("p", rdev::Key::KeyP),
|
|
|
|
|
("a", rdev::Key::KeyA),
|
|
|
|
|
("s", rdev::Key::KeyS),
|
|
|
|
|
("d", rdev::Key::KeyD),
|
|
|
|
|
("f", rdev::Key::KeyF),
|
|
|
|
|
("g", rdev::Key::KeyG),
|
|
|
|
|
("h", rdev::Key::KeyH),
|
|
|
|
|
("j", rdev::Key::KeyJ),
|
|
|
|
|
("k", rdev::Key::KeyK),
|
|
|
|
|
("l", rdev::Key::KeyL),
|
|
|
|
|
("z", rdev::Key::KeyZ),
|
|
|
|
|
("x", rdev::Key::KeyX),
|
|
|
|
|
("c", rdev::Key::KeyC),
|
|
|
|
|
("v", rdev::Key::KeyV),
|
|
|
|
|
("b", rdev::Key::KeyB),
|
|
|
|
|
("n", rdev::Key::KeyN),
|
|
|
|
|
("m", rdev::Key::KeyM),
|
|
|
|
|
("1", rdev::Key::Num1),
|
|
|
|
|
("2", rdev::Key::Num2),
|
|
|
|
|
("3", rdev::Key::Num3),
|
|
|
|
|
("4", rdev::Key::Num4),
|
|
|
|
|
("5", rdev::Key::Num5),
|
|
|
|
|
("6", rdev::Key::Num6),
|
|
|
|
|
("7", rdev::Key::Num7),
|
|
|
|
|
("8", rdev::Key::Num8),
|
|
|
|
|
("9", rdev::Key::Num9),
|
|
|
|
|
("0", rdev::Key::Num0),
|
|
|
|
|
("escape", rdev::Key::Escape),
|
|
|
|
|
("delete", rdev::Key::Delete),
|
|
|
|
|
("backspace", rdev::Key::Backspace),
|
|
|
|
|
("return", rdev::Key::Return),
|
|
|
|
|
("enter", rdev::Key::Return),
|
|
|
|
|
("tab", rdev::Key::Tab),
|
|
|
|
|
("space", rdev::Key::Space),
|
|
|
|
|
("minus", rdev::Key::Minus),
|
|
|
|
|
("-", rdev::Key::Minus),
|
|
|
|
|
("equal", rdev::Key::Equal),
|
|
|
|
|
("=", rdev::Key::Equal),
|
|
|
|
|
("grave", rdev::Key::BackQuote),
|
|
|
|
|
("`", rdev::Key::BackQuote),
|
|
|
|
|
("print", rdev::Key::PrintScreen),
|
|
|
|
|
/*
|
|
|
|
|
("volumeup", rdev::Key::KEY_VOLUMEUP),
|
|
|
|
|
("xf86audioraisevolume", rdev::Key::KEY_VOLUMEUP),
|
|
|
|
|
("volumedown", rdev::Key::KEY_VOLUMEDOWN),
|
|
|
|
|
("xf86audiolowervolume", rdev::Key::KEY_VOLUMEDOWN),
|
|
|
|
|
("mute", rdev::Key::KEY_MUTE),
|
|
|
|
|
("xf86audiomute", rdev::Key::KEY_MUTE),
|
|
|
|
|
("brightnessup", rdev::Key::KEY_BRIGHTNESSUP),
|
|
|
|
|
("brightnessdown", rdev::Key::KEY_BRIGHTNESSDOWN),
|
|
|
|
|
TODO: find ways to accept xf86 keys
|
|
|
|
|
*/
|
|
|
|
|
(",", rdev::Key::Comma),
|
|
|
|
|
("comma", rdev::Key::Comma),
|
|
|
|
|
(".", rdev::Key::Dot),
|
|
|
|
|
("dot", rdev::Key::Dot),
|
|
|
|
|
("/", rdev::Key::Slash),
|
|
|
|
|
("slash", rdev::Key::Slash),
|
|
|
|
|
("backslash", rdev::Key::IntlBackslash),
|
|
|
|
|
("leftbrace", rdev::Key::LeftBracket),
|
|
|
|
|
("[", rdev::Key::LeftBracket),
|
|
|
|
|
("rightbrace", rdev::Key::RightBracket),
|
|
|
|
|
("]", rdev::Key::RightBracket),
|
|
|
|
|
(";", rdev::Key::SemiColon),
|
|
|
|
|
("semicolon", rdev::Key::SemiColon),
|
|
|
|
|
("'", rdev::Key::Quote),
|
|
|
|
|
("apostrophe", rdev::Key::Quote),
|
|
|
|
|
("left", rdev::Key::LeftArrow),
|
|
|
|
|
("right", rdev::Key::RightArrow),
|
|
|
|
|
("up", rdev::Key::UpArrow),
|
|
|
|
|
("down", rdev::Key::DownArrow),
|
|
|
|
|
("f1", rdev::Key::F1),
|
|
|
|
|
("f2", rdev::Key::F2),
|
|
|
|
|
("f3", rdev::Key::F3),
|
|
|
|
|
("f4", rdev::Key::F4),
|
|
|
|
|
("f5", rdev::Key::F5),
|
|
|
|
|
("f6", rdev::Key::F6),
|
|
|
|
|
("f7", rdev::Key::F7),
|
|
|
|
|
("f8", rdev::Key::F8),
|
|
|
|
|
("f9", rdev::Key::F9),
|
|
|
|
|
("f10", rdev::Key::F10),
|
|
|
|
|
("f11", rdev::Key::F11),
|
|
|
|
|
("f12", rdev::Key::F12),
|
|
|
|
|
/*
|
|
|
|
|
("f13", rdev::Key::F13),
|
|
|
|
|
("f14", rdev::Key::F14),
|
|
|
|
|
("f15", rdev::Key::F15),
|
|
|
|
|
("f16", rdev::Key::F16),
|
|
|
|
|
("f17", rdev::Key::F17),
|
|
|
|
|
("f18", rdev::Key::F18),
|
|
|
|
|
("f19", rdev::Key::F19),
|
|
|
|
|
("f20", rdev::Key::F20),
|
|
|
|
|
("f21", rdev::Key::F21),
|
|
|
|
|
("f22", rdev::Key::F22),
|
|
|
|
|
("f23", rdev::Key::F23),
|
|
|
|
|
("f24", rdev::Key::F24),
|
|
|
|
|
*/
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
let mod_to_mod_enum: HashMap<&str, Modifier> = HashMap::from([
|
|
|
|
@ -306,9 +311,9 @@ fn parse_contents(contents: String) -> Result<Vec<Hotkey>, Error> {
|
|
|
|
|
fn parse_keybind(
|
|
|
|
|
line: &str,
|
|
|
|
|
line_nr: u32,
|
|
|
|
|
key_to_evdev_key: &HashMap<&str, evdev::Key>,
|
|
|
|
|
key_to_evdev_key: &HashMap<&str, rdev::Key>,
|
|
|
|
|
mod_to_mod_enum: &HashMap<&str, Modifier>,
|
|
|
|
|
) -> Result<(String, evdev::Key, Vec<Modifier>, bool), Error> {
|
|
|
|
|
) -> Result<(Option<String>, rdev::Key, Vec<Modifier>, bool), Error> {
|
|
|
|
|
let line = line.split('#').next().unwrap();
|
|
|
|
|
let tokens: Vec<String> =
|
|
|
|
|
line.split('+').map(|s| s.trim().to_lowercase()).filter(|s| s != "_").collect();
|
|
|
|
@ -343,15 +348,19 @@ fn parse_keybind(
|
|
|
|
|
.map(|s| s.to_string())
|
|
|
|
|
.collect::<Vec<String>>()
|
|
|
|
|
.len() == 1 { true } else { false };
|
|
|
|
|
let mode = tokens
|
|
|
|
|
let mode = match tokens
|
|
|
|
|
.iter()
|
|
|
|
|
.filter(|s| s.starts_with("[") && s.ends_with("]"))
|
|
|
|
|
.map(|s| s.replace(&['[', ']'][..], ""))
|
|
|
|
|
.collect::<Vec<String>>()
|
|
|
|
|
.get(0)
|
|
|
|
|
.unwrap_or(&"".to_string())
|
|
|
|
|
.to_string();
|
|
|
|
|
let mod_index = if mode.is_empty() { 0 } else { 1 };
|
|
|
|
|
.get(0) {
|
|
|
|
|
Some(z) => Some(z.to_string()),
|
|
|
|
|
None => {
|
|
|
|
|
log::trace!("No mode specified");
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let mod_index = if mode.is_some() { 1 } else { 0 };
|
|
|
|
|
|
|
|
|
|
let modifiers: Vec<Modifier> = tokens[mod_index..(tokens.len() - 1)]
|
|
|
|
|
.iter()
|
|
|
|
|