From 885d8a45864c2756e209354abe0ae82f8d6539f6 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Fri, 24 Dec 2021 00:27:27 +0800 Subject: [PATCH] https://github.com/rustdesk/rustdesk/issues/332 --- src/server/input_service.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 056267c5b..ba34772a5 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -195,15 +195,20 @@ fn modifier_sleep() { std::thread::sleep(std::time::Duration::from_nanos(1)); } -#[cfg(not(target_os = "macos"))] #[inline] fn get_modifier_state(key: Key, en: &mut Enigo) -> bool { + // on Linux, if RightAlt is down, RightAlt status is false, Alt status is true + // but on Windows, both are true let x = en.get_key_state(key.clone()); match key { Key::Shift => x || en.get_key_state(Key::RightShift), Key::Control => x || en.get_key_state(Key::RightControl), Key::Alt => x || en.get_key_state(Key::RightAlt), Key::Meta => x || en.get_key_state(Key::RWin), + Key::RightShift => x || en.get_key_state(Key::Shift), + Key::RightControl => x || en.get_key_state(Key::Control), + Key::RightAlt => x || en.get_key_state(Key::Alt), + Key::RWin => x || en.get_key_state(Key::Meta), _ => x, } } @@ -262,7 +267,7 @@ fn fix_key_down_timeout(force: bool) { if let Some(key) = key { let func = move || { let mut en = ENIGO.lock().unwrap(); - if en.get_key_state(key) { + if get_modifier_state(key, &mut en) { en.key_up(key); log::debug!("Fixed {:?} timeout", key); } @@ -284,7 +289,7 @@ fn fix_modifier( key1: Key, en: &mut Enigo, ) { - if en.get_key_state(key1) && !modifiers.contains(&ProtobufEnumOrUnknown::new(key0)) { + if get_modifier_state(key1, en) && !modifiers.contains(&ProtobufEnumOrUnknown::new(key0)) { en.key_up(key1); log::debug!("Fixed {:?}", key1); }