@@ -9,7 +9,7 @@ use tauri_runtime::{
9
9
Request as HttpRequest , RequestParts as HttpRequestParts , Response as HttpResponse ,
10
10
ResponseParts as HttpResponseParts ,
11
11
} ,
12
- menu:: { CustomMenuItem , Menu , MenuEntry , MenuHash , MenuItem , MenuUpdate , Submenu } ,
12
+ menu:: { CustomMenuItem , Menu , MenuEntry , MenuHash , MenuId , MenuItem , MenuUpdate } ,
13
13
monitor:: Monitor ,
14
14
webview:: {
15
15
FileDropEvent , FileDropHandler , RpcRequest , WebviewRpcHandler , WindowBuilder , WindowBuilderBase ,
@@ -693,7 +693,7 @@ impl From<UserAttentionType> for UserAttentionTypeWrapper {
693
693
pub struct WindowBuilderWrapper {
694
694
inner : WryWindowBuilder ,
695
695
center : bool ,
696
- menu : Menu ,
696
+ menu : Option < Menu > ,
697
697
}
698
698
699
699
// safe since `menu_items` are read only here
@@ -736,7 +736,7 @@ impl WindowBuilder for WindowBuilderWrapper {
736
736
}
737
737
738
738
fn menu ( mut self , menu : Menu ) -> Self {
739
- self . menu = convert_menu_id ( Menu :: new ( ) , menu) ;
739
+ self . menu . replace ( menu) ;
740
740
self
741
741
}
742
742
@@ -857,8 +857,8 @@ impl WindowBuilder for WindowBuilderWrapper {
857
857
self . inner . window . window_icon . is_some ( )
858
858
}
859
859
860
- fn has_menu ( & self ) -> bool {
861
- self . inner . window . window_menu . is_some ( )
860
+ fn get_menu ( & self ) -> Option < & Menu > {
861
+ self . menu . as_ref ( )
862
862
}
863
863
}
864
864
@@ -1206,6 +1206,7 @@ impl Dispatch for WryDispatcher {
1206
1206
) -> Result < DetachedWindow < Self :: Runtime > > {
1207
1207
let ( tx, rx) = channel ( ) ;
1208
1208
let label = pending. label . clone ( ) ;
1209
+ let menu_ids = pending. menu_ids . clone ( ) ;
1209
1210
let context = self . context . clone ( ) ;
1210
1211
1211
1212
send_user_message (
@@ -1223,7 +1224,11 @@ impl Dispatch for WryDispatcher {
1223
1224
window_id,
1224
1225
context : self . context . clone ( ) ,
1225
1226
} ;
1226
- Ok ( DetachedWindow { label, dispatcher } )
1227
+ Ok ( DetachedWindow {
1228
+ label,
1229
+ dispatcher,
1230
+ menu_ids,
1231
+ } )
1227
1232
}
1228
1233
1229
1234
fn set_resizable ( & self , resizable : bool ) -> Result < ( ) > {
@@ -1451,7 +1456,7 @@ impl WindowHandle {
1451
1456
pub struct WindowWrapper {
1452
1457
label : String ,
1453
1458
inner : WindowHandle ,
1454
- menu_items : HashMap < u16 , WryCustomMenuItem > ,
1459
+ menu_items : Option < HashMap < u16 , WryCustomMenuItem > > ,
1455
1460
}
1456
1461
1457
1462
/// A Tauri [`Runtime`] wrapper around wry.
@@ -1509,6 +1514,7 @@ impl RuntimeHandle for WryHandle {
1509
1514
) -> Result < DetachedWindow < Self :: Runtime > > {
1510
1515
let ( tx, rx) = channel ( ) ;
1511
1516
let label = pending. label . clone ( ) ;
1517
+ let menu_ids = pending. menu_ids . clone ( ) ;
1512
1518
let context = self . context . clone ( ) ;
1513
1519
send_user_message (
1514
1520
& self . context ,
@@ -1525,7 +1531,11 @@ impl RuntimeHandle for WryHandle {
1525
1531
window_id,
1526
1532
context : self . context . clone ( ) ,
1527
1533
} ;
1528
- Ok ( DetachedWindow { label, dispatcher } )
1534
+ Ok ( DetachedWindow {
1535
+ label,
1536
+ dispatcher,
1537
+ menu_ids,
1538
+ } )
1529
1539
}
1530
1540
1531
1541
fn run_on_main_thread < F : FnOnce ( ) + Send + ' static > ( & self , f : F ) -> Result < ( ) > {
@@ -1632,6 +1642,7 @@ impl Runtime for Wry {
1632
1642
1633
1643
fn create_window ( & self , pending : PendingWindow < Self > ) -> Result < DetachedWindow < Self > > {
1634
1644
let label = pending. label . clone ( ) ;
1645
+ let menu_ids = pending. menu_ids . clone ( ) ;
1635
1646
let proxy = self . event_loop . create_proxy ( ) ;
1636
1647
let webview = create_webview (
1637
1648
& self . event_loop ,
@@ -1717,7 +1728,11 @@ impl Runtime for Wry {
1717
1728
. unwrap ( )
1718
1729
. insert ( webview. inner . window ( ) . id ( ) , webview) ;
1719
1730
1720
- Ok ( DetachedWindow { label, dispatcher } )
1731
+ Ok ( DetachedWindow {
1732
+ label,
1733
+ dispatcher,
1734
+ menu_ids,
1735
+ } )
1721
1736
}
1722
1737
1723
1738
#[ cfg( feature = "system-tray" ) ]
@@ -2006,17 +2021,16 @@ fn handle_user_message(
2006
2021
let _ = window. drag_window ( ) ;
2007
2022
}
2008
2023
WindowMessage :: UpdateMenuItem ( id, update) => {
2009
- let item = webview
2010
- . menu_items
2011
- . get_mut ( & id)
2012
- . expect ( "menu item not found" ) ;
2013
- match update {
2014
- MenuUpdate :: SetEnabled ( enabled) => item. set_enabled ( enabled) ,
2015
- MenuUpdate :: SetTitle ( title) => item. set_title ( & title) ,
2016
- MenuUpdate :: SetSelected ( selected) => item. set_selected ( selected) ,
2017
- #[ cfg( target_os = "macos" ) ]
2018
- MenuUpdate :: SetNativeImage ( image) => {
2019
- item. set_native_image ( NativeImageWrapper :: from ( image) . 0 )
2024
+ if let Some ( menu_items) = webview. menu_items . as_mut ( ) {
2025
+ let item = menu_items. get_mut ( & id) . expect ( "menu item not found" ) ;
2026
+ match update {
2027
+ MenuUpdate :: SetEnabled ( enabled) => item. set_enabled ( enabled) ,
2028
+ MenuUpdate :: SetTitle ( title) => item. set_title ( & title) ,
2029
+ MenuUpdate :: SetSelected ( selected) => item. set_selected ( selected) ,
2030
+ #[ cfg( target_os = "macos" ) ]
2031
+ MenuUpdate :: SetNativeImage ( image) => {
2032
+ item. set_native_image ( NativeImageWrapper :: from ( image) . 0 )
2033
+ }
2020
2034
}
2021
2035
}
2022
2036
}
@@ -2464,38 +2478,6 @@ fn center_window(window: &Window, window_size: WryPhysicalSize<u32>) -> Result<(
2464
2478
}
2465
2479
}
2466
2480
2467
- fn convert_menu_id ( mut new_menu : Menu , menu : Menu ) -> Menu {
2468
- for item in menu. items {
2469
- match item {
2470
- MenuEntry :: CustomItem ( c) => {
2471
- let mut item = CustomMenuItem :: new ( c. id_str , c. title ) ;
2472
- #[ cfg( target_os = "macos" ) ]
2473
- if let Some ( native_image) = c. native_image {
2474
- item = item. native_image ( native_image) ;
2475
- }
2476
- if let Some ( accelerator) = c. keyboard_accelerator {
2477
- item = item. accelerator ( accelerator) ;
2478
- }
2479
- if !c. enabled {
2480
- item = item. disabled ( ) ;
2481
- }
2482
- if c. selected {
2483
- item = item. selected ( ) ;
2484
- }
2485
- new_menu = new_menu. add_item ( item) ;
2486
- }
2487
- MenuEntry :: NativeItem ( i) => {
2488
- new_menu = new_menu. add_native_item ( i) ;
2489
- }
2490
- MenuEntry :: Submenu ( submenu) => {
2491
- let new_submenu = convert_menu_id ( Menu :: new ( ) , submenu. inner ) ;
2492
- new_menu = new_menu. add_submenu ( Submenu :: new ( submenu. title , new_submenu) ) ;
2493
- }
2494
- }
2495
- }
2496
- new_menu
2497
- }
2498
-
2499
2481
fn to_wry_menu (
2500
2482
custom_menu_items : & mut HashMap < MenuHash , WryCustomMenuItem > ,
2501
2483
menu : Menu ,
@@ -2544,15 +2526,18 @@ fn create_webview(
2544
2526
file_drop_handler,
2545
2527
label,
2546
2528
url,
2529
+ menu_ids,
2547
2530
..
2548
2531
} = pending;
2549
2532
2550
2533
let is_window_transparent = window_builder. inner . window . transparent ;
2551
- let menu_items = {
2534
+ let menu_items = if let Some ( menu ) = window_builder . menu {
2552
2535
let mut menu_items = HashMap :: new ( ) ;
2553
- let menu = to_wry_menu ( & mut menu_items, window_builder . menu ) ;
2536
+ let menu = to_wry_menu ( & mut menu_items, menu) ;
2554
2537
window_builder. inner = window_builder. inner . with_menu ( menu) ;
2555
- menu_items
2538
+ Some ( menu_items)
2539
+ } else {
2540
+ None
2556
2541
} ;
2557
2542
let window = window_builder. inner . build ( event_loop) . unwrap ( ) ;
2558
2543
@@ -2577,13 +2562,18 @@ fn create_webview(
2577
2562
. unwrap ( ) // safe to unwrap because we validate the URL beforehand
2578
2563
. with_transparent ( is_window_transparent) ;
2579
2564
if let Some ( handler) = rpc_handler {
2580
- webview_builder =
2581
- webview_builder. with_rpc_handler ( create_rpc_handler ( context. clone ( ) , label. clone ( ) , handler) ) ;
2565
+ webview_builder = webview_builder. with_rpc_handler ( create_rpc_handler (
2566
+ context. clone ( ) ,
2567
+ label. clone ( ) ,
2568
+ menu_ids. clone ( ) ,
2569
+ handler,
2570
+ ) ) ;
2582
2571
}
2583
2572
if let Some ( handler) = file_drop_handler {
2584
2573
webview_builder = webview_builder. with_file_drop_handler ( create_file_drop_handler (
2585
2574
context,
2586
2575
label. clone ( ) ,
2576
+ menu_ids,
2587
2577
handler,
2588
2578
) ) ;
2589
2579
}
@@ -2639,6 +2629,7 @@ fn create_webview(
2639
2629
fn create_rpc_handler (
2640
2630
context : Context ,
2641
2631
label : String ,
2632
+ menu_ids : HashMap < MenuHash , MenuId > ,
2642
2633
handler : WebviewRpcHandler < Wry > ,
2643
2634
) -> Box < dyn Fn ( & Window , WryRpcRequest ) -> Option < RpcResponse > + ' static > {
2644
2635
Box :: new ( move |window, request| {
@@ -2649,6 +2640,7 @@ fn create_rpc_handler(
2649
2640
context : context. clone ( ) ,
2650
2641
} ,
2651
2642
label : label. clone ( ) ,
2643
+ menu_ids : menu_ids. clone ( ) ,
2652
2644
} ,
2653
2645
RpcRequestWrapper ( request) . into ( ) ,
2654
2646
) ;
@@ -2660,6 +2652,7 @@ fn create_rpc_handler(
2660
2652
fn create_file_drop_handler (
2661
2653
context : Context ,
2662
2654
label : String ,
2655
+ menu_ids : HashMap < MenuHash , MenuId > ,
2663
2656
handler : FileDropHandler < Wry > ,
2664
2657
) -> Box < dyn Fn ( & Window , WryFileDropEvent ) -> bool + ' static > {
2665
2658
Box :: new ( move |window, event| {
@@ -2671,6 +2664,7 @@ fn create_file_drop_handler(
2671
2664
context : context. clone ( ) ,
2672
2665
} ,
2673
2666
label : label. clone ( ) ,
2667
+ menu_ids : menu_ids. clone ( ) ,
2674
2668
} ,
2675
2669
)
2676
2670
} )
0 commit comments