fix(core): improve handling of conflicting pressed modifiers
This commit is contained in:
		
							parent
							
								
									2eef404d6c
								
							
						
					
					
						commit
						e049ba51fb
					
				| 
						 | 
				
			
			@ -32,6 +32,11 @@ use crate::engine::process::ModifierStatusProvider;
 | 
			
		|||
/// after a while.
 | 
			
		||||
const MAXIMUM_MODIFIERS_PRESS_TIME_RECORD: Duration = Duration::from_secs(30);
 | 
			
		||||
 | 
			
		||||
// TODO: should we add also Shift on Linux to avoid any conflict in the expansion process? Investigate
 | 
			
		||||
/// These are the modifiers that might conflict with the expansion process. For example,
 | 
			
		||||
/// if espanso injects some texts while Alt or Ctrl are pressed, strange things might happen.
 | 
			
		||||
const CONFLICTING_MODIFIERS: &[Modifier] = &[Modifier::Ctrl, Modifier::Alt, Modifier::Meta];
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Hash, PartialEq, Eq)]
 | 
			
		||||
pub enum Modifier {
 | 
			
		||||
  Ctrl,
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +57,7 @@ impl ModifierStateStore {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pub fn is_any_modifier_pressed(&self) -> bool {
 | 
			
		||||
  pub fn is_any_conflicting_modifier_pressed(&self) -> bool {
 | 
			
		||||
    let mut state = self.state.lock().expect("unable to obtain modifier state");
 | 
			
		||||
    let mut is_any_modifier_pressed = false;
 | 
			
		||||
    for (modifier, status) in &mut state.modifiers {
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +69,7 @@ impl ModifierStateStore {
 | 
			
		|||
        status.release();
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if status.is_pressed() {
 | 
			
		||||
      if status.is_pressed() && CONFLICTING_MODIFIERS.contains(modifier) {
 | 
			
		||||
        is_any_modifier_pressed = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -131,7 +136,7 @@ impl ModifierStatus {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl ModifierStatusProvider for ModifierStateStore {
 | 
			
		||||
  fn is_any_modifier_pressed(&self) -> bool {
 | 
			
		||||
    self.is_any_modifier_pressed()
 | 
			
		||||
  fn is_any_conflicting_modifier_pressed(&self) -> bool {
 | 
			
		||||
    self.is_any_conflicting_modifier_pressed()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ use crate::engine::event::{Event, EventType};
 | 
			
		|||
const MODIFIER_DELAY_TIMEOUT: Duration = Duration::from_secs(3);
 | 
			
		||||
 | 
			
		||||
pub trait ModifierStatusProvider {
 | 
			
		||||
  fn is_any_modifier_pressed(&self) -> bool;
 | 
			
		||||
  fn is_any_conflicting_modifier_pressed(&self) -> bool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// This middleware is used to delay the injection of text until
 | 
			
		||||
| 
						 | 
				
			
			@ -58,11 +58,14 @@ impl <'a> Middleware for DelayForModifierReleaseMiddleware<'a> {
 | 
			
		|||
  fn next(&self, event: Event, _: &mut dyn FnMut(Event)) -> Event {
 | 
			
		||||
    if is_injection_event(&event.etype) {
 | 
			
		||||
      let start = Instant::now();
 | 
			
		||||
      while self.provider.is_any_modifier_pressed() {
 | 
			
		||||
      while self.provider.is_any_conflicting_modifier_pressed() {
 | 
			
		||||
        if Instant::now().duration_since(start) > MODIFIER_DELAY_TIMEOUT {
 | 
			
		||||
          warn!("injection delay has timed out, please release the modifier keys (SHIFT, CTRL, ALT, CMD) to trigger an expansion");
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO: here we might show a popup window to tell the users to release those keys
 | 
			
		||||
 | 
			
		||||
        trace!("delaying injection event as some modifiers are pressed");
 | 
			
		||||
        std::thread::sleep(Duration::from_millis(100));
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user