Improve robustness of passive mode with empty selections. Fix #213

This commit is contained in:
Federico Terzi 2020-04-03 19:38:59 +02:00
parent 30273c1f68
commit 4d91085321

View File

@ -288,7 +288,16 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
return; return;
} }
info!("Passive mode activated"); // Block espanso from reinterpreting its own actions
self.is_injecting.store(true, Release);
// In order to avoid pasting previous clipboard contents, we need to check if
// a new clipboard was effectively copied.
// See issue: https://github.com/federico-terzi/espanso/issues/213
let previous_clipboard = self.clipboard_manager.get_clipboard();
// Sleep for a while, giving time to effectively copy the text
std::thread::sleep(std::time::Duration::from_millis(100)); // TODO: avoid hardcoding
// Trigger a copy shortcut to transfer the content of the selection to the clipboard // Trigger a copy shortcut to transfer the content of the selection to the clipboard
self.keyboard_manager.trigger_copy(); self.keyboard_manager.trigger_copy();
@ -300,22 +309,39 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa
let clipboard = self.clipboard_manager.get_clipboard(); let clipboard = self.clipboard_manager.get_clipboard();
if let Some(clipboard) = clipboard { if let Some(clipboard) = clipboard {
let rendered = self.renderer.render_passive(&clipboard, // Don't expand empty clipboards, as usually they are the result of an empty passive selection
&config); if clipboard.trim().is_empty() {
info!("Avoiding passive expansion, as the user didn't select anything");
}else{
if let Some(previous_content) = previous_clipboard {
// Because of issue #213, we need to make sure the user selected something.
if clipboard == previous_content {
info!("Avoiding passive expansion, as the user didn't select anything");
} else {
info!("Passive mode activated");
match rendered { let rendered = self.renderer.render_passive(&clipboard,
RenderResult::Text(payload) => { &config);
// Paste back the result in the field
self.clipboard_manager.set_clipboard(&payload);
std::thread::sleep(std::time::Duration::from_millis(100)); // TODO: avoid hardcoding match rendered {
self.keyboard_manager.trigger_paste(&config.paste_shortcut); RenderResult::Text(payload) => {
}, // Paste back the result in the field
_ => { self.clipboard_manager.set_clipboard(&payload);
warn!("Cannot expand passive match")
}, std::thread::sleep(std::time::Duration::from_millis(100)); // TODO: avoid hardcoding
self.keyboard_manager.trigger_paste(&config.paste_shortcut);
},
_ => {
warn!("Cannot expand passive match")
},
}
}
}
} }
} }
// Re-allow espanso to interpret actions
self.is_injecting.store(false, Release);
} }
} }