From 660084b18bd24608a52eb299ee80c77a3e150e12 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 8 Feb 2022 23:34:51 -0800 Subject: [PATCH] Support escape_next_key --- src/config/action.rs | 15 +++++++++++++++ src/event_handler.rs | 21 ++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/config/action.rs b/src/config/action.rs index d4433d3..c18c618 100644 --- a/src/config/action.rs +++ b/src/config/action.rs @@ -18,6 +18,8 @@ pub enum Action { SetMark(bool), #[serde(deserialize_with = "deserialize_with_mark")] WithMark(KeyPress), + #[serde(deserialize_with = "deserialize_escape_next_key")] + EscapeNextKey(bool), } fn deserialize_remap<'de, D>(deserializer: D) -> Result>, D::Error> @@ -72,6 +74,19 @@ where Err(de::Error::custom("not a map with a single \"with_mark\" key")) } +fn deserialize_escape_next_key<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let mut action = HashMap::::deserialize(deserializer)?; + if let Some(set) = action.remove("escape_next_key") { + if action.is_empty() { + return Ok(set); + } + } + Err(de::Error::custom("not a map with a single \"escape_next_key\" key")) +} + // Used only for deserializing Vec #[derive(Clone, Deserialize)] #[serde(untagged)] diff --git a/src/event_handler.rs b/src/event_handler.rs index 18ee410..14856cc 100644 --- a/src/event_handler.rs +++ b/src/event_handler.rs @@ -27,6 +27,7 @@ pub struct EventHandler { override_remap: Option>>, sigaction_set: bool, mark_set: bool, + escape_next_key: bool, } impl EventHandler { @@ -43,6 +44,7 @@ impl EventHandler { override_remap: None, sigaction_set: false, mark_set: false, + escape_next_key: false, } } @@ -66,11 +68,15 @@ impl EventHandler { for (key, value) in key_values.into_iter() { if MODIFIER_KEYS.contains(&key.code()) { self.update_modifier(key.code(), value); - } else if let Some(actions) = self.find_keymap(config, &key, value) { - for action in &actions { - self.dispatch_action(action)?; + } else if is_pressed(value) { + if self.escape_next_key { + self.escape_next_key = false + } else if let Some(actions) = self.find_keymap(config, &key) { + for action in &actions { + self.dispatch_action(action)?; + } + continue; } - continue; } self.send_key(&key, value)?; } @@ -155,11 +161,7 @@ impl EventHandler { None } - fn find_keymap(&mut self, config: &Config, key: &Key, value: i32) -> Option> { - if !is_pressed(value) { - return None; - } - + fn find_keymap(&mut self, config: &Config, key: &Key) -> Option> { let key_press = KeyPress { key: key.clone(), shift: self.shift.to_modifier_state(), @@ -200,6 +202,7 @@ impl EventHandler { Action::Launch(command) => self.run_command(command.clone()), Action::SetMark(set) => self.mark_set = *set, Action::WithMark(key_press) => self.send_key_press(&self.with_mark(key_press))?, + Action::EscapeNextKey(escape_next_key) => self.escape_next_key = *escape_next_key, } Ok(()) }