diff --git a/libs/virtual_display/src/lib.rs b/libs/virtual_display/src/lib.rs index 237e2cf15..73b4bdbd4 100644 --- a/libs/virtual_display/src/lib.rs +++ b/libs/virtual_display/src/lib.rs @@ -5,6 +5,8 @@ use hbb_common::{bail, lazy_static, ResultType}; use std::{ffi::CString, path::Path, sync::Mutex}; lazy_static::lazy_static! { + // If device is uninstalled though "Device Manager" Window. + // Rustdesk is unable to handle device any more... static ref H_SW_DEVICE: Mutex = Mutex::new(0); static ref MONITOR_PLUGIN: Mutex> = Mutex::new(Vec::new()); } @@ -97,11 +99,12 @@ pub fn create_device() -> ResultType<()> { } #[cfg(windows)] unsafe { - let mut h_sw_device = *H_SW_DEVICE.lock().unwrap() as win10::idd::HSWDEVICE; + let mut lock_device = H_SW_DEVICE.lock().unwrap(); + let mut h_sw_device = *lock_device as win10::idd::HSWDEVICE; if win10::idd::DeviceCreate(&mut h_sw_device) == win10::idd::FALSE { bail!("{}", win10::get_last_msg()?); } else { - *H_SW_DEVICE.lock().unwrap() = h_sw_device as u64; + *lock_device = h_sw_device as u64; } } Ok(()) @@ -112,6 +115,7 @@ pub fn close_device() { unsafe { win10::idd::DeviceClose(*H_SW_DEVICE.lock().unwrap() as win10::idd::HSWDEVICE); *H_SW_DEVICE.lock().unwrap() = 0; + MONITOR_PLUGIN.lock().unwrap().clear(); } } @@ -119,7 +123,7 @@ pub fn plug_in_monitor() -> ResultType<()> { #[cfg(windows)] unsafe { let monitor_index = 0 as u32; - let plug_in_monitors = &mut *MONITOR_PLUGIN.lock().unwrap(); + let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap(); for i in 0..plug_in_monitors.len() { if let Some(d) = plug_in_monitors.get(i) { if *d == monitor_index { @@ -142,7 +146,7 @@ pub fn plug_out_monitor() -> ResultType<()> { if win10::idd::MonitorPlugOut(monitor_index) == win10::idd::FALSE { bail!("{}", win10::get_last_msg()?); } - let plug_in_monitors = &mut *MONITOR_PLUGIN.lock().unwrap(); + let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap(); for i in 0..plug_in_monitors.len() { if let Some(d) = plug_in_monitors.get(i) { if *d == monitor_index { diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 429cff6ce..dd7f78d37 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -159,6 +159,18 @@ fn check_display_changed( } fn run(sp: GenericService) -> ResultType<()> { + let num_displays = Display::all()?.len(); + if num_displays == 0 { + // Device may sometimes be uninstalled by user in "Device Manager" Window. + // Closing device will clear the instance data. + virtual_display::close_device(); + } else if num_displays > 1 { + // Try close device, if display device changed. + if virtual_display::is_device_created() { + virtual_display::close_device(); + } + } + let fps = 30; let spf = time::Duration::from_secs_f32(1. / (fps as f32)); let (ndisplay, current, display) = get_current_display()?; @@ -300,10 +312,6 @@ fn run(sp: GenericService) -> ResultType<()> { } } - // Close device, if there are no connections - if virtual_display::is_device_created() { - virtual_display::close_device() - } Ok(()) } @@ -451,18 +459,19 @@ pub fn switch_to_primary() { fn try_get_displays() -> ResultType> { let mut displays = Display::all()?; if displays.len() == 0 { + log::debug!("no displays, create virtual display"); // Try plugin monitor if !virtual_display::is_device_created() { if let Err(e) = virtual_display::create_device() { - log::error!("Create device failed {}", e); + log::debug!("Create device failed {}", e); } } if virtual_display::is_device_created() { if let Err(e) = virtual_display::plug_in_monitor() { - log::error!("Plug in monitor failed {}", e); + log::debug!("Plug in monitor failed {}", e); } else { if let Err(e) = virtual_display::update_monitor_modes() { - log::error!("Update monitor modes failed {}", e); + log::debug!("Update monitor modes failed {}", e); } } }