Add option to wait for modifier release before injection. Fix #470

This commit is contained in:
Federico Terzi 2020-10-23 21:54:27 +02:00
parent 63c28081a6
commit be0dd8a2cb
3 changed files with 31 additions and 0 deletions

View File

@ -159,6 +159,10 @@ fn default_post_inject_delay() -> u64 {
100
}
fn default_wait_for_modifiers_release() -> bool {
false
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Configs {
#[serde(default = "default_name")]
@ -283,6 +287,9 @@ pub struct Configs {
#[serde(default = "default_modulo_path")]
pub modulo_path: Option<String>,
#[serde(default = "default_wait_for_modifiers_release")]
pub wait_for_modifiers_release: bool,
}
// Macro used to validate config fields

View File

@ -231,6 +231,13 @@ impl<
m.triggers[trigger_offset].chars().count() as i32 + 1 // Count also the separator
};
// If configured to do so, wait until the modifier keys are released (or timeout) so
// that we avoid unwanted interactions. As an example, see:
// https://github.com/federico-terzi/espanso/issues/470
if config.wait_for_modifiers_release {
crate::keyboard::wait_for_modifiers_release();
}
if !skip_delete {
self.keyboard_manager.delete_string(&config, char_count);
}

View File

@ -18,6 +18,7 @@
*/
use crate::config::Configs;
use log::warn;
use serde::{Deserialize, Serialize};
#[cfg(target_os = "windows")]
@ -71,3 +72,19 @@ pub fn get_manager() -> impl KeyboardManager {
pub fn get_manager() -> impl KeyboardManager {
macos::MacKeyboardManager {}
}
// These methods are used to wait until all modifiers are released (or timeout occurs)
pub fn wait_for_modifiers_release() {
#[cfg(target_os = "windows")]
let released = crate::keyboard::windows::wait_for_modifiers_release();
#[cfg(target_os = "macos")]
let released = crate::keyboard::macos::wait_for_modifiers_release();
#[cfg(target_os = "linux")]
let released = true; // NOOP on linux (at least for now)
if !released {
warn!("Wait for modifiers release timed out! Please release your modifiers keys (CTRL, CMD, ALT, SHIFT) after typing the trigger");
}
}