diff --git a/client/Cargo.toml b/client/Cargo.toml index fabbf36..92f4d80 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "lesavka_client" -version = "0.11.5" +version = "0.11.6" edition = "2024" [dependencies] @@ -37,6 +37,7 @@ base64 = "0.22" prost-build = "0.13" [dev-dependencies] +serial_test = { workspace = true } temp-env = { workspace = true } tempfile = { workspace = true } diff --git a/client/src/launcher/ui_components.rs b/client/src/launcher/ui_components.rs index 91af304..e9bd4e7 100644 --- a/client/src/launcher/ui_components.rs +++ b/client/src/launcher/ui_components.rs @@ -1054,12 +1054,26 @@ fn build_display_pane(title: &str, capture_path: &str) -> DisplayPaneWidgets { let picture = gtk::Picture::new(); picture.set_hexpand(true); picture.set_vexpand(true); + picture.set_halign(gtk::Align::Fill); + picture.set_valign(gtk::Align::Fill); picture.set_can_shrink(true); picture.set_keep_aspect_ratio(true); picture.set_size_request(220, 124); let preview_box = gtk::Box::new(gtk::Orientation::Vertical, 0); - preview_box.append(&picture); + preview_box.set_hexpand(true); + preview_box.set_vexpand(true); + preview_box.set_halign(gtk::Align::Fill); + preview_box.set_valign(gtk::Align::Fill); + preview_box.set_size_request(220, 124); + let preview_frame = gtk::AspectFrame::new(0.5, 0.5, 16.0 / 9.0, false); + preview_frame.set_hexpand(true); + preview_frame.set_vexpand(true); + preview_frame.set_halign(gtk::Align::Fill); + preview_frame.set_valign(gtk::Align::Fill); + preview_frame.set_size_request(220, 124); + preview_frame.set_child(Some(&picture)); + preview_box.append(&preview_frame); let placeholder = gtk::Label::new(Some( "This feed is running in its own window.\nUse Return To Preview to dock it back here.", diff --git a/client/src/launcher/ui_runtime.rs b/client/src/launcher/ui_runtime.rs index fa65a07..47d3416 100644 --- a/client/src/launcher/ui_runtime.rs +++ b/client/src/launcher/ui_runtime.rs @@ -237,12 +237,25 @@ pub fn open_popout_window( let picture = gtk::Picture::new(); picture.set_hexpand(true); picture.set_vexpand(true); + picture.set_halign(gtk::Align::Fill); + picture.set_valign(gtk::Align::Fill); picture.set_can_shrink(true); picture.set_keep_aspect_ratio(true); picture.set_size_request(breakout_size.width, breakout_size.height); let root = gtk::Box::new(gtk::Orientation::Vertical, 0); + root.set_hexpand(true); + root.set_vexpand(true); + root.set_halign(gtk::Align::Fill); + root.set_valign(gtk::Align::Fill); root.set_size_request(breakout_size.width, breakout_size.height); - root.append(&picture); + let frame = gtk::AspectFrame::new(0.5, 0.5, 16.0 / 9.0, false); + frame.set_hexpand(true); + frame.set_vexpand(true); + frame.set_halign(gtk::Align::Fill); + frame.set_valign(gtk::Align::Fill); + frame.set_size_request(breakout_size.width, breakout_size.height); + frame.set_child(Some(&picture)); + root.append(&frame); let stream_status = gtk::Label::new(Some("")); @@ -1138,6 +1151,7 @@ mod tests { devices::DeviceCatalog, preview::PreviewBinding, state::LauncherState, ui_components::build_launcher_view, }; + use serial_test::serial; use std::{cell::RefCell, rc::Rc}; #[test] @@ -1168,6 +1182,7 @@ mod tests { } #[gtk::test] + #[serial] fn dock_all_displays_to_preview_closes_popouts_and_resets_surfaces() { if gtk::gdk::Display::default().is_none() { return; @@ -1226,6 +1241,7 @@ mod tests { } #[gtk::test] + #[serial] fn dock_all_displays_to_preview_handles_reentrant_close_callbacks() { if gtk::gdk::Display::default().is_none() { return; @@ -1278,6 +1294,7 @@ mod tests { } #[gtk::test] + #[serial] fn shutdown_launcher_runtime_closes_preview_bindings_and_popouts() { if gtk::gdk::Display::default().is_none() { return; diff --git a/common/Cargo.toml b/common/Cargo.toml index 1fb3bf4..407f30b 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lesavka_common" -version = "0.11.5" +version = "0.11.6" edition = "2024" build = "build.rs" diff --git a/common/src/cli.rs b/common/src/cli.rs index 8c0457c..0d206f5 100644 --- a/common/src/cli.rs +++ b/common/src/cli.rs @@ -17,6 +17,6 @@ mod tests { #[test] fn banner_includes_version() { - assert_eq!(banner("0.11.5"), "lesavka-common CLI (v0.11.5)"); + assert_eq!(banner("0.11.6"), "lesavka-common CLI (v0.11.6)"); } } diff --git a/server/Cargo.toml b/server/Cargo.toml index 46558e3..fb8a0fa 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -10,7 +10,7 @@ bench = false [package] name = "lesavka_server" -version = "0.11.5" +version = "0.11.6" edition = "2024" autobins = false diff --git a/server/src/video.rs b/server/src/video.rs index 4c42ebc..0538a41 100644 --- a/server/src/video.rs +++ b/server/src/video.rs @@ -445,8 +445,8 @@ pub async fn eye_ball_with_request( let last_telemetry_sec = Arc::new(AtomicU64::new(0)); let packet_seq = Arc::new(AtomicU64::new(0)); - let queue_buffers = env_u32("LESAVKA_EYE_QUEUE_BUFFERS", 8).max(1); - let appsink_buffers = env_u32("LESAVKA_EYE_APPSINK_BUFFERS", 8).max(1); + let queue_buffers = env_u32("LESAVKA_EYE_QUEUE_BUFFERS", 4).max(1); + let appsink_buffers = env_u32("LESAVKA_EYE_APPSINK_BUFFERS", 4).max(1); let keyframe_interval = env_u32( "LESAVKA_EYE_KEYFRAME_INTERVAL", request.requested_fps.max(1).min(5), @@ -513,7 +513,7 @@ pub async fn eye_ball_with_request( .dynamic_cast::() .expect("appsink down-cast"); - let chan_capacity = env_usize("LESAVKA_EYE_CHAN_CAPACITY", 256).max(16); + let chan_capacity = env_usize("LESAVKA_EYE_CHAN_CAPACITY", 32).max(8); let (tx, rx) = tokio::sync::mpsc::channel(chan_capacity); if let Some(src_pad) = pipeline