mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-07-10 17:25:09 +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]]
|
[[package]]
|
||||||
name = "rdev"
|
name = "rdev"
|
||||||
version = "0.5.0-2"
|
version = "0.5.0-2"
|
||||||
source = "git+https://github.com/rustdesk-org/rdev#f9b60b1dd0f3300a1b797d7a74c116683cd232c8"
|
source = "git+https://github.com/rustdesk-org/rdev#871bf1c856d6a30af2f56ab8848396a025140855"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cocoa 0.24.1",
|
"cocoa 0.24.1",
|
||||||
"core-foundation 0.9.4",
|
"core-foundation 0.9.4",
|
||||||
|
|||||||
@@ -1245,11 +1245,49 @@ pub fn legacy_keyboard_mode(event: &Event, mut key_event: KeyEvent) -> Vec<KeyEv
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn map_keyboard_mode(_peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> {
|
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_keyboard_mode(_peer, event, key_event)
|
||||||
.map(|e| vec![e])
|
.map(|e| vec![e])
|
||||||
.unwrap_or_default()
|
.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> {
|
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(..) => {
|
||||||
@@ -1421,6 +1459,11 @@ fn is_press(event: &Event) -> bool {
|
|||||||
pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> {
|
pub fn translate_keyboard_mode(peer: &str, event: &Event, key_event: KeyEvent) -> Vec<KeyEvent> {
|
||||||
let mut events: Vec<KeyEvent> = Vec::new();
|
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 let Some(unicode_info) = &event.unicode {
|
||||||
if unicode_info.is_dead {
|
if unicode_info.is_dead {
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
|
|||||||
Reference in New Issue
Block a user