From abf8aef1effe89714592ecb869c1ec9b24ed6e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asger=20Geel=20Weirs=C3=B8e?= Date: Wed, 6 May 2026 11:58:21 +0200 Subject: [PATCH] fix: defer volume lock to after setup, fix sighandler cast comment, check pkg-config status --- crates/ahfail-display/Cargo.toml | 1 - crates/ahfail-display/build.rs | 1 + crates/ahfail-display/src/main.rs | 23 ++++++++++++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/crates/ahfail-display/Cargo.toml b/crates/ahfail-display/Cargo.toml index 613b1f1..bf99b2a 100644 --- a/crates/ahfail-display/Cargo.toml +++ b/crates/ahfail-display/Cargo.toml @@ -11,7 +11,6 @@ ahfail-ui = { path = "../ahfail-ui" } gtk = { version = "0.15", package = "gtk", features = ["v3_24"] } gdk = { version = "0.15", package = "gdk", features = ["v3_24"] } gstreamer = { version = "0.18", package = "gstreamer", features = ["v1_18"] } -gstreamer-player = { version = "0.18", package = "gstreamer-player" } glib = { version = "0.15", package = "glib" } libc = "0.2" diff --git a/crates/ahfail-display/build.rs b/crates/ahfail-display/build.rs index 45e36a3..21d5824 100644 --- a/crates/ahfail-display/build.rs +++ b/crates/ahfail-display/build.rs @@ -37,6 +37,7 @@ fn main() { .args(["--cflags", "gio-2.0"]) .output() .expect("pkg-config not found"); + assert!(gio_cflags.status.success(), "pkg-config --cflags gio-2.0 failed"); let gio_cflags_str = String::from_utf8(gio_cflags.stdout).unwrap(); let mut build = cc::Build::new(); diff --git a/crates/ahfail-display/src/main.rs b/crates/ahfail-display/src/main.rs index 9429609..edb7ea4 100644 --- a/crates/ahfail-display/src/main.rs +++ b/crates/ahfail-display/src/main.rs @@ -14,6 +14,9 @@ extern "C" fn handle_sigterm(_: libc::c_int) { fn main() { unsafe { + // SAFETY: handle_sigterm only stores to an AtomicBool — async-signal-safe. + // The *const () intermediate avoids a "direct cast to integer" warning because + // libc::sighandler_t is size_t on Linux. libc::signal(libc::SIGTERM, handle_sigterm as *const () as libc::sighandler_t); } @@ -32,17 +35,20 @@ fn main() { return; }; - let volume_state = ahfail_ui::volume::save_and_set_max(); - - let display = gdk::Display::default().expect("[ahfail-display] No display"); - let monitor = display - .primary_monitor() - .or_else(|| display.monitor(0)) - .expect("[ahfail-display] No monitor"); + let Some(display) = gdk::Display::default() else { + eprintln!("[ahfail-display] No display"); + return; + }; + let Some(monitor) = display.primary_monitor().or_else(|| display.monitor(0)) else { + eprintln!("[ahfail-display] No monitor"); + return; + }; let geom = monitor.geometry(); let screen_w = geom.width(); let screen_h = geom.height(); + // On X11, WindowType::Popup creates an unmanaged override-redirect window (desired). + // On Wayland, GTK3 falls back to a normal xdg_toplevel; the compositor controls stacking. let window = gtk::Window::new(gtk::WindowType::Popup); window.set_decorated(false); window.set_keep_above(true); @@ -62,6 +68,9 @@ fn main() { std::thread::spawn(|| ahfail_ui::update::check_for_update(ahfail_ui::VERSION)); + // All setup succeeded — acquire volume lock now so early-exit paths above don't leave it held. + let volume_state = ahfail_ui::volume::save_and_set_max(); + glib::timeout_add_seconds(FAILSAFE_MINUTES * 60, || { gtk::main_quit(); glib::Continue(false)