mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-11-24 12:29:04 +08:00
Merge pull request #3966 from fufesou/fix/led_sync
Do not sync led, when Control, Shift, Alt, Tab, Enter are pressed
This commit is contained in:
commit
5a0f03eb0d
@ -1,3 +1,4 @@
|
||||
#![allow(dead_code)]
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731
|
||||
//
|
||||
// JP/KR mapping https://github.com/TigerVNC/tigervnc/blob/1a008c1380305648ab50f1d99e73439747e9d61d/vncviewer/win32.c#L267
|
||||
|
@ -1,3 +1,5 @@
|
||||
#[cfg(not(debug_assertions))]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use crate::platform::breakdown_callback;
|
||||
use hbb_common::log;
|
||||
#[cfg(not(debug_assertions))]
|
||||
|
@ -1372,32 +1372,48 @@ fn simulate_win2win_hotkey(code: u32, down: bool) {
|
||||
}
|
||||
|
||||
#[cfg(not(any(target_os = "windows", target_os = "linux")))]
|
||||
fn is_win_linux_meta_key(_evt: &KeyEvent) -> bool {
|
||||
fn skip_led_sync_control_key(_evt: &KeyEvent) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
// LockModesHandler should not be created when single meta is pressing and releasing.
|
||||
// Because the drop function may insert "CapsLock Click" and "NumLock Click", which breaks single meta click.
|
||||
// https://github.com/rustdesk/rustdesk/issues/3928#issuecomment-1496936687
|
||||
// https://github.com/rustdesk/rustdesk/issues/3928#issuecomment-1500415822
|
||||
// https://github.com/rustdesk/rustdesk/issues/3928#issuecomment-1500773473
|
||||
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
||||
fn skip_led_sync_control_key(key: &ControlKey) -> bool {
|
||||
[
|
||||
ControlKey::Control,
|
||||
ControlKey::Meta,
|
||||
ControlKey::Shift,
|
||||
ControlKey::Alt,
|
||||
ControlKey::Tab,
|
||||
ControlKey::Return,
|
||||
]
|
||||
.contains(key)
|
||||
}
|
||||
|
||||
#[cfg(not(any(target_os = "windows", target_os = "linux")))]
|
||||
fn skip_led_sync_rdev_key(_evt: &KeyEvent) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
||||
fn is_win_linux_meta_key(evt: &KeyEvent) -> bool {
|
||||
match evt.mode.unwrap() {
|
||||
KeyboardMode::Map | KeyboardMode::Translate => match &evt.union {
|
||||
Some(key_event::Union::ControlKey(ck)) => {
|
||||
return *ck == ControlKey::Meta.into();
|
||||
}
|
||||
Some(key_event::Union::Chr(code)) => {
|
||||
let key = crate::keycode_to_rdev_key(*code);
|
||||
return key == RdevKey::MetaLeft || key == RdevKey::MetaRight;
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
KeyboardMode::Legacy => match &evt.union {
|
||||
Some(key_event::Union::ControlKey(ck)) => {
|
||||
return *ck == ControlKey::Meta.into();
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
false
|
||||
fn skip_led_sync_rdev_key(key: &RdevKey) -> bool {
|
||||
[
|
||||
RdevKey::ControlLeft,
|
||||
RdevKey::ControlRight,
|
||||
RdevKey::MetaLeft,
|
||||
RdevKey::MetaRight,
|
||||
RdevKey::ShiftRight,
|
||||
RdevKey::ShiftRight,
|
||||
RdevKey::Alt,
|
||||
RdevKey::AltGr,
|
||||
RdevKey::Tab,
|
||||
RdevKey::Return,
|
||||
]
|
||||
.contains(key)
|
||||
}
|
||||
|
||||
pub fn handle_key_(evt: &KeyEvent) {
|
||||
@ -1405,20 +1421,24 @@ pub fn handle_key_(evt: &KeyEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
let _lock_mode_handler = match &evt.union {
|
||||
Some(key_event::Union::Unicode(..)) | Some(key_event::Union::Seq(..)) => {
|
||||
Some(LockModesHandler::new(&evt))
|
||||
let mut _lock_mode_handler = None;
|
||||
match (&evt.union, evt.mode.enum_value_or(KeyboardMode::Legacy)) {
|
||||
(Some(key_event::Union::Unicode(..)) | Some(key_event::Union::Seq(..)), _) => {
|
||||
_lock_mode_handler = Some(LockModesHandler::new(&evt));
|
||||
}
|
||||
_ => {
|
||||
// LockModesHandler should not be created when single meta is pressing and releasing.
|
||||
// Because the drop function may insert "CapsLock Click" and "NumLock Click", which breaks single meta click.
|
||||
// https://github.com/rustdesk/rustdesk/issues/3928#issuecomment-1496936687
|
||||
if evt.down && !is_win_linux_meta_key(evt) {
|
||||
Some(LockModesHandler::new(evt))
|
||||
} else {
|
||||
None
|
||||
(Some(key_event::Union::ControlKey(ck)), _) => {
|
||||
let key = ck.enum_value_or(ControlKey::Unknown);
|
||||
if !skip_led_sync_control_key(&key) {
|
||||
_lock_mode_handler = Some(LockModesHandler::new(&evt));
|
||||
}
|
||||
}
|
||||
(Some(key_event::Union::Chr(code)), KeyboardMode::Map | KeyboardMode::Translate) => {
|
||||
let key = crate::keycode_to_rdev_key(*code);
|
||||
if !skip_led_sync_rdev_key(&key) {
|
||||
_lock_mode_handler = Some(LockModesHandler::new(evt));
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
|
||||
match evt.mode.unwrap() {
|
||||
|
Loading…
Reference in New Issue
Block a user