From 14c909862f6ba819931bd756e7df015428380bbb Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Fri, 5 Apr 2019 00:19:39 +0200 Subject: [PATCH] implement parsing of modifier+key combinations --- src/commands.rs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 7d0410b..6301a1e 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -273,7 +273,11 @@ impl CommandManager { kb.extend(keybindings.unwrap_or_default()); for (k, v) in kb { - Self::register_keybinding(this.clone(), cursive, Self::parse_keybinding(k), v); + if let Some(binding) = Self::parse_keybinding(&k) { + Self::register_keybinding(this.clone(), cursive, binding, v); + } else { + error!("Could not parse keybinding: \"{}\"", &k); + } } } @@ -314,8 +318,8 @@ impl CommandManager { kb } - fn parse_keybinding(kb: String) -> cursive::event::Event { - match kb.as_ref() { + fn parse_key(key: &str) -> Event { + match key { "Enter" => Event::Key(Key::Enter), "Tab" => Event::Key(Key::Tab), "Backspace" => Event::Key(Key::Backspace), @@ -348,4 +352,24 @@ impl CommandManager { s => Event::Char(s.chars().next().unwrap()), } } + + fn parse_keybinding(kb: &str) -> Option { + let mut split = kb.split('+'); + if split.clone().count() == 2 { + let modifier = split.next().unwrap(); + let key = split.next().unwrap(); + if let Event::Key(parsed) = Self::parse_key(key) { + match modifier { + "Shift" => Some(Event::Shift(parsed)), + "Alt" => Some(Event::Alt(parsed)), + "Ctrl" => Some(Event::Ctrl(parsed)), + _ => None, + } + } else { + None + } + } else { + Some(Self::parse_key(&kb)) + } + } }