fix(utils): use virtual key codes for cross-layout paste

This commit is contained in:
Vlad Gerasimov 2025-07-28 18:32:18 +04:00
parent e92f94573e
commit d252f8e1ae

View file

@ -16,27 +16,31 @@ use tauri::AppHandle;
use tauri::Manager; use tauri::Manager;
use tauri_plugin_clipboard_manager::ClipboardExt; use tauri_plugin_clipboard_manager::ClipboardExt;
/// Sends a paste command (Cmd+V or Ctrl+V) using platform-specific virtual key codes.
/// This ensures the paste works regardless of keyboard layout (e.g., Russian, AZERTY, DVORAK).
fn send_paste() -> Result<(), String> { fn send_paste() -> Result<(), String> {
// Determine the modifier key based on the OS // Platform-specific key definitions
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
let modifier_key = Key::Meta; // Command key on macOS let (modifier_key, v_key_code) = (Key::Meta, 9);
#[cfg(not(target_os = "macos"))] #[cfg(target_os = "windows")]
let modifier_key = Key::Control; // Control key on other systems let (modifier_key, v_key_code) = (Key::Control, 0x56); // VK_V
#[cfg(target_os = "linux")]
let (modifier_key, v_key_code) = (Key::Control, 47);
let mut enigo = Enigo::new(&Settings::default()) let mut enigo = Enigo::new(&Settings::default())
.map_err(|e| format!("Failed to initialize Enigo: {}", e))?; .map_err(|e| format!("Failed to initialize Enigo: {}", e))?;
// Press both keys // Press modifier + V
enigo enigo
.key(modifier_key, enigo::Direction::Press) .key(modifier_key, enigo::Direction::Press)
.map_err(|e| format!("Failed to press modifier key: {}", e))?; .map_err(|e| format!("Failed to press modifier key: {}", e))?;
enigo enigo
.key(Key::Unicode('v'), enigo::Direction::Press) .key(Key::Other(v_key_code), enigo::Direction::Press)
.map_err(|e| format!("Failed to press V key: {}", e))?; .map_err(|e| format!("Failed to press V key: {}", e))?;
// Release both keys // Release V + modifier (reverse order)
enigo enigo
.key(Key::Unicode('v'), enigo::Direction::Release) .key(Key::Other(v_key_code), enigo::Direction::Release)
.map_err(|e| format!("Failed to release V key: {}", e))?; .map_err(|e| format!("Failed to release V key: {}", e))?;
enigo enigo
.key(modifier_key, enigo::Direction::Release) .key(modifier_key, enigo::Direction::Release)