fix(core): fix misbehaving backspace handling
This commit is contained in:
parent
518f0f8376
commit
f4f841f58a
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user