From 9ded8d6ab24779db3c9334f5a3d6a652b8425c4f Mon Sep 17 00:00:00 2001 From: fufesou Date: Sat, 20 Jun 2026 21:11:19 +0800 Subject: [PATCH] fix(keyboard): win, key, Pause (#15351) Signed-off-by: fufesou --- Cargo.lock | 2 +- src/keyboard.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e44cc014a..46edd8db0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6920,7 +6920,7 @@ dependencies = [ [[package]] name = "rdev" version = "0.5.0-2" -source = "git+https://github.com/rustdesk-org/rdev#f9b60b1dd0f3300a1b797d7a74c116683cd232c8" +source = "git+https://github.com/rustdesk-org/rdev#871bf1c856d6a30af2f56ab8848396a025140855" dependencies = [ "cocoa 0.24.1", "core-foundation 0.9.4", diff --git a/src/keyboard.rs b/src/keyboard.rs index b9cf4da2d..e0466970e 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -1245,11 +1245,49 @@ pub fn legacy_keyboard_mode(event: &Event, mut key_event: KeyEvent) -> Vec Vec { + if let Some(evt) = windows_peer_special_key(_peer, event) { + return vec![evt]; + } + _map_keyboard_mode(_peer, event, key_event) .map(|e| vec![e]) .unwrap_or_default() } +fn windows_peer_special_key(peer: &str, event: &Event) -> Option { + if peer != OS_LOWER_WINDOWS { + return None; + } + + let (key, down) = match event.event_type { + EventType::KeyPress(key) => (key, true), + EventType::KeyRelease(key) => (key, false), + _ => return None, + }; + + // Handle only `Pause` for Windows peers for now. + // Windows has no normal scan code for `Pause`, so send it as a legacy control key. + #[cfg(target_os = "windows")] + let is_pause = { + // The Windows scan code can look like `NumLock`; VK_PAUSE distinguishes it. + let pause_vk_code = rdev::win_code_from_key(Key::Pause); + key == Key::Pause || pause_vk_code == Some(event.platform_code as _) + }; + #[cfg(not(target_os = "windows"))] + let is_pause = key == Key::Pause; + if !is_pause { + return None; + } + + let mut key_event = KeyEvent::new(); + key_event.mode = KeyboardMode::Legacy.into(); + key_event.down = down; + key_event.set_control_key(ControlKey::Pause); + let (alt, ctrl, shift, command) = client::get_modifiers_state(false, false, false, false); + client::legacy_modifiers(&mut key_event, alt, ctrl, shift, command); + Some(key_event) +} + fn _map_keyboard_mode(_peer: &str, event: &Event, mut key_event: KeyEvent) -> Option { match event.event_type { EventType::KeyPress(..) => { @@ -1421,6 +1459,11 @@ fn is_press(event: &Event) -> bool { pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec { let mut events: Vec = Vec::new(); + if let Some(evt) = windows_peer_special_key(peer, event) { + events.push(evt); + return events; + } + if let Some(unicode_info) = &event.unicode { if unicode_info.is_dead { #[cfg(target_os = "macos")]