This commit is contained in:
Federico Terzi 2020-08-26 19:29:45 +02:00
parent 56f1d02d23
commit 270b603e8f
6 changed files with 55 additions and 17 deletions

View File

@ -24,11 +24,11 @@ use crate::event::{ActionType, Event, KeyEvent, KeyModifier};
use log::{debug, error, info}; use log::{debug, error, info};
use std::ffi::c_void; use std::ffi::c_void;
use std::fs; use std::fs;
use std::path::{Path, PathBuf};
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering::Acquire; use std::sync::atomic::Ordering::Acquire;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use std::sync::Arc; use std::sync::Arc;
use std::path::{Path, PathBuf};
use widestring::{U16CStr, U16CString}; use widestring::{U16CStr, U16CString};
const BMP_BINARY: &[u8] = include_bytes!("../res/win/espanso.bmp"); const BMP_BINARY: &[u8] = include_bytes!("../res/win/espanso.bmp");

View File

@ -25,7 +25,10 @@ use crate::keyboard::KeyboardManager;
use crate::matcher::{Match, MatchReceiver}; use crate::matcher::{Match, MatchReceiver};
use crate::protocol::{send_command_or_warn, IPCCommand, Service}; use crate::protocol::{send_command_or_warn, IPCCommand, Service};
use crate::render::{RenderResult, Renderer}; use crate::render::{RenderResult, Renderer};
use crate::ui::{MenuItem, MenuItemType, UIManager}; use crate::{
guard::InjectGuard,
ui::{MenuItem, MenuItemType, UIManager},
};
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use regex::Regex; use regex::Regex;
use std::cell::RefCell; use std::cell::RefCell;
@ -209,7 +212,7 @@ impl<
} }
// Block espanso from reinterpreting its own actions // Block espanso from reinterpreting its own actions
self.is_injecting.store(true, Release); let _inject_guard = InjectGuard::new(self.is_injecting.clone(), &config);
let char_count = if trailing_separator.is_none() { let char_count = if trailing_separator.is_none() {
m.triggers[trigger_offset].chars().count() as i32 m.triggers[trigger_offset].chars().count() as i32
@ -307,18 +310,6 @@ impl<
.set_clipboard(&previous_clipboard_content); .set_clipboard(&previous_clipboard_content);
} }
// On macOS, because the keyinjection is async, we need to wait a bit before
// giving back the control. Otherwise, the injected actions will be handled back
// by espanso itself.
if cfg!(target_os = "macos") {
std::thread::sleep(std::time::Duration::from_millis(
config.mac_post_inject_delay,
));
}
// Re-allow espanso to interpret actions
self.is_injecting.store(false, Release);
expansion_data expansion_data
} }
} }
@ -349,6 +340,9 @@ impl<
return; return;
} }
// Block espanso from reinterpreting its own actions
let _inject_guard = InjectGuard::new(self.is_injecting.clone(), &config);
let last_expansion_data = self.last_expansion_data.borrow(); let last_expansion_data = self.last_expansion_data.borrow();
if let Some(ref last_expansion_data) = *last_expansion_data { if let Some(ref last_expansion_data) = *last_expansion_data {
let (trigger_string, injected_text_len) = last_expansion_data; let (trigger_string, injected_text_len) = last_expansion_data;

View File

@ -61,7 +61,10 @@ impl super::Extension for FormExtension {
} }
if let Some(icon_path) = crate::context::get_icon_path() { if let Some(icon_path) = crate::context::get_icon_path() {
form_config.insert(Value::from("icon"), Value::from(icon_path.to_string_lossy().to_string())); form_config.insert(
Value::from("icon"),
Value::from(icon_path.to_string_lossy().to_string()),
);
} }
let serialized_config: String = let serialized_config: String =

39
src/guard.rs Normal file
View File

@ -0,0 +1,39 @@
use crate::config::Configs;
use log::debug;
use std::sync::atomic::Ordering::Release;
use std::sync::{atomic::AtomicBool, Arc};
pub struct InjectGuard {
is_injecting: Arc<AtomicBool>,
mac_post_inject_delay: u64,
}
impl InjectGuard {
pub fn new(is_injecting: Arc<AtomicBool>, config: &Configs) -> Self {
debug!("enabling inject guard");
// Enable the injecting block
is_injecting.store(true, Release);
Self {
is_injecting,
mac_post_inject_delay: config.mac_post_inject_delay,
}
}
}
impl Drop for InjectGuard {
fn drop(&mut self) {
debug!("releasing inject guard");
// On macOS, because the keyinjection is async, we need to wait a bit before
// giving back the control. Otherwise, the injected actions will be handled back
// by espanso itself.
if cfg!(target_os = "macos") {
std::thread::sleep(std::time::Duration::from_millis(self.mac_post_inject_delay));
}
// Re-allow espanso to interpret actions
self.is_injecting.store(false, Release);
}
}

View File

@ -63,6 +63,7 @@ mod edit;
mod engine; mod engine;
mod event; mod event;
mod extension; mod extension;
mod guard;
mod keyboard; mod keyboard;
mod matcher; mod matcher;
mod package; mod package;

View File

@ -71,7 +71,8 @@ impl ModuloManager {
if let Some(ref modulo_path) = self.modulo_path { if let Some(ref modulo_path) = self.modulo_path {
let mut command = Command::new(modulo_path); let mut command = Command::new(modulo_path);
command.args(args) command
.args(args)
.stdin(std::process::Stdio::piped()) .stdin(std::process::Stdio::piped())
.stdout(std::process::Stdio::piped()) .stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped()); .stderr(std::process::Stdio::piped());