Skip to content

Commit d0cbc90

Browse files
committed
fix: drop tray icon on main thread
1 parent 6f6ab12 commit d0cbc90

8 files changed

Lines changed: 66 additions & 47 deletions

File tree

crates/tauri/src/menu/check.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5+
use std::mem::ManuallyDrop;
56
use std::sync::Arc;
67

78
use super::run_item_main_thread;
@@ -38,7 +39,7 @@ impl<R: Runtime> CheckMenuItem<R> {
3839
let item = muda::CheckMenuItem::new(text, enabled, checked, accelerator);
3940
CheckMenuItemInner {
4041
id: item.id().clone(),
41-
inner: Some(item),
42+
inner: ManuallyDrop::new(item),
4243
app_handle,
4344
}
4445
})?;
@@ -75,7 +76,7 @@ impl<R: Runtime> CheckMenuItem<R> {
7576
let item = muda::CheckMenuItem::with_id(id.clone(), text, enabled, checked, accelerator);
7677
CheckMenuItemInner {
7778
id,
78-
inner: Some(item),
79+
inner: ManuallyDrop::new(item),
7980
app_handle,
8081
}
8182
})?;

crates/tauri/src/menu/icon.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5+
use std::mem::ManuallyDrop;
56
use std::sync::Arc;
67

78
use super::run_item_main_thread;
@@ -41,7 +42,7 @@ impl<R: Runtime> IconMenuItem<R> {
4142
let item = muda::IconMenuItem::new(text, enabled, icon, accelerator);
4243
IconMenuItemInner {
4344
id: item.id().clone(),
44-
inner: Some(item),
45+
inner: ManuallyDrop::new(item),
4546
app_handle,
4647
}
4748
})?;
@@ -82,7 +83,7 @@ impl<R: Runtime> IconMenuItem<R> {
8283
let item = muda::IconMenuItem::with_id(id.clone(), text, enabled, icon, accelerator);
8384
IconMenuItemInner {
8485
id,
85-
inner: Some(item),
86+
inner: ManuallyDrop::new(item),
8687
app_handle,
8788
}
8889
})?;
@@ -120,7 +121,7 @@ impl<R: Runtime> IconMenuItem<R> {
120121
let item = muda::IconMenuItem::with_native_icon(text, enabled, icon, accelerator);
121122
IconMenuItemInner {
122123
id: item.id().clone(),
123-
inner: Some(item),
124+
inner: ManuallyDrop::new(item),
124125
app_handle,
125126
}
126127
})?;
@@ -162,7 +163,7 @@ impl<R: Runtime> IconMenuItem<R> {
162163
muda::IconMenuItem::with_id_and_native_icon(id.clone(), text, enabled, icon, accelerator);
163164
IconMenuItemInner {
164165
id,
165-
inner: Some(item),
166+
inner: ManuallyDrop::new(item),
166167
app_handle,
167168
}
168169
})?;

crates/tauri/src/menu/menu.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5+
use std::mem::ManuallyDrop;
56
use std::sync::Arc;
67

78
use super::run_item_main_thread;
@@ -98,7 +99,7 @@ impl<R: Runtime> Menu<R> {
9899
let menu = muda::Menu::new();
99100
MenuInner {
100101
id: menu.id().clone(),
101-
inner: Some(menu),
102+
inner: ManuallyDrop::new(menu),
102103
app_handle,
103104
}
104105
})?;
@@ -116,7 +117,7 @@ impl<R: Runtime> Menu<R> {
116117
let menu = muda::Menu::with_id(id.clone());
117118
MenuInner {
118119
id,
119-
inner: Some(menu),
120+
inner: ManuallyDrop::new(menu),
120121
app_handle,
121122
}
122123
})?;

crates/tauri/src/menu/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ mod normal;
1313
pub(crate) mod plugin;
1414
mod predefined;
1515
mod submenu;
16-
use std::sync::Arc;
16+
use std::{mem::ManuallyDrop, sync::Arc};
1717

1818
pub use builders::*;
1919
pub use menu::{HELP_SUBMENU_ID, WINDOW_SUBMENU_ID};
@@ -71,7 +71,8 @@ macro_rules! gen_wrappers {
7171
#[tauri_macros::default_runtime(crate::Wry, wry)]
7272
pub(crate) struct $inner<R: $crate::Runtime> {
7373
id: $crate::menu::MenuId,
74-
inner: ::std::option::Option<::muda::$type>,
74+
// SAFETY: we only call `ManuallyDrop::take` in [`Self::drop`] to drop it on main thread
75+
inner: ManuallyDrop<::muda::$type>,
7576
app_handle: $crate::AppHandle<R>,
7677
}
7778

@@ -85,7 +86,7 @@ macro_rules! gen_wrappers {
8586

8687
impl<R: Runtime> Drop for $inner<R> {
8788
fn drop(&mut self) {
88-
let inner = self.inner.take();
89+
let inner = unsafe { ManuallyDrop::take(&mut self.inner) };
8990
// SAFETY: inner was created on main thread and is being dropped on main thread
9091
let inner = $crate::UnsafeSend(inner);
9192
let _ = self.app_handle.run_on_main_thread(move || {
@@ -96,11 +97,10 @@ macro_rules! gen_wrappers {
9697

9798
impl<R: Runtime> AsRef<::muda::$type> for $inner<R> {
9899
fn as_ref(&self) -> &::muda::$type {
99-
self.inner.as_ref().unwrap()
100+
&self.inner
100101
}
101102
}
102103

103-
104104
$(#[$attr])*
105105
pub struct $type<R: $crate::Runtime>(::std::sync::Arc<$inner<R>>);
106106

@@ -567,29 +567,29 @@ impl<R: Runtime> MenuItemKind<R> {
567567
match i {
568568
muda::MenuItemKind::MenuItem(i) => Self::MenuItem(MenuItem(Arc::new(MenuItemInner {
569569
id: i.id().clone(),
570-
inner: i.into(),
570+
inner: ManuallyDrop::new(i),
571571
app_handle,
572572
}))),
573573
muda::MenuItemKind::Submenu(i) => Self::Submenu(Submenu(Arc::new(SubmenuInner {
574574
id: i.id().clone(),
575-
inner: i.into(),
575+
inner: ManuallyDrop::new(i),
576576
app_handle,
577577
}))),
578578
muda::MenuItemKind::Predefined(i) => {
579579
Self::Predefined(PredefinedMenuItem(Arc::new(PredefinedMenuItemInner {
580580
id: i.id().clone(),
581-
inner: i.into(),
581+
inner: ManuallyDrop::new(i),
582582
app_handle,
583583
})))
584584
}
585585
muda::MenuItemKind::Check(i) => Self::Check(CheckMenuItem(Arc::new(CheckMenuItemInner {
586586
id: i.id().clone(),
587-
inner: i.into(),
587+
inner: ManuallyDrop::new(i),
588588
app_handle,
589589
}))),
590590
muda::MenuItemKind::Icon(i) => Self::Icon(IconMenuItem(Arc::new(IconMenuItemInner {
591591
id: i.id().clone(),
592-
inner: i.into(),
592+
inner: ManuallyDrop::new(i),
593593
app_handle,
594594
}))),
595595
}

crates/tauri/src/menu/normal.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5+
use std::mem::ManuallyDrop;
56
use std::sync::Arc;
67

78
use super::run_item_main_thread;
@@ -37,7 +38,7 @@ impl<R: Runtime> MenuItem<R> {
3738
let item = muda::MenuItem::new(text, enabled, accelerator);
3839
MenuItemInner {
3940
id: item.id().clone(),
40-
inner: Some(item),
41+
inner: ManuallyDrop::new(item),
4142
app_handle,
4243
}
4344
})?;
@@ -73,7 +74,7 @@ impl<R: Runtime> MenuItem<R> {
7374
let item = muda::MenuItem::with_id(id.clone(), text, enabled, accelerator);
7475
MenuItemInner {
7576
id,
76-
inner: Some(item),
77+
inner: ManuallyDrop::new(item),
7778
app_handle,
7879
}
7980
})?;

crates/tauri/src/menu/predefined.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5+
use std::mem::ManuallyDrop;
56
use std::sync::Arc;
67

78
use super::run_item_main_thread;
@@ -20,7 +21,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
2021
let item = muda::PredefinedMenuItem::separator();
2122
PredefinedMenuItemInner {
2223
id: item.id().clone(),
23-
inner: Some(item),
24+
inner: ManuallyDrop::new(item),
2425
app_handle,
2526
}
2627
})?;
@@ -39,7 +40,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
3940
let item = muda::PredefinedMenuItem::copy(text.as_deref());
4041
PredefinedMenuItemInner {
4142
id: item.id().clone(),
42-
inner: Some(item),
43+
inner: ManuallyDrop::new(item),
4344
app_handle,
4445
}
4546
})?;
@@ -58,7 +59,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
5859
let item = muda::PredefinedMenuItem::cut(text.as_deref());
5960
PredefinedMenuItemInner {
6061
id: item.id().clone(),
61-
inner: Some(item),
62+
inner: ManuallyDrop::new(item),
6263
app_handle,
6364
}
6465
})?;
@@ -77,7 +78,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
7778
let item = muda::PredefinedMenuItem::paste(text.as_deref());
7879
PredefinedMenuItemInner {
7980
id: item.id().clone(),
80-
inner: Some(item),
81+
inner: ManuallyDrop::new(item),
8182
app_handle,
8283
}
8384
})?;
@@ -96,7 +97,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
9697
let item = muda::PredefinedMenuItem::select_all(text.as_deref());
9798
PredefinedMenuItemInner {
9899
id: item.id().clone(),
99-
inner: Some(item),
100+
inner: ManuallyDrop::new(item),
100101
app_handle,
101102
}
102103
})?;
@@ -119,7 +120,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
119120
let item = muda::PredefinedMenuItem::undo(text.as_deref());
120121
PredefinedMenuItemInner {
121122
id: item.id().clone(),
122-
inner: Some(item),
123+
inner: ManuallyDrop::new(item),
123124
app_handle,
124125
}
125126
})?;
@@ -141,7 +142,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
141142
let item = muda::PredefinedMenuItem::redo(text.as_deref());
142143
PredefinedMenuItemInner {
143144
id: item.id().clone(),
144-
inner: Some(item),
145+
inner: ManuallyDrop::new(item),
145146
app_handle,
146147
}
147148
})?;
@@ -164,7 +165,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
164165
let item = muda::PredefinedMenuItem::minimize(text.as_deref());
165166
PredefinedMenuItemInner {
166167
id: item.id().clone(),
167-
inner: Some(item),
168+
inner: ManuallyDrop::new(item),
168169
app_handle,
169170
}
170171
})?;
@@ -187,7 +188,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
187188
let item = muda::PredefinedMenuItem::maximize(text.as_deref());
188189
PredefinedMenuItemInner {
189190
id: item.id().clone(),
190-
inner: Some(item),
191+
inner: ManuallyDrop::new(item),
191192
app_handle,
192193
}
193194
})?;
@@ -210,7 +211,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
210211
let item = muda::PredefinedMenuItem::fullscreen(text.as_deref());
211212
PredefinedMenuItemInner {
212213
id: item.id().clone(),
213-
inner: Some(item),
214+
inner: ManuallyDrop::new(item),
214215
app_handle,
215216
}
216217
})?;
@@ -233,7 +234,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
233234
let item = muda::PredefinedMenuItem::hide(text.as_deref());
234235
PredefinedMenuItemInner {
235236
id: item.id().clone(),
236-
inner: Some(item),
237+
inner: ManuallyDrop::new(item),
237238
app_handle,
238239
}
239240
})?;
@@ -256,7 +257,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
256257
let item = muda::PredefinedMenuItem::hide_others(text.as_deref());
257258
PredefinedMenuItemInner {
258259
id: item.id().clone(),
259-
inner: Some(item),
260+
inner: ManuallyDrop::new(item),
260261
app_handle,
261262
}
262263
})?;
@@ -279,7 +280,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
279280
let item = muda::PredefinedMenuItem::show_all(text.as_deref());
280281
PredefinedMenuItemInner {
281282
id: item.id().clone(),
282-
inner: Some(item),
283+
inner: ManuallyDrop::new(item),
283284
app_handle,
284285
}
285286
})?;
@@ -302,7 +303,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
302303
let item = muda::PredefinedMenuItem::close_window(text.as_deref());
303304
PredefinedMenuItemInner {
304305
id: item.id().clone(),
305-
inner: Some(item),
306+
inner: ManuallyDrop::new(item),
306307
app_handle,
307308
}
308309
})?;
@@ -325,7 +326,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
325326
let item = muda::PredefinedMenuItem::quit(text.as_deref());
326327
PredefinedMenuItemInner {
327328
id: item.id().clone(),
328-
inner: Some(item),
329+
inner: ManuallyDrop::new(item),
329330
app_handle,
330331
}
331332
})?;
@@ -353,7 +354,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
353354
let item = muda::PredefinedMenuItem::about(text.as_deref(), metadata);
354355
PredefinedMenuItemInner {
355356
id: item.id().clone(),
356-
inner: Some(item),
357+
inner: ManuallyDrop::new(item),
357358
app_handle,
358359
}
359360
})?;
@@ -376,7 +377,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
376377
let item = muda::PredefinedMenuItem::services(text.as_deref());
377378
PredefinedMenuItemInner {
378379
id: item.id().clone(),
379-
inner: Some(item),
380+
inner: ManuallyDrop::new(item),
380381
app_handle,
381382
}
382383
})?;
@@ -399,7 +400,7 @@ impl<R: Runtime> PredefinedMenuItem<R> {
399400
let item = muda::PredefinedMenuItem::bring_all_to_front(text.as_deref());
400401
PredefinedMenuItemInner {
401402
id: item.id().clone(),
402-
inner: Some(item),
403+
inner: ManuallyDrop::new(item),
403404
app_handle,
404405
}
405406
})?;

0 commit comments

Comments
 (0)