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:
parent
b5a88d00af
commit
846522037f
@ -1231,8 +1231,12 @@ impl Connection {
|
|||||||
} else {
|
} else {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[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 {
|
pi.resolutions = Some(SupportedResolutions {
|
||||||
resolutions: display_service::try_get_displays()
|
resolutions: displays
|
||||||
.map(|displays| {
|
.map(|displays| {
|
||||||
displays
|
displays
|
||||||
.get(self.display_idx)
|
.get(self.display_idx)
|
||||||
|
@ -372,15 +372,47 @@ pub fn try_get_displays() -> ResultType<Vec<Display>> {
|
|||||||
Ok(Display::all()?)
|
Ok(Display::all()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
#[cfg(all(windows, feature = "virtual_display_driver"))]
|
#[cfg(all(windows, feature = "virtual_display_driver"))]
|
||||||
pub fn try_get_displays() -> ResultType<Vec<Display>> {
|
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()?;
|
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);
|
let no_displays_v = no_displays(&displays);
|
||||||
virtual_display_manager::set_can_plug_out_all(!no_displays_v);
|
virtual_display_manager::set_can_plug_out_all(!no_displays_v);
|
||||||
if crate::platform::is_installed()
|
if no_displays_v {
|
||||||
&& no_displays_v
|
|
||||||
&& virtual_display_manager::is_virtual_display_supported()
|
|
||||||
{
|
|
||||||
log::debug!("no displays, create virtual display");
|
log::debug!("no displays, create virtual display");
|
||||||
if let Err(e) = virtual_display_manager::plug_in_headless() {
|
if let Err(e) = virtual_display_manager::plug_in_headless() {
|
||||||
log::error!("plug in headless failed {}", e);
|
log::error!("plug in headless failed {}", e);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user