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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user