Add Auto backend to automatically switch between Inject and Clipboard on Linux based on match content
This commit is contained in:
		
							parent
							
								
									3221b41d01
								
							
						
					
					
						commit
						23095d4394
					
				|  | @ -198,7 +198,20 @@ impl Configs { | ||||||
| #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||||||
| pub enum BackendType { | pub enum BackendType { | ||||||
|     Inject, |     Inject, | ||||||
|     Clipboard |     Clipboard, | ||||||
|  | 
 | ||||||
|  |     // On Linux systems there is a long standing issue with text injection (which
 | ||||||
|  |     // in general is better than Clipboard copy/pasting) that prevents certain
 | ||||||
|  |     // apps from correctly handling special characters (such as emojis or accented letters)
 | ||||||
|  |     // when injected. For this reason, espanso initially defaulted on the Clipboard
 | ||||||
|  |     // backend on Linux, as it was the most reliable (working in 99% of cases),
 | ||||||
|  |     // even though it was less efficient and with a few inconveniences (for example, the
 | ||||||
|  |     // previous clipboard content being overwritten).
 | ||||||
|  |     // The Auto backend tries to take it a step further, by automatically determining
 | ||||||
|  |     // when an injection is possible (only ascii characters in the replacement), and falling
 | ||||||
|  |     // back to the Clipboard backend otherwise.
 | ||||||
|  |     // Should only be used on Linux systems.
 | ||||||
|  |     Auto | ||||||
| } | } | ||||||
| impl Default for BackendType { | impl Default for BackendType { | ||||||
|     // The default backend varies based on the operating system.
 |     // The default backend varies based on the operating system.
 | ||||||
|  |  | ||||||
|  | @ -189,7 +189,25 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa | ||||||
|                     None |                     None | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 match config.backend { |                 let backend = if config.backend == BackendType::Auto { | ||||||
|  |                     if cfg!(target_os = "linux") { | ||||||
|  |                         let all_ascii = target_string.chars().all(|c| c.is_ascii()); | ||||||
|  |                         if all_ascii { | ||||||
|  |                             debug!("All elements of the replacement are ascii, using Inject backend"); | ||||||
|  |                             &BackendType::Inject | ||||||
|  |                         }else{ | ||||||
|  |                             debug!("There are non-ascii characters, using Clipboard backend"); | ||||||
|  |                             &BackendType::Clipboard | ||||||
|  |                         } | ||||||
|  |                     }else{ | ||||||
|  |                         warn!("Using Auto backend is only supported on Linux, falling back to Inject backend."); | ||||||
|  |                         &BackendType::Inject | ||||||
|  |                     } | ||||||
|  |                 }else{ | ||||||
|  |                     &config.backend | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 match backend { | ||||||
|                     BackendType::Inject => { |                     BackendType::Inject => { | ||||||
|                         // Send the expected string. On linux, newlines are managed automatically
 |                         // Send the expected string. On linux, newlines are managed automatically
 | ||||||
|                         // while on windows and macos, we need to emulate a Enter key press.
 |                         // while on windows and macos, we need to emulate a Enter key press.
 | ||||||
|  | @ -217,6 +235,10 @@ impl <'a, S: KeyboardManager, C: ClipboardManager, M: ConfigManager<'a>, U: UIMa | ||||||
|                         self.clipboard_manager.set_clipboard(&target_string); |                         self.clipboard_manager.set_clipboard(&target_string); | ||||||
|                         self.keyboard_manager.trigger_paste(&config.paste_shortcut); |                         self.keyboard_manager.trigger_paste(&config.paste_shortcut); | ||||||
|                     }, |                     }, | ||||||
|  |                     _ => { | ||||||
|  |                         error!("Unsupported backend type evaluation."); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if let Some(moves) = cursor_rewind { |                 if let Some(moves) = cursor_rewind { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user