diff --git a/src/server/connection.rs b/src/server/connection.rs index 802e36a4a..e5a00d1c3 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1071,8 +1071,7 @@ impl Connection { } log::info!("#{} Connection closed: {}", self.inner.id(), reason); if lock && self.lock_after_session_end && self.keyboard { - crate::platform::lock_screen(); - super::video_service::switch_to_primary(); + lock_screen(); } self.tx_to_cm.send(ipc::Data::Close).ok(); self.port_forward_socket.take(); diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 7936bcc7a..3f6ea2907 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -439,6 +439,39 @@ pub fn is_enter(evt: &KeyEvent) -> bool { return false; } +pub fn lock_screen() { + cfg_if::cfg_if! { + if #[cfg(target_os = "linux")] { + // xdg_screensaver lock not work on Linux from our service somehow + // loginctl lock-session also not work, they both work run rustdesk from cmd + std::thread::spawn(|| { + let mut key_event = KeyEvent::new(); + key_event.down = true; + key_event.set_chr('l' as _); + key_event.modifiers.push(ControlKey::Meta.into()); + handle_key(&key_event); + key_event.down = false; + handle_key(&key_event); + }); + } else if #[cfg(target_os = "macos")] { + // CGSession -suspend not real lock screen, it is user switch + std::thread::spawn(|| { + let mut key_event = KeyEvent::new(); + key_event.down = true; + key_event.set_chr('q' as _); + key_event.modifiers.push(ControlKey::Meta.into()); + key_event.modifiers.push(ControlKey::Control.into()); + handle_key(&key_event); + key_event.down = false; + handle_key(&key_event); + }); + } else { + crate::platform::lock_screen(); + } + } + super::video_service::switch_to_primary(); +} + lazy_static::lazy_static! { static ref KEY_MAP: HashMap = [ @@ -646,8 +679,7 @@ fn handle_key_(evt: &KeyEvent) { allow_err!(send_sas()); }); } else if ck.value() == ControlKey::LockScreen.value() { - crate::platform::lock_screen(); - super::video_service::switch_to_primary(); + lock_screen(); } } Some(key_event::Union::chr(chr)) => {