From c7e0c2fa07a7ccfcbc6b74d384e9a6bd27ae949b Mon Sep 17 00:00:00 2001 From: xodapi <4956501+xodapi@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:38:11 +0700 Subject: [PATCH] fix(gui): make tray icon creation non-fatal (closes #188) --- src/bin/vimit-gui/tray.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/bin/vimit-gui/tray.rs b/src/bin/vimit-gui/tray.rs index 1f8d99b..637d532 100644 --- a/src/bin/vimit-gui/tray.rs +++ b/src/bin/vimit-gui/tray.rs @@ -11,7 +11,7 @@ thread_local! { static TRAY_ICON: RefCell> = const { RefCell::new(None) }; } -fn create_status_icon(color: (u8, u8, u8)) -> Icon { +fn create_status_icon(color: (u8, u8, u8)) -> Option { let width = 32; let height = 32; let mut rgba = vec![0u8; width * height * 4]; @@ -42,7 +42,13 @@ fn create_status_icon(color: (u8, u8, u8)) -> Icon { } } - Icon::from_rgba(rgba, width as u32, height as u32).expect("failed to create tray icon") + match Icon::from_rgba(rgba, width as u32, height as u32) { + Ok(icon) => Some(icon), + Err(error) => { + eprintln!("vimit-gui: tray icon unavailable: {error}"); + None + } + } } #[derive(Clone)] @@ -74,7 +80,7 @@ pub(crate) fn try_init_tray() -> Option { let tray_icon_instance = match TrayIconBuilder::new() .with_menu(Box::new(tray_menu)) .with_tooltip("VibeMode Control") - .with_icon(create_status_icon((141, 150, 170))) + .with_icon(create_status_icon((141, 150, 170))?) .build() { Ok(icon) => icon, @@ -135,8 +141,20 @@ pub(crate) fn tray_status_from_dashboard(source: &str, windows: &[ng::WindowStat pub(crate) fn update_tray_status(status: TrayStatus) { TRAY_ICON.with(|cell| { if let Some(ref mut tray) = *cell.borrow_mut() { - let _ = tray.set_icon(Some(create_status_icon(status.color))); + if let Some(icon) = create_status_icon(status.color) { + let _ = tray.set_icon(Some(icon)); + } let _ = tray.set_tooltip(Some(status.tooltip)); } }); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn status_icon_creation_is_non_fatal_for_valid_pixels() { + assert!(create_status_icon((120, 173, 132)).is_some()); + } +}