@@ -57,6 +57,9 @@ use std::{
5757 } ,
5858} ;
5959
60+ #[ cfg( feature = "menu" ) ]
61+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
62+
6063#[ cfg( any( feature = "menu" , feature = "system-tray" ) ) ]
6164mod menu;
6265#[ cfg( any( feature = "menu" , feature = "system-tray" ) ) ]
@@ -456,6 +459,8 @@ enum WindowMessage {
456459 IsDecorated ( Sender < bool > ) ,
457460 IsResizable ( Sender < bool > ) ,
458461 IsVisible ( Sender < bool > ) ,
462+ #[ cfg( feature = "menu" ) ]
463+ IsMenuVisible ( Sender < bool > ) ,
459464 CurrentMonitor ( Sender < Option < MonitorHandle > > ) ,
460465 PrimaryMonitor ( Sender < Option < MonitorHandle > > ) ,
461466 AvailableMonitors ( Sender < Vec < MonitorHandle > > ) ,
@@ -469,6 +474,10 @@ enum WindowMessage {
469474 Unmaximize ,
470475 Minimize ,
471476 Unminimize ,
477+ #[ cfg( feature = "menu" ) ]
478+ ShowMenu ,
479+ #[ cfg( feature = "menu" ) ]
480+ HideMenu ,
472481 Show ,
473482 Hide ,
474483 Close ,
@@ -618,6 +627,11 @@ impl Dispatch for WryDispatcher {
618627 Ok ( dispatcher_getter ! ( self , WindowMessage :: IsVisible ) )
619628 }
620629
630+ #[ cfg( feature = "menu" ) ]
631+ fn is_menu_visible ( & self ) -> Result < bool > {
632+ Ok ( dispatcher_getter ! ( self , WindowMessage :: IsMenuVisible ) )
633+ }
634+
621635 fn current_monitor ( & self ) -> Result < Option < Monitor > > {
622636 Ok (
623637 dispatcher_getter ! ( self , WindowMessage :: CurrentMonitor )
@@ -741,6 +755,24 @@ impl Dispatch for WryDispatcher {
741755 . map_err ( |_| Error :: FailedToSendMessage )
742756 }
743757
758+ #[ cfg( feature = "menu" ) ]
759+ fn show_menu ( & self ) -> Result < ( ) > {
760+ self
761+ . context
762+ . proxy
763+ . send_event ( Message :: Window ( self . window_id , WindowMessage :: ShowMenu ) )
764+ . map_err ( |_| Error :: FailedToSendMessage )
765+ }
766+
767+ #[ cfg( feature = "menu" ) ]
768+ fn hide_menu ( & self ) -> Result < ( ) > {
769+ self
770+ . context
771+ . proxy
772+ . send_event ( Message :: Window ( self . window_id , WindowMessage :: HideMenu ) )
773+ . map_err ( |_| Error :: FailedToSendMessage )
774+ }
775+
744776 fn show ( & self ) -> Result < ( ) > {
745777 self
746778 . context
@@ -916,6 +948,8 @@ struct WebviewWrapper {
916948 inner : WebView ,
917949 #[ cfg( feature = "menu" ) ]
918950 menu_items : HashMap < u32 , WryCustomMenuItem > ,
951+ #[ cfg( feature = "menu" ) ]
952+ is_menu_visible : AtomicBool ,
919953}
920954
921955/// A Tauri [`Runtime`] wrapper around wry.
@@ -1275,6 +1309,10 @@ fn handle_event_loop(
12751309 WindowMessage :: IsDecorated ( tx) => tx. send ( window. is_decorated ( ) ) . unwrap ( ) ,
12761310 WindowMessage :: IsResizable ( tx) => tx. send ( window. is_resizable ( ) ) . unwrap ( ) ,
12771311 WindowMessage :: IsVisible ( tx) => tx. send ( window. is_visible ( ) ) . unwrap ( ) ,
1312+ #[ cfg( feature = "menu" ) ]
1313+ WindowMessage :: IsMenuVisible ( tx) => tx
1314+ . send ( webview. is_menu_visible . load ( Ordering :: Relaxed ) )
1315+ . unwrap ( ) ,
12781316 WindowMessage :: CurrentMonitor ( tx) => tx. send ( window. current_monitor ( ) ) . unwrap ( ) ,
12791317 WindowMessage :: PrimaryMonitor ( tx) => tx. send ( window. primary_monitor ( ) ) . unwrap ( ) ,
12801318 WindowMessage :: AvailableMonitors ( tx) => {
@@ -1295,6 +1333,16 @@ fn handle_event_loop(
12951333 WindowMessage :: Unmaximize => window. set_maximized ( false ) ,
12961334 WindowMessage :: Minimize => window. set_minimized ( true ) ,
12971335 WindowMessage :: Unminimize => window. set_minimized ( false ) ,
1336+ #[ cfg( feature = "menu" ) ]
1337+ WindowMessage :: ShowMenu => {
1338+ window. show_menu ( ) ;
1339+ webview. is_menu_visible . store ( true , Ordering :: Relaxed ) ;
1340+ }
1341+ #[ cfg( feature = "menu" ) ]
1342+ WindowMessage :: HideMenu => {
1343+ window. hide_menu ( ) ;
1344+ webview. is_menu_visible . store ( false , Ordering :: Relaxed ) ;
1345+ }
12981346 WindowMessage :: Show => window. set_visible ( true ) ,
12991347 WindowMessage :: Hide => window. set_visible ( false ) ,
13001348 WindowMessage :: Close => {
@@ -1494,6 +1542,8 @@ fn create_webview<P: Params<Runtime = Wry>>(
14941542 inner : webview,
14951543 #[ cfg( feature = "menu" ) ]
14961544 menu_items,
1545+ #[ cfg( feature = "menu" ) ]
1546+ is_menu_visible : AtomicBool :: new ( true ) ,
14971547 } )
14981548}
14991549
0 commit comments