fix: mstsc switch, plug in virtual displays (#7913)

* fix: mstsc switch, plug in virtual displays

Signed-off-by: fufesou <shuanglongchen@yeah.ne>

* Update display_service.rs

---------

Signed-off-by: fufesou <shuanglongchen@yeah.ne>
Co-authored-by: fufesou <shuanglongchen@yeah.ne>
Co-authored-by: RustDesk <71636191+rustdesk@users.noreply.github.com>
This commit is contained in:
fufesou 2024-05-06 14:01:59 +08:00 committed by GitHub
parent b5a88d00af
commit 846522037f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 5 deletions

View File

@ -1231,8 +1231,12 @@ impl Connection {
} else {
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
#[cfg(not(all(windows, feature = "virtual_display_driver")))]
let displays = display_service::try_get_displays();
#[cfg(all(windows, feature = "virtual_display_driver"))]
let displays = display_service::try_get_displays_add_amyuni_headless();
pi.resolutions = Some(SupportedResolutions {
resolutions: display_service::try_get_displays()
resolutions: displays
.map(|displays| {
displays
.get(self.display_idx)

View File

@ -372,15 +372,47 @@ pub fn try_get_displays() -> ResultType<Vec<Display>> {
Ok(Display::all()?)
}
#[inline]
#[cfg(all(windows, feature = "virtual_display_driver"))]
pub fn try_get_displays() -> ResultType<Vec<Display>> {
try_get_displays_(false)
}
// We can't get full control of the virtual display if we use amyuni idd.
// If we add a virtual display, we cannot remove it automatically.
// So when using amyuni idd, we only add a virtual display for headless if it is required.
// eg. when the client is connecting.
#[inline]
#[cfg(all(windows, feature = "virtual_display_driver"))]
pub fn try_get_displays_add_amyuni_headless() -> ResultType<Vec<Display>> {
try_get_displays_(true)
}
#[inline]
#[cfg(all(windows, feature = "virtual_display_driver"))]
pub fn try_get_displays_(add_amyuni_headless: bool) -> ResultType<Vec<Display>> {
let mut displays = Display::all()?;
// Do not add virtual display if the platform is not installed or the virtual display is not supported.
if !crate::platform::is_installed() || !virtual_display_manager::is_virtual_display_supported() {
return Ok(displays);
}
// Enable headless virtual display when
// 1. `amyuni` idd is not used.
// 2. `amyuni` idd is used and `add_amyuni_headless` is true.
if virtual_display_manager::is_amyuni_idd() && !add_amyuni_headless {
return Ok(displays);
}
// If is switching session, no displays may be detected. But it is not a real case.
if displays.is_empty() && crate::platform::desktop_changed() {
return Ok(displays);
}
let no_displays_v = no_displays(&displays);
virtual_display_manager::set_can_plug_out_all(!no_displays_v);
if crate::platform::is_installed()
&& no_displays_v
&& virtual_display_manager::is_virtual_display_supported()
{
if no_displays_v {
log::debug!("no displays, create virtual display");
if let Err(e) = virtual_display_manager::plug_in_headless() {
log::error!("plug in headless failed {}", e);