Add check to avoid espanso reinterpreting its own actions
This commit is contained in:
parent
9332899969
commit
e2c98284b6
|
@ -59,6 +59,7 @@ fn default_passive_match_regex() -> String{ "(?P<name>:\\p{L}+)(/(?P<args>.*)/)?
|
||||||
fn default_passive_arg_delimiter() -> char { '/' }
|
fn default_passive_arg_delimiter() -> char { '/' }
|
||||||
fn default_passive_arg_escape() -> char { '\\' }
|
fn default_passive_arg_escape() -> char { '\\' }
|
||||||
fn default_passive_key() -> KeyModifier { KeyModifier::OFF }
|
fn default_passive_key() -> KeyModifier { KeyModifier::OFF }
|
||||||
|
fn default_action_noop_interval() -> u128 { 500 }
|
||||||
fn default_backspace_limit() -> i32 { 3 }
|
fn default_backspace_limit() -> i32 { 3 }
|
||||||
fn default_exclude_default_matches() -> bool {false}
|
fn default_exclude_default_matches() -> bool {false}
|
||||||
fn default_matches() -> Vec<Match> { Vec::new() }
|
fn default_matches() -> Vec<Match> { Vec::new() }
|
||||||
|
@ -119,6 +120,9 @@ pub struct Configs {
|
||||||
#[serde(default = "default_passive_key")]
|
#[serde(default = "default_passive_key")]
|
||||||
pub passive_key: KeyModifier,
|
pub passive_key: KeyModifier,
|
||||||
|
|
||||||
|
#[serde(default = "default_action_noop_interval")]
|
||||||
|
pub action_noop_interval: u128,
|
||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub paste_shortcut: PasteShortcut,
|
pub paste_shortcut: PasteShortcut,
|
||||||
|
|
||||||
|
@ -171,6 +175,7 @@ impl Configs {
|
||||||
validate_field!(result, self.passive_arg_delimiter, default_passive_arg_delimiter());
|
validate_field!(result, self.passive_arg_delimiter, default_passive_arg_delimiter());
|
||||||
validate_field!(result, self.passive_arg_escape, default_passive_arg_escape());
|
validate_field!(result, self.passive_arg_escape, default_passive_arg_escape());
|
||||||
validate_field!(result, self.passive_key, default_passive_key());
|
validate_field!(result, self.passive_key, default_passive_key());
|
||||||
|
validate_field!(result, self.action_noop_interval, default_action_noop_interval());
|
||||||
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ use std::process::exit;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use regex::{Regex, Captures};
|
use regex::{Regex, Captures};
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
pub struct Engine<'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>,
|
pub struct Engine<'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>,
|
||||||
U: UIManager, R: Renderer> {
|
U: UIManager, R: Renderer> {
|
||||||
|
@ -42,6 +43,8 @@ pub struct Engine<'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<
|
||||||
renderer: &'a R,
|
renderer: &'a R,
|
||||||
|
|
||||||
enabled: RefCell<bool>,
|
enabled: RefCell<bool>,
|
||||||
|
last_action_time: RefCell<SystemTime>, // Used to block espanso from re-interpreting it's own inputs
|
||||||
|
action_noop_interval: u128,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIManager, R: Renderer>
|
impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIManager, R: Renderer>
|
||||||
|
@ -50,13 +53,17 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
|
||||||
config_manager: &'a M, ui_manager: &'a U,
|
config_manager: &'a M, ui_manager: &'a U,
|
||||||
renderer: &'a R) -> Engine<'a, S, C, M, U, R> {
|
renderer: &'a R) -> Engine<'a, S, C, M, U, R> {
|
||||||
let enabled = RefCell::new(true);
|
let enabled = RefCell::new(true);
|
||||||
|
let last_action_time = RefCell::new(SystemTime::now());
|
||||||
|
let action_noop_interval = config_manager.default_config().action_noop_interval;
|
||||||
|
|
||||||
Engine{keyboard_manager,
|
Engine{keyboard_manager,
|
||||||
clipboard_manager,
|
clipboard_manager,
|
||||||
config_manager,
|
config_manager,
|
||||||
ui_manager,
|
ui_manager,
|
||||||
renderer,
|
renderer,
|
||||||
enabled
|
enabled,
|
||||||
|
last_action_time,
|
||||||
|
action_noop_interval,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,6 +109,20 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Used to check if the last action has been executed within a specified interval.
|
||||||
|
/// If so, return true (blocking the action), otherwise false.
|
||||||
|
fn check_last_action_and_set(&self, interval: u128) -> bool {
|
||||||
|
let mut last_action_time = self.last_action_time.borrow_mut();
|
||||||
|
if let Ok(elapsed) = last_action_time.elapsed() {
|
||||||
|
if elapsed.as_millis() < interval {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(*last_action_time) = SystemTime::now();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
@ -118,6 +139,11 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// avoid espanso reinterpreting its own actions
|
||||||
|
if self.check_last_action_and_set(self.action_noop_interval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let char_count = if trailing_separator.is_none() {
|
let char_count = if trailing_separator.is_none() {
|
||||||
m.trigger.chars().count() as i32
|
m.trigger.chars().count() as i32
|
||||||
}else{
|
}else{
|
||||||
|
@ -218,6 +244,11 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_enable_update(&self, status: bool) {
|
fn on_enable_update(&self, status: bool) {
|
||||||
|
// avoid espanso reinterpreting its own actions
|
||||||
|
if self.check_last_action_and_set(self.action_noop_interval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let message = if status {
|
let message = if status {
|
||||||
"espanso enabled"
|
"espanso enabled"
|
||||||
}else{
|
}else{
|
||||||
|
@ -233,6 +264,11 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_passive(&self) {
|
fn on_passive(&self) {
|
||||||
|
// avoid espanso reinterpreting its own actions
|
||||||
|
if self.check_last_action_and_set(self.action_noop_interval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
info!("Passive mode activated");
|
info!("Passive mode activated");
|
||||||
|
|
||||||
// Trigger a copy shortcut to transfer the content of the selection to the clipboard
|
// Trigger a copy shortcut to transfer the content of the selection to the clipboard
|
||||||
|
|
Loading…
Reference in New Issue
Block a user