fix/change_display_resolution, send switch display msg

Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
dignow 2023-10-18 10:45:46 +08:00
parent c1b865d00e
commit 21f7d6c9b9
3 changed files with 28 additions and 15 deletions

View File

@ -2142,6 +2142,12 @@ impl Connection {
}); });
} }
} }
// Send display changed message.
// For compatibility with old versions ( < 1.2.4 ).
if let Some(msg_out) = video_service::make_display_changed_msg(self.display_idx, None) {
self.send(msg_out).await;
}
} }
} }

View File

@ -242,6 +242,10 @@ pub(super) fn get_sync_displays() -> Vec<DisplayInfo> {
SYNC_DISPLAYS.lock().unwrap().displays.clone() SYNC_DISPLAYS.lock().unwrap().displays.clone()
} }
pub(super) fn get_display_info(idx: usize) -> Option<DisplayInfo> {
SYNC_DISPLAYS.lock().unwrap().displays.get(idx).cloned()
}
// Display to DisplayInfo // Display to DisplayInfo
// The DisplayInfo is be sent to the peer. // The DisplayInfo is be sent to the peer.
pub(super) fn check_update_displays(all: &Vec<Display>) { pub(super) fn check_update_displays(all: &Vec<Display>) {

View File

@ -20,7 +20,12 @@
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use super::display_service::IS_X11; use super::display_service::IS_X11;
use super::{display_service::check_display_changed, service::ServiceTmpl, video_qos::VideoQoS, *}; use super::{
display_service::{check_display_changed, get_display_info},
service::ServiceTmpl,
video_qos::VideoQoS,
*,
};
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use crate::common::SimpleCallOnReturn; use crate::common::SimpleCallOnReturn;
#[cfg(windows)] #[cfg(windows)]
@ -511,7 +516,7 @@ fn run(vs: VideoService) -> ResultType<()> {
(c.origin.0, c.origin.1, c.width, c.height), (c.origin.0, c.origin.1, c.width, c.height),
) { ) {
log::info!("Display {} changed", display); log::info!("Display {} changed", display);
broadcast_display_changed(display_idx, &sp, &c.name, display); broadcast_display_changed(display_idx, &sp, display);
bail!("SWITCH"); bail!("SWITCH");
} }
} }
@ -596,7 +601,7 @@ fn run(vs: VideoService) -> ResultType<()> {
(c.origin.0, c.origin.1, c.width, c.height), (c.origin.0, c.origin.1, c.width, c.height),
) { ) {
log::info!("Display {} changed", display); log::info!("Display {} changed", display);
broadcast_display_changed(display_idx, &sp, &c.name, display); broadcast_display_changed(display_idx, &sp, display);
bail!("SWITCH"); bail!("SWITCH");
} }
@ -853,22 +858,20 @@ fn get_wake_lock() -> crate::platform::WakeLock {
} }
#[inline] #[inline]
fn broadcast_display_changed( fn broadcast_display_changed(display_idx: usize, sp: &GenericService, display: DisplayInfo) {
display_idx: usize, if let Some(msg_out) = make_display_changed_msg(display_idx, Some(display)) {
sp: &GenericService,
name: &str,
display: DisplayInfo,
) {
if let Some(msg_out) = make_display_changed_msg(display_idx, name, display) {
sp.send(msg_out); sp.send(msg_out);
} }
} }
fn make_display_changed_msg( pub fn make_display_changed_msg(
display_idx: usize, display_idx: usize,
name: &str, opt_display: Option<DisplayInfo>,
display: DisplayInfo,
) -> Option<Message> { ) -> Option<Message> {
let display = match opt_display {
Some(d) => d,
None => get_display_info(display_idx)?,
};
let mut misc = Misc::new(); let mut misc = Misc::new();
misc.set_switch_display(SwitchDisplay { misc.set_switch_display(SwitchDisplay {
display: display_idx as _, display: display_idx as _,
@ -879,10 +882,10 @@ fn make_display_changed_msg(
cursor_embedded: display_service::capture_cursor_embedded(), cursor_embedded: display_service::capture_cursor_embedded(),
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
resolutions: Some(SupportedResolutions { resolutions: Some(SupportedResolutions {
resolutions: if name.is_empty() { resolutions: if display.name.is_empty() {
vec![] vec![]
} else { } else {
crate::platform::resolutions(name) crate::platform::resolutions(&display.name)
}, },
..SupportedResolutions::default() ..SupportedResolutions::default()
}) })