fix(core): fix misbehaving backspace handling

This commit is contained in:
Federico Terzi 2021-04-11 19:34:55 +02:00
parent 518f0f8376
commit f4f841f58a

View File

@ -21,7 +21,14 @@ use log::trace;
use std::{cell::RefCell, collections::VecDeque}; use std::{cell::RefCell, collections::VecDeque};
use super::super::Middleware; use super::super::Middleware;
use crate::engine::{event::{Event, keyboard::{Key, Status}, matches::{DetectedMatch, MatchesDetectedEvent}}, process::{Matcher, MatcherEvent}}; use crate::engine::{
event::{
keyboard::{Key, Status},
matches::{DetectedMatch, MatchesDetectedEvent},
Event,
},
process::{Matcher, MatcherEvent},
};
const MAX_HISTORY: usize = 3; // TODO: get as parameter const MAX_HISTORY: usize = 3; // TODO: get as parameter
@ -42,6 +49,7 @@ impl<'a, State> MatchMiddleware<'a, State> {
impl<'a, State> Middleware for MatchMiddleware<'a, State> { impl<'a, State> Middleware for MatchMiddleware<'a, State> {
fn next(&self, event: Event, _: &mut dyn FnMut(Event)) -> Event { fn next(&self, event: Event, _: &mut dyn FnMut(Event)) -> Event {
if is_event_of_interest(&event) {
let mut matcher_states = self.matcher_states.borrow_mut(); let mut matcher_states = self.matcher_states.borrow_mut();
let prev_states = if !matcher_states.is_empty() { let prev_states = if !matcher_states.is_empty() {
matcher_states.get(matcher_states.len() - 1) matcher_states.get(matcher_states.len() - 1)
@ -60,6 +68,7 @@ impl<'a, State> Middleware for MatchMiddleware<'a, State> {
// Some keys (such as the arrow keys) prevent espanso from building // Some keys (such as the arrow keys) prevent espanso from building
// an accurate key buffer, so we need to invalidate it. // an accurate key buffer, so we need to invalidate it.
if is_invalidating_key(&keyboard_event.key) { if is_invalidating_key(&keyboard_event.key) {
trace!("invalidating event detected, clearing matching state");
matcher_states.clear(); matcher_states.clear();
return event; return event;
} }
@ -87,14 +96,16 @@ impl<'a, State> Middleware for MatchMiddleware<'a, State> {
if !all_results.is_empty() { if !all_results.is_empty() {
return Event::MatchesDetected(MatchesDetectedEvent { return Event::MatchesDetected(MatchesDetectedEvent {
matches: all_results.into_iter().map(|result | { matches: all_results
DetectedMatch { .into_iter()
.map(|result| DetectedMatch {
id: result.id, id: result.id,
trigger: result.trigger, trigger: result.trigger,
args: result.args, args: result.args,
}
}).collect()
}) })
.collect(),
});
}
} }
} }
@ -102,15 +113,25 @@ impl<'a, State> Middleware for MatchMiddleware<'a, State> {
} }
} }
fn is_event_of_interest(event: &Event) -> bool {
if let Event::Keyboard(keyboard_event) = &event {
if keyboard_event.status == Status::Pressed {
return true;
}
}
// TODO: handle mouse
false
}
fn convert_to_matcher_event(event: &Event) -> Option<MatcherEvent> { fn convert_to_matcher_event(event: &Event) -> Option<MatcherEvent> {
if let Event::Keyboard(keyboard_event) = event { if let Event::Keyboard(keyboard_event) = event {
if keyboard_event.status == Status::Pressed {
return Some(MatcherEvent::Key { return Some(MatcherEvent::Key {
key: keyboard_event.key.clone(), key: keyboard_event.key.clone(),
chars: keyboard_event.value.clone(), chars: keyboard_event.value.clone(),
}); });
} }
}
// TODO: mouse event should act as separator // TODO: mouse event should act as separator