From db2ff8c6ca8bf1e5a75cb8f7a65ddee3a4b5d1fa Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Fri, 13 Dec 2019 22:05:56 +0100 Subject: [PATCH] Fix bug that prevented espanso from working with Emacs #122 --- native/liblinuxbridge/bridge.cpp | 4 +++- native/liblinuxbridge/bridge.h | 4 ++-- src/bridge/linux.rs | 2 +- src/keyboard/linux.rs | 8 +++++--- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/native/liblinuxbridge/bridge.cpp b/native/liblinuxbridge/bridge.cpp index 6e4e5b3..a34661a 100644 --- a/native/liblinuxbridge/bridge.cpp +++ b/native/liblinuxbridge/bridge.cpp @@ -453,7 +453,7 @@ int32_t get_active_window_executable(char *buffer, int32_t size) { return result; } -int32_t is_current_window_terminal() { +int32_t is_current_window_special() { char class_buffer[250]; int res = get_active_window_class(class_buffer, 250); if (res > 0) { @@ -477,6 +477,8 @@ int32_t is_current_window_terminal() { return 1; }else if (strstr(class_buffer, "Alacritty") != NULL) { // Alacritty terminal return 1; + }else if (strstr(class_buffer, "Emacs") != NULL) { // Emacs + return 3; } } diff --git a/native/liblinuxbridge/bridge.h b/native/liblinuxbridge/bridge.h index ce55253..6e921bf 100644 --- a/native/liblinuxbridge/bridge.h +++ b/native/liblinuxbridge/bridge.h @@ -111,8 +111,8 @@ extern "C" int32_t get_active_window_class(char * buffer, int32_t size); extern "C" int32_t get_active_window_executable(char * buffer, int32_t size); /* - * Return 1 if the current window is a terminal window, 0 otherwise. + * Return a value greater than 0 if the current window needs a special paste combination, 0 otherwise. */ -extern "C" int32_t is_current_window_terminal(); +extern "C" int32_t is_current_window_special(); #endif //ESPANSO_BRIDGE_H diff --git a/src/bridge/linux.rs b/src/bridge/linux.rs index ab609c2..90edfc6 100644 --- a/src/bridge/linux.rs +++ b/src/bridge/linux.rs @@ -31,7 +31,7 @@ extern { pub fn get_active_window_name(buffer: *mut c_char, size: i32) -> i32; pub fn get_active_window_class(buffer: *mut c_char, size: i32) -> i32; pub fn get_active_window_executable(buffer: *mut c_char, size: i32) -> i32; - pub fn is_current_window_terminal() -> i32; + pub fn is_current_window_special() -> i32; // Keyboard pub fn register_keypress_callback(cb: extern fn(_self: *mut c_void, *const u8, diff --git a/src/keyboard/linux.rs b/src/keyboard/linux.rs index 2074970..538c375 100644 --- a/src/keyboard/linux.rs +++ b/src/keyboard/linux.rs @@ -42,14 +42,16 @@ impl super::KeyboardManager for LinuxKeyboardManager { unsafe { match shortcut { PasteShortcut::Default => { - let is_terminal = is_current_window_terminal(); + let is_special = is_current_window_special(); // Terminals use a different keyboard combination to paste from clipboard, // so we need to check the correct situation. - if is_terminal == 0 { + if is_special == 0 { trigger_paste(); - }else if is_terminal == 2 { // Special case for stterm + }else if is_special == 2 { // Special case for stterm trigger_alt_shift_ins_paste(); + }else if is_special == 3 { // Special case for Emacs + trigger_shift_ins_paste(); }else{ trigger_terminal_paste(); }