Fix #418
This commit is contained in:
parent
56f1d02d23
commit
270b603e8f
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
39
src/guard.rs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Reference in New Issue
Block a user