diff --git a/Cargo.lock b/Cargo.lock index f40582eb7..2b220c15d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4305,7 +4305,7 @@ dependencies = [ [[package]] name = "rdev" version = "0.5.0-2" -source = "git+https://github.com/asur4s/rdev#3d6d413a9b2ab703edc22071acea31826b0efce3" +source = "git+https://github.com/asur4s/rdev#18bb9dd64563fc9761005bb39ff830e6402e326e" dependencies = [ "cocoa", "core-foundation 0.9.3", @@ -4316,6 +4316,7 @@ dependencies = [ "inotify", "lazy_static", "libc", + "log", "mio 0.8.5", "strum 0.24.1", "strum_macros 0.24.3", diff --git a/src/keyboard.rs b/src/keyboard.rs index 99e1c1455..eb7e91a37 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -610,11 +610,26 @@ pub fn map_keyboard_mode(event: &Event, key_event: &mut KeyEvent) { } _ => return, }; - let keycode: u32 = match peer.as_str() { - "windows" => rdev::win_keycode_from_key(key).unwrap_or_default().into(), + + #[cfg(target_os = "windows")] + let keycode = match peer.as_str() { + "windows" => event.scan_code, "macos" => rdev::macos_keycode_from_key(key).unwrap_or_default().into(), _ => rdev::linux_keycode_from_key(key).unwrap_or_default().into(), }; + #[cfg(target_os = "macos")] + let keycode = match peer.as_str() { + "windows" => rdev::win_scancode_from_key(key).unwrap_or_default().into(), + "macos" => rdev::macos_keycode_from_key(key).unwrap_or_default().into(), + _ => event.code, + }; + #[cfg(target_os = "linux")] + let keycode = match peer.as_str() { + "windows" => rdev::win_scancode_from_key(key).unwrap_or_default().into(), + "macos" => event.code, + _ => rdev::linux_keycode_from_key(key).unwrap_or_default().into(), + }; + key_event.set_chr(keycode); } diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 66d2b0414..d47cacf4a 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -5,7 +5,7 @@ use crate::common::IS_X11; use dispatch::Queue; use enigo::{Enigo, Key, KeyboardControllable, MouseButton, MouseControllable}; use hbb_common::{config::COMPRESS_LEVEL, get_time, protobuf::EnumOrUnknown}; -use rdev::{simulate, EventType, Key as RdevKey}; +use rdev::{self, simulate, EventType, Key as RdevKey, RawKey}; use std::time::Duration; use std::{ convert::TryFrom, @@ -686,6 +686,20 @@ pub fn handle_key(evt: &KeyEvent) { handle_key_(evt); } +fn sim_rdev_rawkey(code: u32, down_or_up: bool) { + #[cfg(target_os = "windows")] + let rawkey = RawKey::ScanCode(code); + #[cfg(target_os = "linux")] + let rawkey = RawKey::LinuxXorgKeycode(code); + // to-do: test android + #[cfg(target_os = "android")] + let rawkey = RawKey::LinuxConsoleKeycode(code); + #[cfg(target_os = "macos")] + let rawkey = RawKey::MacVirtualKeycode(code); + + rdev_key_down_or_up(RdevKey::RawKey(rawkey), down_or_up); +} + fn rdev_key_down_or_up(key: RdevKey, down_or_up: bool) { let event_type = match down_or_up { true => EventType::KeyPress(key), @@ -821,8 +835,7 @@ fn map_keyboard_mode(evt: &KeyEvent) { return; } - rdev_key_down_or_up(RdevKey::Unknown(evt.chr()), evt.down); - return; + sim_rdev_rawkey(evt.chr(), evt.down); } #[cfg(target_os = "macos")]