From 42e897179315a91f1d60807ae616e1e167678e42 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 5 Jun 2023 22:18:59 +0800 Subject: [PATCH 1/4] enable virtual display if only one dummy display Signed-off-by: fufesou --- src/server/video_service.rs | 39 ++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 015f0e9bc..c58d7d12d 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -340,16 +340,6 @@ fn create_capturer( }; } -// to-do: do not close if in privacy mode. -#[cfg(all(windows, feature = "virtual_display_driver"))] -fn ensure_close_virtual_device() -> ResultType<()> { - let num_displays = Display::all()?.len(); - if num_displays > 1 { - let _res = virtual_display_manager::plug_out_headless(); - } - Ok(()) -} - // This function works on privacy mode. Windows only for now. pub fn test_create_capturer(privacy_mode_id: i32, timeout_millis: u64) -> bool { let test_begin = Instant::now(); @@ -509,7 +499,7 @@ fn run(sp: GenericService) -> ResultType<()> { #[cfg(not(any(target_os = "android", target_os = "ios")))] let _wake_lock = get_wake_lock(); #[cfg(all(windows, feature = "virtual_display_driver"))] - ensure_close_virtual_device()?; + let _res = virtual_display_manager::plug_out_headless(); // ensure_inited() is needed because release_resource() may be called. #[cfg(target_os = "linux")] @@ -993,18 +983,39 @@ fn try_get_displays() -> ResultType> { Ok(Display::all()?) } +#[inline] +#[cfg(windows)] +fn no_displays(displays: &Vec) -> bool { + let display_len = displays.len(); + if display_len == 0 { + true + } else if display_len == 1 { + let display = &displays[0]; + let dummy_display_side_max_size = 800; + display.width() < dummy_display_side_max_size + && display.height() < dummy_display_side_max_size + } else { + false + } +} + +#[inline] +#[cfg(not(windows))] +fn no_displays(displays: &Vec) -> bool { + displays.is_empty() +} + #[cfg(all(windows, feature = "virtual_display_driver"))] fn try_get_displays() -> ResultType> { let mut displays = Display::all()?; - if displays.len() == 0 { + if no_displays(&displays) { log::debug!("no displays, create virtual display"); if let Err(e) = virtual_display_manager::plug_in_headless() { log::error!("plug in headless failed {}", e); } else { displays = Display::all()?; } - } else if displays.len() > 1 { - // If more than one displays exists, close RustDeskVirtualDisplay + } else { if virtual_display_manager::plug_out_headless() { displays = Display::all()?; } From 205798b611021bcf3edcc2688c326e7817351ee7 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 5 Jun 2023 08:36:32 -0700 Subject: [PATCH 2/4] debug virtual display with dummy one Signed-off-by: fufesou --- src/server/connection.rs | 4 ++++ src/server/video_service.rs | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/server/connection.rs b/src/server/connection.rs index a5ef3f20f..19405c359 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -639,6 +639,10 @@ impl Connection { if active_conns_lock.is_empty() { video_service::reset_resolutions(); } + #[cfg(all(windows, feature = "virtual_display_driver"))] + if active_conns_lock.is_empty() { + video_service::try_plug_out_virtual_display(); + } log::info!("#{} connection loop exited", id); } diff --git a/src/server/video_service.rs b/src/server/video_service.rs index c58d7d12d..06908085f 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -495,11 +495,14 @@ fn check_get_displays_changed_msg() -> Option { Some(msg_out) } +#[cfg(all(windows, feature = "virtual_display_driver"))] +pub fn try_plug_out_virtual_display() { + let _res = virtual_display_manager::plug_out_headless(); +} + fn run(sp: GenericService) -> ResultType<()> { #[cfg(not(any(target_os = "android", target_os = "ios")))] let _wake_lock = get_wake_lock(); - #[cfg(all(windows, feature = "virtual_display_driver"))] - let _res = virtual_display_manager::plug_out_headless(); // ensure_inited() is needed because release_resource() may be called. #[cfg(target_os = "linux")] @@ -1015,10 +1018,6 @@ fn try_get_displays() -> ResultType> { } else { displays = Display::all()?; } - } else { - if virtual_display_manager::plug_out_headless() { - displays = Display::all()?; - } } Ok(displays) } From 1bc9b8c5831d09ca5c420efbbf92c3858ba755ad Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 5 Jun 2023 23:39:12 +0800 Subject: [PATCH 3/4] simple remove some warns Signed-off-by: fufesou --- src/ui_interface.rs | 6 ------ src/ui_session_interface.rs | 6 +++--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/ui_interface.rs b/src/ui_interface.rs index 7ea37bb5e..4c6202e7d 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -110,12 +110,6 @@ pub fn get_license() -> String { Default::default() } -#[inline] -#[cfg(target_os = "windows")] -pub fn get_option_opt(key: &str) -> Option { - OPTIONS.lock().unwrap().get(key).map(|x| x.clone()) -} - #[inline] pub fn get_option(key: String) -> String { get_option_(&key) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index d754d49d4..be67adb8a 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -911,16 +911,16 @@ impl Session { pub fn change_resolution(&self, display: i32, width: i32, height: i32) { *self.last_change_display.lock().unwrap() = ChangeDisplayRecord::new(display, width, height); - self.do_change_resolution(display, width, height); + self.do_change_resolution(width, height); } fn try_change_init_resolution(&self, display: i32) { if let Some((w, h)) = self.lc.read().unwrap().get_custom_resolution(display) { - self.do_change_resolution(display, w, h); + self.do_change_resolution(w, h); } } - fn do_change_resolution(&self, display: i32, width: i32, height: i32) { + fn do_change_resolution(&self, width: i32, height: i32) { let mut misc = Misc::new(); misc.set_change_resolution(Resolution { width, From 5a87652ef369c3e9ad3b92b86412f9b04481cdfe Mon Sep 17 00:00:00 2001 From: RustDesk <71636191+rustdesk@users.noreply.github.com> Date: Tue, 6 Jun 2023 21:27:03 +0800 Subject: [PATCH 4/4] <= 800 --- src/server/video_service.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 06908085f..f0e2d4b0a 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -995,8 +995,8 @@ fn no_displays(displays: &Vec) -> bool { } else if display_len == 1 { let display = &displays[0]; let dummy_display_side_max_size = 800; - display.width() < dummy_display_side_max_size - && display.height() < dummy_display_side_max_size + display.width() <= dummy_display_side_max_size + && display.height() <= dummy_display_side_max_size } else { false }