diff --git a/src/event_handler.rs b/src/event_handler.rs index 4448e17..5e3389e 100644 --- a/src/event_handler.rs +++ b/src/event_handler.rs @@ -26,6 +26,7 @@ pub struct EventHandler { multi_purpose_keys: HashMap, override_remap: Option>>, override_timeout_at: Option, + override_timeout_keys: Vec, sigaction_set: bool, mark_set: bool, escape_next_key: bool, @@ -44,6 +45,7 @@ impl EventHandler { multi_purpose_keys: HashMap::new(), override_remap: None, override_timeout_at: None, + override_timeout_keys: vec![], sigaction_set: false, mark_set: false, escape_next_key: false, @@ -52,7 +54,20 @@ impl EventHandler { // Handle EventType::KEY pub fn on_event(&mut self, event: InputEvent, config: &Config) -> Result<(), Box> { + // Pre-event updates self.application_cache = None; // expire cache + if let Some(override_timeout_at) = self.override_timeout_at { + if override_timeout_at < Instant::now() { + self.override_remap = None; + self.override_timeout_at = None; + for key in self.override_timeout_keys.clone() { + self.send_key(&key, PRESS)?; + self.send_key(&key, RELEASE)?; + } + self.override_timeout_keys = vec![]; + } + } + let key = Key::new(event.code()); debug!("=> {}: {:?}", event.value(), &key); @@ -75,7 +90,7 @@ impl EventHandler { self.escape_next_key = false } else if let Some(actions) = self.find_keymap(config, &key) { for action in &actions { - self.dispatch_action(action)?; + self.dispatch_action(action, &key)?; } continue; } @@ -171,15 +186,11 @@ impl EventHandler { alt: self.alt.to_modifier_state(), windows: self.windows.to_modifier_state(), }; - if let Some(override_timeout_at) = self.override_timeout_at { - if override_timeout_at < Instant::now() { - self.override_remap = None; - self.override_timeout_at = None; - } - } if let Some(override_remap) = &self.override_remap { let override_remap = override_remap.clone(); self.override_remap = None; + self.override_timeout_at = None; + self.override_timeout_keys = vec![]; if let Some(actions) = override_remap.get(&key_press) { return Some(actions.to_vec()); } @@ -197,7 +208,7 @@ impl EventHandler { None } - fn dispatch_action(&mut self, action: &Action) -> Result<(), Box> { + fn dispatch_action(&mut self, action: &Action, key: &Key) -> Result<(), Box> { match action { Action::KeyPress(key_press) => self.send_key_press(key_press)?, Action::Remap(action) => { @@ -206,7 +217,8 @@ impl EventHandler { override_remap.insert(key_press.clone(), actions.to_vec()); } self.override_remap = Some(override_remap); - self.override_timeout_at = action.timeout.map(|t| Instant::now() + t) + self.override_timeout_at = action.timeout.map(|t| Instant::now() + t); + self.override_timeout_keys.push(key.clone()); } Action::Launch(command) => self.run_command(command.clone()), Action::SetMark(set) => self.mark_set = *set,