From 66abc2199c21a52532da0faa27c07b7bb8dddb34 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Wed, 14 Aug 2024 19:21:06 -0300 Subject: [PATCH] actually apply item changes --- .changes/ensure-tray-created-ready.md | 3 --- core/tauri-runtime-wry/src/system_tray.rs | 27 +++++++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/.changes/ensure-tray-created-ready.md b/.changes/ensure-tray-created-ready.md index f1cc7bf0e..bab789762 100644 --- a/.changes/ensure-tray-created-ready.md +++ b/.changes/ensure-tray-created-ready.md @@ -3,6 +3,3 @@ --- Ensure system tray is created when the event loop is ready. Menu item modifications are not applied unless it is ready. -If you need to modify the menu items immediately after creating a tray in the setup hook, -either directly configure the menu item change when creating the menu or move the code when `RunEvent::Ready` is fired. -See https://docs.rs/tauri/latest/tauri/struct.App.html#method.run for more information. diff --git a/core/tauri-runtime-wry/src/system_tray.rs b/core/tauri-runtime-wry/src/system_tray.rs index 2a01211e0..81c5b9023 100644 --- a/core/tauri-runtime-wry/src/system_tray.rs +++ b/core/tauri-runtime-wry/src/system_tray.rs @@ -195,8 +195,31 @@ impl TrayHandle for SystemTrayHandle { fn update_item(&self, id: u16, update: MenuUpdate) -> Result<()> { if !self.context.is_event_loop_ready.load(Ordering::Relaxed) { - if let Some(_pending) = &mut *self.pending.0.borrow_mut() { - // do nothing - menu items not available yet + if let Some(pending) = &mut *self.pending.0.borrow_mut() { + if let Some(menu) = &mut pending.menu { + for item in &mut menu.items { + if let SystemTrayMenuEntry::CustomItem(item) = item { + if item.id == id { + match update { + MenuUpdate::SetEnabled(enabled) => { + item.enabled = enabled; + } + MenuUpdate::SetTitle(title) => { + item.title = title; + } + MenuUpdate::SetSelected(selected) => { + item.selected = selected; + } + #[cfg(target_os = "macos")] + MenuUpdate::SetNativeImage(img) => { + item.native_image.replace(img); + } + } + break; + } + } + } + } return Ok(()); } }