* fix: keyboard, linux, repeat keys, #6793 Signed-off-by: fufesou <linlong1266@gmail.com> * fix: keyboard, linux->linux, may also repeat keys with bad network Signed-off-by: fufesou <linlong1266@gmail.com> --------- Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
		
							parent
							
								
									6ad662260e
								
							
						
					
					
						commit
						cf8ef2533a
					
				| @ -580,10 +580,7 @@ pub fn event_to_key_events( | |||||||
|     #[cfg(any(target_os = "android", target_os = "ios"))] |     #[cfg(any(target_os = "android", target_os = "ios"))] | ||||||
|     let key_events; |     let key_events; | ||||||
|     key_events = match keyboard_mode { |     key_events = match keyboard_mode { | ||||||
|         KeyboardMode::Map => match map_keyboard_mode(peer.as_str(), event, key_event) { |         KeyboardMode::Map => map_keyboard_mode(peer.as_str(), event, key_event), | ||||||
|             Some(event) => [event].to_vec(), |  | ||||||
|             None => Vec::new(), |  | ||||||
|         }, |  | ||||||
|         KeyboardMode::Translate => translate_keyboard_mode(peer.as_str(), event, key_event), |         KeyboardMode::Translate => translate_keyboard_mode(peer.as_str(), event, key_event), | ||||||
|         _ => { |         _ => { | ||||||
|             #[cfg(not(any(target_os = "android", target_os = "ios")))] |             #[cfg(not(any(target_os = "android", target_os = "ios")))] | ||||||
| @ -865,7 +862,27 @@ pub fn legacy_keyboard_mode(event: &Event, mut key_event: KeyEvent) -> Vec<KeyEv | |||||||
|     events |     events | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn map_keyboard_mode(_peer: &str, event: &Event, mut key_event: KeyEvent) -> Option<KeyEvent> { | pub fn map_keyboard_mode(_peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> { | ||||||
|  |     match _map_keyboard_mode(_peer, event, key_event) { | ||||||
|  |         Some(key_event) => { | ||||||
|  |             if _peer == OS_LOWER_LINUX { | ||||||
|  |                 if let EventType::KeyPress(k) = &event.event_type { | ||||||
|  |                     #[cfg(target_os = "ios")] | ||||||
|  |                     let try_workaround = true; | ||||||
|  |                     #[cfg(not(target_os = "ios"))] | ||||||
|  |                     let try_workaround = !is_modifier(k); | ||||||
|  |                     if try_workaround { | ||||||
|  |                         return try_workaround_linux_long_press(key_event); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             vec![key_event] | ||||||
|  |         } | ||||||
|  |         None => Vec::new(), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn _map_keyboard_mode(_peer: &str, event: &Event, mut key_event: KeyEvent) -> Option<KeyEvent> { | ||||||
|     match event.event_type { |     match event.event_type { | ||||||
|         EventType::KeyPress(..) => { |         EventType::KeyPress(..) => { | ||||||
|             key_event.down = true; |             key_event.down = true; | ||||||
| @ -923,6 +940,14 @@ pub fn map_keyboard_mode(_peer: &str, event: &Event, mut key_event: KeyEvent) -> | |||||||
|     Some(key_event) |     Some(key_event) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // https://github.com/rustdesk/rustdesk/issues/6793
 | ||||||
|  | #[inline] | ||||||
|  | fn try_workaround_linux_long_press(key_event: KeyEvent) -> Vec<KeyEvent> { | ||||||
|  |     let mut key_event_up = key_event.clone(); | ||||||
|  |     key_event_up.down = false; | ||||||
|  |     vec![key_event, key_event_up] | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[cfg(not(any(target_os = "ios")))] | #[cfg(not(any(target_os = "ios")))] | ||||||
| fn try_fill_unicode(_peer: &str, event: &Event, key_event: &KeyEvent, events: &mut Vec<KeyEvent>) { | fn try_fill_unicode(_peer: &str, event: &Event, key_event: &KeyEvent, events: &mut Vec<KeyEvent>) { | ||||||
|     match &event.unicode { |     match &event.unicode { | ||||||
| @ -954,7 +979,7 @@ fn try_fill_unicode(_peer: &str, event: &Event, key_event: &KeyEvent, events: &m | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[cfg(target_os = "windows")] | #[cfg(target_os = "windows")] | ||||||
| fn try_file_win2win_hotkey( | fn try_fill_win2win_hotkey( | ||||||
|     peer: &str, |     peer: &str, | ||||||
|     event: &Event, |     event: &Event, | ||||||
|     key_event: &KeyEvent, |     key_event: &KeyEvent, | ||||||
| @ -1041,9 +1066,7 @@ pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) - | |||||||
| 
 | 
 | ||||||
|     #[cfg(not(any(target_os = "android", target_os = "ios")))] |     #[cfg(not(any(target_os = "android", target_os = "ios")))] | ||||||
|     if is_numpad_key(&event) { |     if is_numpad_key(&event) { | ||||||
|         if let Some(evt) = map_keyboard_mode(peer, event, key_event) { |         events.append(&mut map_keyboard_mode(peer, event, key_event)); | ||||||
|             events.push(evt); |  | ||||||
|         } |  | ||||||
|         return events; |         return events; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1064,7 +1087,7 @@ pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) - | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[cfg(target_os = "windows")] |     #[cfg(target_os = "windows")] | ||||||
|     try_file_win2win_hotkey(peer, event, &key_event, &mut events); |     try_fill_win2win_hotkey(peer, event, &key_event, &mut events); | ||||||
| 
 | 
 | ||||||
|     #[cfg(any(target_os = "linux", target_os = "windows"))] |     #[cfg(any(target_os = "linux", target_os = "windows"))] | ||||||
|     if events.is_empty() && is_press(event) { |     if events.is_empty() && is_press(event) { | ||||||
| @ -1085,9 +1108,7 @@ pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) - | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if events.is_empty() { |     if events.is_empty() { | ||||||
|         if let Some(evt) = map_keyboard_mode(peer, event, key_event) { |         events.append(&mut map_keyboard_mode(peer, event, key_event)); | ||||||
|             events.push(evt); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|     events |     events | ||||||
| } | } | ||||||
|  | |||||||
| @ -405,7 +405,6 @@ pub mod amyuni_idd { | |||||||
|     use crate::platform::win_device; |     use crate::platform::win_device; | ||||||
|     use hbb_common::{bail, lazy_static, log, tokio::time::Instant, ResultType}; |     use hbb_common::{bail, lazy_static, log, tokio::time::Instant, ResultType}; | ||||||
|     use std::{ |     use std::{ | ||||||
|         ops::Sub, |  | ||||||
|         ptr::null_mut, |         ptr::null_mut, | ||||||
|         sync::{Arc, Mutex}, |         sync::{Arc, Mutex}, | ||||||
|         time::Duration, |         time::Duration, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user