From 6d577b5411d37c1ba7e405d68d0c36b036776b7d Mon Sep 17 00:00:00 2001 From: Mitchell R Date: Fri, 22 May 2026 21:08:24 +0200 Subject: [PATCH] fix(terminal+journal): forward via WorkerMsg (GTK thread) + journal fallback Terminal: idle_add_local_once from non-GTK thread silently fails. Forward ShowTerminalCode/DismissTerminalCode through WorkerMsg channel which IS polled on the GTK main thread via timeout_add_local. Journal: try --user-unit first, fall back to unfiltered journal if permission denied (bfkiosk user may not be in systemd-journal group on non-reflashed images). Send error line back to admin UI on spawn failure instead of silent drop. --- kiosk/src/remote_debug.rs | 11 +++++++++-- kiosk/src/ui.rs | 15 ++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/kiosk/src/remote_debug.rs b/kiosk/src/remote_debug.rs index 08110fb..e5546e2 100644 --- a/kiosk/src/remote_debug.rs +++ b/kiosk/src/remote_debug.rs @@ -121,15 +121,22 @@ impl JournalStream { let kill_clone = kill.clone(); std::thread::spawn(move || { + // Try unit-scoped first, fall back to all journal if permission denied. let mut child = match Command::new("journalctl") - .args(["-u", "betterframe-kiosk", "-f", "--no-pager", "-o", "short-iso", "-n", "50"]) + .args(["--user-unit", "betterframe-kiosk", "-f", "--no-pager", "-o", "short-iso", "-n", "50"]) .stdout(Stdio::piped()) - .stderr(Stdio::null()) + .stderr(Stdio::piped()) .spawn() + .or_else(|_| Command::new("journalctl") + .args(["-f", "--no-pager", "-o", "short-iso", "-n", "50"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()) { Ok(c) => c, Err(e) => { warn!("remote-debug: journalctl spawn failed: {e}"); + on_line(&format!("[ERROR] journalctl spawn failed: {e}")); return; } }; diff --git a/kiosk/src/ui.rs b/kiosk/src/ui.rs index 6034204..4543d3b 100644 --- a/kiosk/src/ui.rs +++ b/kiosk/src/ui.rs @@ -266,17 +266,10 @@ fn activate(app: &Application) { maybe_apply_firmware_update(&server_for_reload, &key_for_reload); } ServerMsg::ShowTerminalCode(code) => { - // Overlay on all windows: big centered code text. - // NOT logged — security requirement. - let code_clone = code.clone(); - gtk::glib::idle_add_local_once(move || { - show_terminal_code_overlay(&code_clone); - }); + let _ = tx_for_reload.send(WorkerMsg::ShowTerminalCode(code)); } ServerMsg::DismissTerminalCode => { - gtk::glib::idle_add_local_once(|| { - dismiss_terminal_code_overlay(); - }); + let _ = tx_for_reload.send(WorkerMsg::DismissTerminalCode); } } } @@ -334,6 +327,8 @@ fn activate(app: &Application) { } WorkerMsg::Standby(display_id) => standby_display(display_id), WorkerMsg::Wake(display_id) => wake_display(display_id), + WorkerMsg::ShowTerminalCode(code) => show_terminal_code_overlay(&code), + WorkerMsg::DismissTerminalCode => dismiss_terminal_code_overlay(), } } gtk::glib::ControlFlow::Continue @@ -349,6 +344,8 @@ pub enum WorkerMsg { }, Standby(Option), Wake(Option), + ShowTerminalCode(String), + DismissTerminalCode, } fn output_name_for_display(display_id: u32) -> Option {