From dbe151609638571a76073e831d79aa6ae0c884c0 Mon Sep 17 00:00:00 2001 From: chiehw Date: Fri, 24 Mar 2023 21:51:56 +0800 Subject: [PATCH 1/3] Simulate char in win --- src/server/input_service.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 797488845..b362c8d30 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -1233,16 +1233,23 @@ fn translate_keyboard_mode(evt: &KeyEvent) { // remote: Shift + 1 => 1 let mut en = ENIGO.lock().unwrap(); - #[cfg(target_os = "linux")] + #[cfg(target_os = "macos")] + en.key_sequence(seq); + #[cfg(any(target_os = "linux", target_os = "windows"))] { - simulate_(&EventType::KeyRelease(RdevKey::ShiftLeft)); - simulate_(&EventType::KeyRelease(RdevKey::ShiftRight)); + if get_modifier_state(Key::Shift, &mut en) { + simulate_(&EventType::KeyRelease(RdevKey::ShiftLeft)); + } + if get_modifier_state(Key::RightShift, &mut en) { + simulate_(&EventType::KeyRelease(RdevKey::ShiftRight)); + } for chr in seq.chars() { + #[cfg(target_os = "windows")] + rdev::simulate_char(chr).ok(); + #[cfg(target_os = "linux")] en.key_click(Key::Layout(chr)); } } - #[cfg(not(target_os = "linux"))] - en.key_sequence(seq); } Some(key_event::Union::Chr(..)) => { #[cfg(target_os = "windows")] From 82a7554be13343bb00d825dd1ef92429d1fff4d9 Mon Sep 17 00:00:00 2001 From: chiehw Date: Sun, 26 Mar 2023 07:52:05 +0800 Subject: [PATCH 2/3] Send key instead of char in numpad --- src/keyboard.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/keyboard.rs b/src/keyboard.rs index dd0fae615..b82290605 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -892,6 +892,15 @@ fn is_press(event: &Event) -> bool { matches!(event.event_type, EventType::KeyPress(_)) } +fn is_numpad_key(event: &Event) -> bool { + matches!(event.event_type, EventType::KeyPress(key) | EventType::KeyRelease(key) if match key { + Key::Kp0 | Key::Kp1 | Key::Kp2 | Key::Kp3| Key::Kp4| Key::Kp5| Key::Kp6| + Key::Kp7| Key::Kp8| Key::Kp9 | Key::KpMinus | Key::KpMultiply | + Key::KpDivide | Key::KpPlus | Key::KpDecimal => true, + _ => false + }) +} + pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec { let mut events: Vec = Vec::new(); if let Some(unicode_info) = &event.unicode { @@ -907,6 +916,12 @@ pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) - return events; } } + if is_numpad_key(&event) { + if let Some(evt) = translate_key_code(peer, event, key_event) { + events.push(evt); + } + return events; + } #[cfg(target_os = "macos")] // ignore right option key From 77125b7a98a722f7015148cee4771e3d716940c1 Mon Sep 17 00:00:00 2001 From: asur4s Date: Sun, 26 Mar 2023 06:08:58 -0700 Subject: [PATCH 3/3] fix conflict --- src/keyboard.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/keyboard.rs b/src/keyboard.rs index b82290605..40de9b5df 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -10,7 +10,9 @@ use crate::ui::CUR_SESSION; #[cfg(not(any(target_os = "android", target_os = "ios")))] use hbb_common::log; use hbb_common::message_proto::*; -use rdev::{Event, EventType, Key, KeyCode}; +#[cfg(any(target_os = "windows", target_os = "macos"))] +use rdev::KeyCode; +use rdev::{Event, EventType, Key}; #[cfg(any(target_os = "windows", target_os = "macos"))] use std::sync::atomic::{AtomicBool, Ordering}; use std::{ @@ -892,15 +894,6 @@ fn is_press(event: &Event) -> bool { matches!(event.event_type, EventType::KeyPress(_)) } -fn is_numpad_key(event: &Event) -> bool { - matches!(event.event_type, EventType::KeyPress(key) | EventType::KeyRelease(key) if match key { - Key::Kp0 | Key::Kp1 | Key::Kp2 | Key::Kp3| Key::Kp4| Key::Kp5| Key::Kp6| - Key::Kp7| Key::Kp8| Key::Kp9 | Key::KpMinus | Key::KpMultiply | - Key::KpDivide | Key::KpPlus | Key::KpDecimal => true, - _ => false - }) -} - pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec { let mut events: Vec = Vec::new(); if let Some(unicode_info) = &event.unicode {