Browse Source

fix(core): deadlock when closing the app on a tray event handler (#3771)

Lucas Fernandes Nogueira 3 years ago
parent
commit
9489963e00
2 changed files with 4 additions and 3 deletions
  1. 3 2
      core/tauri-runtime-wry/src/lib.rs
  2. 1 1
      core/tauri-runtime-wry/src/system_tray.rs

+ 3 - 2
core/tauri-runtime-wry/src/lib.rs

@@ -1832,7 +1832,7 @@ impl<T: UserEvent> Runtime<T> for Wry<T> {
       .listeners
       .lock()
       .unwrap()
-      .insert(id, Box::new(f));
+      .insert(id, Arc::new(Box::new(f)));
     id
   }
 
@@ -2355,7 +2355,8 @@ fn handle_event_loop<T: UserEvent>(
       ..
     } => {
       let event = SystemTrayEvent::MenuItemClick(menu_id.0);
-      for handler in tray_context.listeners.lock().unwrap().values() {
+      let listeners = tray_context.listeners.lock().unwrap().clone();
+      for handler in listeners.values() {
         handler(&event);
       }
     }

+ 1 - 1
core/tauri-runtime-wry/src/system_tray.rs

@@ -32,7 +32,7 @@ use std::{
 };
 
 pub type SystemTrayEventHandler = Box<dyn Fn(&SystemTrayEvent) + Send>;
-pub type SystemTrayEventListeners = Arc<Mutex<HashMap<Uuid, SystemTrayEventHandler>>>;
+pub type SystemTrayEventListeners = Arc<Mutex<HashMap<Uuid, Arc<SystemTrayEventHandler>>>>;
 pub type SystemTrayItems = Arc<Mutex<HashMap<u16, WryCustomMenuItem>>>;
 
 #[derive(Debug, Clone)]