From da8824318affb50475f28b9c78c56da3fb048708 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Fri, 4 Mar 2022 16:00:03 -0300 Subject: [PATCH] fix(core): update tray menu ids on `set_menu`, closes #3608 (#3611) --- .changes/fix-tray-menu-ids-update.md | 5 +++++ core/tauri/src/app.rs | 5 +++-- core/tauri/src/app/tray.rs | 15 +++++++++++---- 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 .changes/fix-tray-menu-ids-update.md diff --git a/.changes/fix-tray-menu-ids-update.md b/.changes/fix-tray-menu-ids-update.md new file mode 100644 index 000000000..d27a75b3a --- /dev/null +++ b/.changes/fix-tray-menu-ids-update.md @@ -0,0 +1,5 @@ +--- +"tauri": patch +--- + +Update tray menu id map when `SystemTrayHandle::set_menu` is called. diff --git a/core/tauri/src/app.rs b/core/tauri/src/app.rs index a484a9c33..3071bdcf9 100644 --- a/core/tauri/src/app.rs +++ b/core/tauri/src/app.rs @@ -1241,9 +1241,10 @@ impl Builder { .expect("failed to run tray"); let tray_handle = tray::SystemTrayHandle { - ids: Arc::new(ids.clone()), + ids: Arc::new(std::sync::Mutex::new(ids)), inner: tray_handler, }; + let ids = tray_handle.ids.clone(); app.tray_handle.replace(tray_handle.clone()); app.handle.tray_handle.replace(tray_handle); for listener in self.system_tray_event_listeners { @@ -1258,7 +1259,7 @@ impl Builder { let app_handle = app_handle.clone(); let event = match event { RuntimeSystemTrayEvent::MenuItemClick(id) => tray::SystemTrayEvent::MenuItemClick { - id: ids.get(id).unwrap().clone(), + id: ids.lock().unwrap().get(id).unwrap().clone(), }, RuntimeSystemTrayEvent::LeftClick { position, size } => { tray::SystemTrayEvent::LeftClick { diff --git a/core/tauri/src/app/tray.rs b/core/tauri/src/app/tray.rs index 7239b33cc..bd7941411 100644 --- a/core/tauri/src/app/tray.rs +++ b/core/tauri/src/app/tray.rs @@ -12,7 +12,10 @@ pub use crate::runtime::{ use tauri_macros::default_runtime; -use std::{collections::HashMap, sync::Arc}; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; pub(crate) fn get_menu_ids(map: &mut HashMap, menu: &SystemTrayMenu) { for item in &menu.items { @@ -80,7 +83,7 @@ pub enum SystemTrayEvent { #[default_runtime(crate::Wry, wry)] #[derive(Debug)] pub struct SystemTrayHandle { - pub(crate) ids: Arc>, + pub(crate) ids: Arc>>, pub(crate) inner: R::TrayHandler, } @@ -113,7 +116,7 @@ impl Clone for SystemTrayMenuItemHandle { impl SystemTrayHandle { /// Gets a handle to the menu item that has the specified `id`. pub fn get_item(&self, id: MenuIdRef<'_>) -> SystemTrayMenuItemHandle { - for (raw, item_id) in self.ids.iter() { + for (raw, item_id) in self.ids.lock().unwrap().iter() { if item_id == id { return SystemTrayMenuItemHandle { id: *raw, @@ -131,7 +134,11 @@ impl SystemTrayHandle { /// Updates the tray menu. pub fn set_menu(&self, menu: SystemTrayMenu) -> crate::Result<()> { - self.inner.set_menu(menu).map_err(Into::into) + let mut ids = HashMap::new(); + get_menu_ids(&mut ids, &menu); + self.inner.set_menu(menu)?; + *self.ids.lock().unwrap() = ids; + Ok(()) } /// Support [macOS tray icon template](https://developer.apple.com/documentation/appkit/nsimage/1520017-template?language=objc) to adjust automatically based on taskbar color.