diff --git a/.changes/tray-cleanup.md b/.changes/tray-cleanup.md new file mode 100644 index 000000000..3d5eeb24d --- /dev/null +++ b/.changes/tray-cleanup.md @@ -0,0 +1,5 @@ +--- +"tauri-runtime-wry": "patch" +--- + +Fix regression introduce in tauri@1.1 which prevented removing tray icon when the app exits on Windows. diff --git a/core/tauri-runtime-wry/src/lib.rs b/core/tauri-runtime-wry/src/lib.rs index 36ea464c1..ad3fe967c 100644 --- a/core/tauri-runtime-wry/src/lib.rs +++ b/core/tauri-runtime-wry/src/lib.rs @@ -164,7 +164,10 @@ macro_rules! window_getter { }}; } -fn send_user_message(context: &Context, message: Message) -> Result<()> { +pub(crate) fn send_user_message( + context: &Context, + message: Message, +) -> Result<()> { if current_thread().id() == context.main_thread_id { handle_user_message( &context.main_thread.window_target, @@ -1126,7 +1129,7 @@ pub enum TrayMessage { #[cfg(target_os = "macos")] UpdateTitle(String), Create(SystemTray, Sender>), - Destroy, + Destroy(Sender>), } pub type CreateWebviewClosure = Box< @@ -1789,6 +1792,7 @@ impl RuntimeHandle for WryHandle { )?; rx.recv().unwrap()?; Ok(SystemTrayHandle { + context: self.context.clone(), id, proxy: self.context.proxy.clone(), }) @@ -1993,6 +1997,7 @@ impl Runtime for Wry { ); Ok(SystemTrayHandle { + context: self.context.clone(), id, proxy: self.event_loop.create_proxy(), }) @@ -2580,10 +2585,11 @@ fn handle_user_message( TrayMessage::Create(_tray, _tx) => { // already handled } - TrayMessage::Destroy => { + TrayMessage::Destroy(tx) => { *tray_context.tray.lock().unwrap() = None; tray_context.listeners.lock().unwrap().clear(); tray_context.items.lock().unwrap().clear(); + tx.send(Ok(())).unwrap(); } } } @@ -2712,14 +2718,13 @@ fn handle_event_loop( items.contains_key(&menu_id.0) }; if has_menu { - listeners.replace(tray_context.listeners.clone()); + listeners.replace(tray_context.listeners.lock().unwrap().clone()); tray_id = *id; break; } } drop(trays); if let Some(listeners) = listeners { - let listeners = listeners.lock().unwrap(); let handlers = listeners.iter(); for handler in handlers { handler(&event); diff --git a/core/tauri-runtime-wry/src/system_tray.rs b/core/tauri-runtime-wry/src/system_tray.rs index b86ca570e..ee6db6c9e 100644 --- a/core/tauri-runtime-wry/src/system_tray.rs +++ b/core/tauri-runtime-wry/src/system_tray.rs @@ -27,7 +27,7 @@ pub use wry::application::platform::macos::{ use wry::application::system_tray::{SystemTray as WrySystemTray, SystemTrayBuilder}; -use crate::{Error, Message, Result, TrayId, TrayMessage}; +use crate::{send_user_message, Context, Error, Message, Result, TrayId, TrayMessage}; use tauri_runtime::{menu::MenuHash, SystemTray, UserEvent}; @@ -123,6 +123,7 @@ pub fn create_tray( #[derive(Debug, Clone)] pub struct SystemTrayHandle { + pub(crate) context: Context, pub(crate) id: TrayId, pub(crate) proxy: EventLoopProxy>, } @@ -172,10 +173,13 @@ impl TrayHandle for SystemTrayHandle { } fn destroy(&self) -> Result<()> { - self - .proxy - .send_event(Message::Tray(self.id, TrayMessage::Destroy)) - .map_err(|_| Error::FailedToSendMessage) + let (tx, rx) = std::sync::mpsc::channel(); + send_user_message( + &self.context, + Message::Tray(self.id, TrayMessage::Destroy(tx)), + )?; + rx.recv().unwrap()?; + Ok(()) } }