diff --git a/client/src/launcher/preview.rs b/client/src/launcher/preview.rs index 30a40b8..85e4469 100644 --- a/client/src/launcher/preview.rs +++ b/client/src/launcher/preview.rs @@ -326,6 +326,28 @@ impl LauncherPreview { self.rebuild_feed(&self.window_feeds, monitor_id, None, Some((width, height))); } + #[cfg(test)] + pub(crate) fn profile_for_test( + &self, + monitor_id: usize, + surface: PreviewSurface, + ) -> Option<(i32, i32, i32, i32, u32, u32, bool)> { + let feed = match surface { + PreviewSurface::Inline => self.inline_feeds.lock().ok()?.get(monitor_id).cloned(), + PreviewSurface::Window => self.window_feeds.lock().ok()?.get(monitor_id).cloned(), + }?; + let profile = feed.profile(); + Some(( + profile.display_width, + profile.display_height, + profile.requested_width, + profile.requested_height, + profile.requested_fps, + profile.max_bitrate_kbit, + profile.prefer_reencode, + )) + } + fn rebuild_feed( &self, feeds: &Arc>, diff --git a/client/src/launcher/ui.rs b/client/src/launcher/ui.rs index 5d58922..319a79b 100644 --- a/client/src/launcher/ui.rs +++ b/client/src/launcher/ui.rs @@ -461,12 +461,7 @@ fn rebind_popout_preview( } #[cfg(not(coverage))] -fn sync_preview_profiles( - preview: &super::preview::LauncherPreview, - widgets: &super::ui_components::LauncherWidgets, - popouts: &Rc; 2]>>, - state: &LauncherState, -) { +fn apply_preview_profiles(preview: &super::preview::LauncherPreview, state: &LauncherState) { for monitor_id in 0..2 { let capture = state.capture_size_choice(monitor_id); let breakout = state.breakout_size_choice(monitor_id); @@ -479,6 +474,18 @@ fn sync_preview_profiles( capture.preset != CaptureSizePreset::Source, ); preview.set_breakout_profile(monitor_id, breakout.width, breakout.height); + } +} + +#[cfg(not(coverage))] +fn sync_preview_profiles( + preview: &super::preview::LauncherPreview, + widgets: &super::ui_components::LauncherWidgets, + popouts: &Rc; 2]>>, + state: &LauncherState, +) { + apply_preview_profiles(preview, state); + for monitor_id in 0..2 { rebind_inline_preview(preview, widgets, monitor_id); rebind_popout_preview(preview, popouts, monitor_id); } @@ -1900,6 +1907,60 @@ pub fn run_gui_launcher(_server_addr: String) -> Result<()> { Ok(()) } +#[cfg(all(test, not(coverage)))] +mod tests { + use super::apply_preview_profiles; + use crate::launcher::preview::{LauncherPreview, PreviewSurface}; + use crate::launcher::state::{CaptureSizePreset, LauncherState}; + + #[test] + fn fresh_preview_bootstrap_is_overridden_by_launcher_state_profiles() { + let preview = LauncherPreview::new("http://127.0.0.1:1".to_string()).unwrap(); + let state = LauncherState::default(); + + let bootstrap = preview.profile_for_test(1, PreviewSurface::Inline).unwrap(); + assert_eq!(bootstrap.2, 960); + assert_eq!(bootstrap.3, 540); + assert_eq!(bootstrap.4, 24); + + apply_preview_profiles(&preview, &state); + + let inline = preview.profile_for_test(1, PreviewSurface::Inline).unwrap(); + assert_eq!(inline.2, 1920); + assert_eq!(inline.3, 1080); + assert_eq!(inline.4, 24); + assert_eq!(inline.5, 4_000); + assert!(inline.6); + + let window = preview.profile_for_test(1, PreviewSurface::Window).unwrap(); + assert_eq!(window.2, 1920); + assert_eq!(window.3, 1080); + assert_eq!(window.4, 30); + assert_eq!(window.5, 12_000); + assert!(window.6); + + preview.shutdown_all(); + } + + #[test] + fn source_preview_profile_stays_honest_after_apply() { + let preview = LauncherPreview::new("http://127.0.0.1:1".to_string()).unwrap(); + let mut state = LauncherState::default(); + state.set_capture_size_preset(1, CaptureSizePreset::Source); + + apply_preview_profiles(&preview, &state); + + let inline = preview.profile_for_test(1, PreviewSurface::Inline).unwrap(); + assert_eq!(inline.2, 1920); + assert_eq!(inline.3, 1080); + assert_eq!(inline.4, 30); + assert_eq!(inline.5, 12_000); + assert!(!inline.6); + + preview.shutdown_all(); + } +} + #[cfg(all(test, coverage))] mod tests { use super::{run_gui_launcher, session_preview_active};