lesavka: cover startup preview profile sync

This commit is contained in:
Brad Stein 2026-04-18 03:25:20 -03:00
parent e842b0c5c6
commit bec9885537
2 changed files with 89 additions and 6 deletions

View File

@ -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<Mutex<[PreviewFeed; 2]>>,

View File

@ -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<RefCell<[Option<super::ui_components::PopoutWindowHandle>; 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<RefCell<[Option<super::ui_components::PopoutWindowHandle>; 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};