@@ -9,7 +9,7 @@ use tauri_runtime::{
99 Request as HttpRequest , RequestParts as HttpRequestParts , Response as HttpResponse ,
1010 ResponseParts as HttpResponseParts ,
1111 } ,
12- menu:: { CustomMenuItem , Menu , MenuEntry , MenuHash , MenuItem , MenuUpdate , Submenu } ,
12+ menu:: { CustomMenuItem , Menu , MenuEntry , MenuHash , MenuId , MenuItem , MenuUpdate } ,
1313 monitor:: Monitor ,
1414 webview:: {
1515 FileDropEvent , FileDropHandler , RpcRequest , WebviewRpcHandler , WindowBuilder , WindowBuilderBase ,
@@ -693,7 +693,7 @@ impl From<UserAttentionType> for UserAttentionTypeWrapper {
693693pub struct WindowBuilderWrapper {
694694 inner : WryWindowBuilder ,
695695 center : bool ,
696- menu : Menu ,
696+ menu : Option < Menu > ,
697697}
698698
699699// safe since `menu_items` are read only here
@@ -736,7 +736,7 @@ impl WindowBuilder for WindowBuilderWrapper {
736736 }
737737
738738 fn menu ( mut self , menu : Menu ) -> Self {
739- self . menu = convert_menu_id ( Menu :: new ( ) , menu) ;
739+ self . menu . replace ( menu) ;
740740 self
741741 }
742742
@@ -857,8 +857,8 @@ impl WindowBuilder for WindowBuilderWrapper {
857857 self . inner . window . window_icon . is_some ( )
858858 }
859859
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 ( )
862862 }
863863}
864864
@@ -1206,6 +1206,7 @@ impl Dispatch for WryDispatcher {
12061206 ) -> Result < DetachedWindow < Self :: Runtime > > {
12071207 let ( tx, rx) = channel ( ) ;
12081208 let label = pending. label . clone ( ) ;
1209+ let menu_ids = pending. menu_ids . clone ( ) ;
12091210 let context = self . context . clone ( ) ;
12101211
12111212 send_user_message (
@@ -1223,7 +1224,11 @@ impl Dispatch for WryDispatcher {
12231224 window_id,
12241225 context : self . context . clone ( ) ,
12251226 } ;
1226- Ok ( DetachedWindow { label, dispatcher } )
1227+ Ok ( DetachedWindow {
1228+ label,
1229+ dispatcher,
1230+ menu_ids,
1231+ } )
12271232 }
12281233
12291234 fn set_resizable ( & self , resizable : bool ) -> Result < ( ) > {
@@ -1451,7 +1456,7 @@ impl WindowHandle {
14511456pub struct WindowWrapper {
14521457 label : String ,
14531458 inner : WindowHandle ,
1454- menu_items : HashMap < u16 , WryCustomMenuItem > ,
1459+ menu_items : Option < HashMap < u16 , WryCustomMenuItem > > ,
14551460}
14561461
14571462/// A Tauri [`Runtime`] wrapper around wry.
@@ -1509,6 +1514,7 @@ impl RuntimeHandle for WryHandle {
15091514 ) -> Result < DetachedWindow < Self :: Runtime > > {
15101515 let ( tx, rx) = channel ( ) ;
15111516 let label = pending. label . clone ( ) ;
1517+ let menu_ids = pending. menu_ids . clone ( ) ;
15121518 let context = self . context . clone ( ) ;
15131519 send_user_message (
15141520 & self . context ,
@@ -1525,7 +1531,11 @@ impl RuntimeHandle for WryHandle {
15251531 window_id,
15261532 context : self . context . clone ( ) ,
15271533 } ;
1528- Ok ( DetachedWindow { label, dispatcher } )
1534+ Ok ( DetachedWindow {
1535+ label,
1536+ dispatcher,
1537+ menu_ids,
1538+ } )
15291539 }
15301540
15311541 fn run_on_main_thread < F : FnOnce ( ) + Send + ' static > ( & self , f : F ) -> Result < ( ) > {
@@ -1632,6 +1642,7 @@ impl Runtime for Wry {
16321642
16331643 fn create_window ( & self , pending : PendingWindow < Self > ) -> Result < DetachedWindow < Self > > {
16341644 let label = pending. label . clone ( ) ;
1645+ let menu_ids = pending. menu_ids . clone ( ) ;
16351646 let proxy = self . event_loop . create_proxy ( ) ;
16361647 let webview = create_webview (
16371648 & self . event_loop ,
@@ -1717,7 +1728,11 @@ impl Runtime for Wry {
17171728 . unwrap ( )
17181729 . insert ( webview. inner . window ( ) . id ( ) , webview) ;
17191730
1720- Ok ( DetachedWindow { label, dispatcher } )
1731+ Ok ( DetachedWindow {
1732+ label,
1733+ dispatcher,
1734+ menu_ids,
1735+ } )
17211736 }
17221737
17231738 #[ cfg( feature = "system-tray" ) ]
@@ -2006,17 +2021,16 @@ fn handle_user_message(
20062021 let _ = window. drag_window ( ) ;
20072022 }
20082023 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+ }
20202034 }
20212035 }
20222036 }
@@ -2464,38 +2478,6 @@ fn center_window(window: &Window, window_size: WryPhysicalSize<u32>) -> Result<(
24642478 }
24652479}
24662480
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-
24992481fn to_wry_menu (
25002482 custom_menu_items : & mut HashMap < MenuHash , WryCustomMenuItem > ,
25012483 menu : Menu ,
@@ -2544,15 +2526,18 @@ fn create_webview(
25442526 file_drop_handler,
25452527 label,
25462528 url,
2529+ menu_ids,
25472530 ..
25482531 } = pending;
25492532
25502533 let is_window_transparent = window_builder. inner . window . transparent ;
2551- let menu_items = {
2534+ let menu_items = if let Some ( menu ) = window_builder . menu {
25522535 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) ;
25542537 window_builder. inner = window_builder. inner . with_menu ( menu) ;
2555- menu_items
2538+ Some ( menu_items)
2539+ } else {
2540+ None
25562541 } ;
25572542 let window = window_builder. inner . build ( event_loop) . unwrap ( ) ;
25582543
@@ -2577,13 +2562,18 @@ fn create_webview(
25772562 . unwrap ( ) // safe to unwrap because we validate the URL beforehand
25782563 . with_transparent ( is_window_transparent) ;
25792564 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+ ) ) ;
25822571 }
25832572 if let Some ( handler) = file_drop_handler {
25842573 webview_builder = webview_builder. with_file_drop_handler ( create_file_drop_handler (
25852574 context,
25862575 label. clone ( ) ,
2576+ menu_ids,
25872577 handler,
25882578 ) ) ;
25892579 }
@@ -2639,6 +2629,7 @@ fn create_webview(
26392629fn create_rpc_handler (
26402630 context : Context ,
26412631 label : String ,
2632+ menu_ids : HashMap < MenuHash , MenuId > ,
26422633 handler : WebviewRpcHandler < Wry > ,
26432634) -> Box < dyn Fn ( & Window , WryRpcRequest ) -> Option < RpcResponse > + ' static > {
26442635 Box :: new ( move |window, request| {
@@ -2649,6 +2640,7 @@ fn create_rpc_handler(
26492640 context : context. clone ( ) ,
26502641 } ,
26512642 label : label. clone ( ) ,
2643+ menu_ids : menu_ids. clone ( ) ,
26522644 } ,
26532645 RpcRequestWrapper ( request) . into ( ) ,
26542646 ) ;
@@ -2660,6 +2652,7 @@ fn create_rpc_handler(
26602652fn create_file_drop_handler (
26612653 context : Context ,
26622654 label : String ,
2655+ menu_ids : HashMap < MenuHash , MenuId > ,
26632656 handler : FileDropHandler < Wry > ,
26642657) -> Box < dyn Fn ( & Window , WryFileDropEvent ) -> bool + ' static > {
26652658 Box :: new ( move |window, event| {
@@ -2671,6 +2664,7 @@ fn create_file_drop_handler(
26712664 context : context. clone ( ) ,
26722665 } ,
26732666 label : label. clone ( ) ,
2667+ menu_ids : menu_ids. clone ( ) ,
26742668 } ,
26752669 )
26762670 } )
0 commit comments