From 2f87826881e6e790f759a5ed81c19ea562a8b3ca Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Fri, 13 Sep 2019 23:05:01 +0200 Subject: [PATCH] Fix #12 --- native/liblinuxbridge/bridge.cpp | 12 ++++++++++++ native/liblinuxbridge/bridge.h | 5 +++++ src/bridge/linux.rs | 1 + src/keyboard/linux.rs | 12 ++++++++++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/native/liblinuxbridge/bridge.cpp b/native/liblinuxbridge/bridge.cpp index 4dfdb55..301618e 100644 --- a/native/liblinuxbridge/bridge.cpp +++ b/native/liblinuxbridge/bridge.cpp @@ -348,3 +348,15 @@ int32_t get_active_window_executable(char *buffer, int32_t size) { return 1; } + +int32_t is_current_window_terminal() { + char class_buffer[250]; + int res = get_active_window_class(class_buffer, 250); + if (res > 0) { + if (strstr(class_buffer, "terminal") != NULL) { + return 1; + } + } + + return 0; +} diff --git a/native/liblinuxbridge/bridge.h b/native/liblinuxbridge/bridge.h index 28be01c..4a57593 100644 --- a/native/liblinuxbridge/bridge.h +++ b/native/liblinuxbridge/bridge.h @@ -71,4 +71,9 @@ 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. + */ +extern "C" int32_t is_current_window_terminal(); + #endif //ESPANSO_BRIDGE_H diff --git a/src/bridge/linux.rs b/src/bridge/linux.rs index eedb760..3ca74b3 100644 --- a/src/bridge/linux.rs +++ b/src/bridge/linux.rs @@ -11,6 +11,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; // 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 6793162..57049aa 100644 --- a/src/keyboard/linux.rs +++ b/src/keyboard/linux.rs @@ -20,9 +20,17 @@ impl super::KeyboardManager for LinuxKeyboardManager { } fn trigger_paste(&self) { - unsafe { trigger_paste(); } + unsafe { + let is_terminal = is_current_window_terminal(); - // TODO: detect when in terminal and use trigger_terminal_paste() instead + // Terminals use a different keyboard combination to paste from clipboard, + // so we need to check the correct situation. + if is_terminal == 0 { + trigger_paste(); + }else{ + trigger_terminal_paste(); + } + } } fn delete_string(&self, count: i32) {