diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto index 29cbb35c2..d89370cc7 100644 --- a/libs/hbb_common/protos/message.proto +++ b/libs/hbb_common/protos/message.proto @@ -508,7 +508,8 @@ message OptionMessage { SupportedDecoding supported_decoding = 10; int32 custom_fps = 11; BoolOption disable_keyboard = 12; - Resolution custom_resolution = 13; +// Position 13 is used for Resolution. Remove later. +// Resolution custom_resolution = 13; } message TestDelay { diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 0bb6dfdaa..d668067c7 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -1567,7 +1567,20 @@ mod tests { let wrong_type_str = r#" view_style = "adaptive" scroll_style = "scrollbar" - custom_resolution = true + custom_resolutions = true + "#; + let mut cfg_to_compare = default_peer_config.clone(); + cfg_to_compare.view_style = "adaptive".to_string(); + cfg_to_compare.scroll_style = "scrollbar".to_string(); + let cfg = toml::from_str::(wrong_type_str); + assert_eq!(cfg, Ok(cfg_to_compare), "Failed to test wrong_type_str"); + + let wrong_type_str = r#" + view_style = "adaptive" + scroll_style = "scrollbar" + [custom_resolutions.0] + w = "1920" + h = 1080 "#; let mut cfg_to_compare = default_peer_config.clone(); cfg_to_compare.view_style = "adaptive".to_string(); @@ -1576,14 +1589,15 @@ mod tests { assert_eq!(cfg, Ok(cfg_to_compare), "Failed to test wrong_type_str"); let wrong_field_str = r#" - [custom_resolution] + [custom_resolutions.0] w = 1920 h = 1080 hello = "world" [ui_flutter] "#; let mut cfg_to_compare = default_peer_config.clone(); - cfg_to_compare.custom_resolution = Some(Resolution { w: 1920, h: 1080 }); + cfg_to_compare.custom_resolutions = + HashMap::from([("0".to_string(), Resolution { w: 1920, h: 1080 })]); let cfg = toml::from_str::(wrong_field_str); assert_eq!(cfg, Ok(cfg_to_compare), "Failed to test wrong_field_str"); } diff --git a/src/client.rs b/src/client.rs index 8402752c5..b64e31ec7 100644 --- a/src/client.rs +++ b/src/client.rs @@ -35,7 +35,7 @@ use hbb_common::{ Config, PeerConfig, PeerInfoSerde, Resolution, CONNECT_TIMEOUT, READ_TIMEOUT, RELAY_PORT, }, get_version_number, log, - message_proto::{option_message::BoolOption, Resolution as ProtoResolution, *}, + message_proto::{option_message::BoolOption, *}, protobuf::Message as _, rand, rendezvous_proto::*, @@ -1404,16 +1404,6 @@ impl LoginConfigHandler { msg.disable_clipboard = BoolOption::Yes.into(); n += 1; } - if let Some(r) = self.get_custom_resolution(0) { - if r.0 > 0 && r.1 > 0 { - msg.custom_resolution = Some(ProtoResolution { - width: r.0, - height: r.1, - ..Default::default() - }) - .into(); - } - } msg.supported_decoding = hbb_common::protobuf::MessageField::some(Decoder::supported_decodings(Some(&self.id))); n += 1; diff --git a/src/server/connection.rs b/src/server/connection.rs index 28fcfef75..3bf485e45 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1795,14 +1795,11 @@ impl Connection { video_service::switch_display(s.display).await; #[cfg(not(any(target_os = "android", target_os = "ios")))] if s.width != 0 && s.height != 0 { - self.change_resolution( - &Resolution { - width: s.width, - height: s.height, - ..Default::default() - }, - false, - ); + self.change_resolution(&Resolution { + width: s.width, + height: s.height, + ..Default::default() + }); } } Some(misc::Union::ChatMessage(c)) => { @@ -1905,7 +1902,7 @@ impl Connection { } } #[cfg(not(any(target_os = "android", target_os = "ios")))] - Some(misc::Union::ChangeResolution(r)) => self.change_resolution(&r, false), + Some(misc::Union::ChangeResolution(r)) => self.change_resolution(&r), #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] Some(misc::Union::PluginRequest(p)) => { @@ -1948,13 +1945,9 @@ impl Connection { } #[cfg(not(any(target_os = "android", target_os = "ios")))] - fn change_resolution(&mut self, r: &Resolution, first_display: bool) { + fn change_resolution(&mut self, r: &Resolution) { if self.keyboard { - if let Ok((_, current, display)) = video_service::get_current_display() { - if first_display && current != 0 { - return; - } - let name = display.name(); + if let Ok(name) = video_service::get_current_display_name() { #[cfg(all(windows, feature = "virtual_display_driver"))] if let Some(_ok) = crate::virtual_display_manager::change_resolution_if_is_virtual_display( @@ -2180,7 +2173,7 @@ impl Connection { if let Some(custom_resolution) = o.custom_resolution.as_ref() { if Self::alive_conns().len() > 0 { if custom_resolution.width > 0 && custom_resolution.height > 0 { - self.change_resolution(&custom_resolution, true); + self.change_resolution(&custom_resolution); } } } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 3d658b99c..d754d49d4 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -911,7 +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); + } + 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); + } + } + + fn do_change_resolution(&self, display: i32, width: i32, height: i32) { let mut misc = Misc::new(); misc.set_change_resolution(Resolution { width, @@ -1081,6 +1090,7 @@ impl Interface for Session { self.msgbox("error", "Remote Error", "No Display", ""); return; } + self.try_change_init_resolution(pi.current_display); let p = self.lc.read().unwrap().should_auto_login(); if !p.is_empty() { input_os_password(p, true, self.clone());