mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-06-25 17:54:55 +03:00
fix(keyboard): win, key, Pause (#15351)
Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -6920,7 +6920,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "rdev"
|
||||
version = "0.5.0-2"
|
||||
source = "git+https://github.com/rustdesk-org/rdev#f9b60b1dd0f3300a1b797d7a74c116683cd232c8"
|
||||
source = "git+https://github.com/rustdesk-org/rdev#871bf1c856d6a30af2f56ab8848396a025140855"
|
||||
dependencies = [
|
||||
"cocoa 0.24.1",
|
||||
"core-foundation 0.9.4",
|
||||
|
||||
@@ -1245,11 +1245,49 @@ pub fn legacy_keyboard_mode(event: &Event, mut key_event: KeyEvent) -> Vec<KeyEv
|
||||
|
||||
#[inline]
|
||||
pub fn map_keyboard_mode(_peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> {
|
||||
if let Some(evt) = windows_peer_special_key(_peer, event) {
|
||||
return vec![evt];
|
||||
}
|
||||
|
||||
_map_keyboard_mode(_peer, event, key_event)
|
||||
.map(|e| vec![e])
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
fn windows_peer_special_key(peer: &str, event: &Event) -> Option<KeyEvent> {
|
||||
if peer != OS_LOWER_WINDOWS {
|
||||
return None;
|
||||
}
|
||||
|
||||
let (key, down) = match event.event_type {
|
||||
EventType::KeyPress(key) => (key, true),
|
||||
EventType::KeyRelease(key) => (key, false),
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
// Handle only `Pause` for Windows peers for now.
|
||||
// Windows has no normal scan code for `Pause`, so send it as a legacy control key.
|
||||
#[cfg(target_os = "windows")]
|
||||
let is_pause = {
|
||||
// The Windows scan code can look like `NumLock`; VK_PAUSE distinguishes it.
|
||||
let pause_vk_code = rdev::win_code_from_key(Key::Pause);
|
||||
key == Key::Pause || pause_vk_code == Some(event.platform_code as _)
|
||||
};
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
let is_pause = key == Key::Pause;
|
||||
if !is_pause {
|
||||
return None;
|
||||
}
|
||||
|
||||
let mut key_event = KeyEvent::new();
|
||||
key_event.mode = KeyboardMode::Legacy.into();
|
||||
key_event.down = down;
|
||||
key_event.set_control_key(ControlKey::Pause);
|
||||
let (alt, ctrl, shift, command) = client::get_modifiers_state(false, false, false, false);
|
||||
client::legacy_modifiers(&mut key_event, alt, ctrl, shift, command);
|
||||
Some(key_event)
|
||||
}
|
||||
|
||||
fn _map_keyboard_mode(_peer: &str, event: &Event, mut key_event: KeyEvent) -> Option<KeyEvent> {
|
||||
match event.event_type {
|
||||
EventType::KeyPress(..) => {
|
||||
@@ -1421,6 +1459,11 @@ fn is_press(event: &Event) -> bool {
|
||||
pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> {
|
||||
let mut events: Vec<KeyEvent> = Vec::new();
|
||||
|
||||
if let Some(evt) = windows_peer_special_key(peer, event) {
|
||||
events.push(evt);
|
||||
return events;
|
||||
}
|
||||
|
||||
if let Some(unicode_info) = &event.unicode {
|
||||
if unicode_info.is_dead {
|
||||
#[cfg(target_os = "macos")]
|
||||
|
||||
Reference in New Issue
Block a user