Skip to content

Commit f756cd5

Browse files
authored
fix(core): wait for tray cleanup before exiting app, closes #5244 (#5245)
1 parent a5861d8 commit f756cd5

3 files changed

Lines changed: 24 additions & 10 deletions

File tree

.changes/tray-cleanup.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri-runtime-wry": "patch"
3+
---
4+
5+
Fix regression introduce in tauri@1.1 which prevented removing tray icon when the app exits on Windows.

core/tauri-runtime-wry/src/lib.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,10 @@ macro_rules! window_getter {
164164
}};
165165
}
166166

167-
fn send_user_message<T: UserEvent>(context: &Context<T>, message: Message<T>) -> Result<()> {
167+
pub(crate) fn send_user_message<T: UserEvent>(
168+
context: &Context<T>,
169+
message: Message<T>,
170+
) -> Result<()> {
168171
if current_thread().id() == context.main_thread_id {
169172
handle_user_message(
170173
&context.main_thread.window_target,
@@ -1126,7 +1129,7 @@ pub enum TrayMessage {
11261129
#[cfg(target_os = "macos")]
11271130
UpdateTitle(String),
11281131
Create(SystemTray, Sender<Result<()>>),
1129-
Destroy,
1132+
Destroy(Sender<Result<()>>),
11301133
}
11311134

11321135
pub type CreateWebviewClosure<T> = Box<
@@ -1789,6 +1792,7 @@ impl<T: UserEvent> RuntimeHandle<T> for WryHandle<T> {
17891792
)?;
17901793
rx.recv().unwrap()?;
17911794
Ok(SystemTrayHandle {
1795+
context: self.context.clone(),
17921796
id,
17931797
proxy: self.context.proxy.clone(),
17941798
})
@@ -1993,6 +1997,7 @@ impl<T: UserEvent> Runtime<T> for Wry<T> {
19931997
);
19941998

19951999
Ok(SystemTrayHandle {
2000+
context: self.context.clone(),
19962001
id,
19972002
proxy: self.event_loop.create_proxy(),
19982003
})
@@ -2580,10 +2585,11 @@ fn handle_user_message<T: UserEvent>(
25802585
TrayMessage::Create(_tray, _tx) => {
25812586
// already handled
25822587
}
2583-
TrayMessage::Destroy => {
2588+
TrayMessage::Destroy(tx) => {
25842589
*tray_context.tray.lock().unwrap() = None;
25852590
tray_context.listeners.lock().unwrap().clear();
25862591
tray_context.items.lock().unwrap().clear();
2592+
tx.send(Ok(())).unwrap();
25872593
}
25882594
}
25892595
}
@@ -2712,14 +2718,13 @@ fn handle_event_loop<T: UserEvent>(
27122718
items.contains_key(&menu_id.0)
27132719
};
27142720
if has_menu {
2715-
listeners.replace(tray_context.listeners.clone());
2721+
listeners.replace(tray_context.listeners.lock().unwrap().clone());
27162722
tray_id = *id;
27172723
break;
27182724
}
27192725
}
27202726
drop(trays);
27212727
if let Some(listeners) = listeners {
2722-
let listeners = listeners.lock().unwrap();
27232728
let handlers = listeners.iter();
27242729
for handler in handlers {
27252730
handler(&event);

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub use wry::application::platform::macos::{
2727

2828
use wry::application::system_tray::{SystemTray as WrySystemTray, SystemTrayBuilder};
2929

30-
use crate::{Error, Message, Result, TrayId, TrayMessage};
30+
use crate::{send_user_message, Context, Error, Message, Result, TrayId, TrayMessage};
3131

3232
use tauri_runtime::{menu::MenuHash, SystemTray, UserEvent};
3333

@@ -123,6 +123,7 @@ pub fn create_tray<T>(
123123

124124
#[derive(Debug, Clone)]
125125
pub struct SystemTrayHandle<T: UserEvent> {
126+
pub(crate) context: Context<T>,
126127
pub(crate) id: TrayId,
127128
pub(crate) proxy: EventLoopProxy<super::Message<T>>,
128129
}
@@ -172,10 +173,13 @@ impl<T: UserEvent> TrayHandle for SystemTrayHandle<T> {
172173
}
173174

174175
fn destroy(&self) -> Result<()> {
175-
self
176-
.proxy
177-
.send_event(Message::Tray(self.id, TrayMessage::Destroy))
178-
.map_err(|_| Error::FailedToSendMessage)
176+
let (tx, rx) = std::sync::mpsc::channel();
177+
send_user_message(
178+
&self.context,
179+
Message::Tray(self.id, TrayMessage::Destroy(tx)),
180+
)?;
181+
rx.recv().unwrap()?;
182+
Ok(())
179183
}
180184
}
181185

0 commit comments

Comments
 (0)