|
@@ -57,6 +57,9 @@ use std::{
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+#[cfg(feature = "menu")]
|
|
|
+use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
+
|
|
|
#[cfg(any(feature = "menu", feature = "system-tray"))]
|
|
|
mod menu;
|
|
|
#[cfg(any(feature = "menu", feature = "system-tray"))]
|
|
@@ -456,6 +459,8 @@ enum WindowMessage {
|
|
|
IsDecorated(Sender<bool>),
|
|
|
IsResizable(Sender<bool>),
|
|
|
IsVisible(Sender<bool>),
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ IsMenuVisible(Sender<bool>),
|
|
|
CurrentMonitor(Sender<Option<MonitorHandle>>),
|
|
|
PrimaryMonitor(Sender<Option<MonitorHandle>>),
|
|
|
AvailableMonitors(Sender<Vec<MonitorHandle>>),
|
|
@@ -469,6 +474,10 @@ enum WindowMessage {
|
|
|
Unmaximize,
|
|
|
Minimize,
|
|
|
Unminimize,
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ ShowMenu,
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ HideMenu,
|
|
|
Show,
|
|
|
Hide,
|
|
|
Close,
|
|
@@ -618,6 +627,11 @@ impl Dispatch for WryDispatcher {
|
|
|
Ok(dispatcher_getter!(self, WindowMessage::IsVisible))
|
|
|
}
|
|
|
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ fn is_menu_visible(&self) -> Result<bool> {
|
|
|
+ Ok(dispatcher_getter!(self, WindowMessage::IsMenuVisible))
|
|
|
+ }
|
|
|
+
|
|
|
fn current_monitor(&self) -> Result<Option<Monitor>> {
|
|
|
Ok(
|
|
|
dispatcher_getter!(self, WindowMessage::CurrentMonitor)
|
|
@@ -741,6 +755,24 @@ impl Dispatch for WryDispatcher {
|
|
|
.map_err(|_| Error::FailedToSendMessage)
|
|
|
}
|
|
|
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ fn show_menu(&self) -> Result<()> {
|
|
|
+ self
|
|
|
+ .context
|
|
|
+ .proxy
|
|
|
+ .send_event(Message::Window(self.window_id, WindowMessage::ShowMenu))
|
|
|
+ .map_err(|_| Error::FailedToSendMessage)
|
|
|
+ }
|
|
|
+
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ fn hide_menu(&self) -> Result<()> {
|
|
|
+ self
|
|
|
+ .context
|
|
|
+ .proxy
|
|
|
+ .send_event(Message::Window(self.window_id, WindowMessage::HideMenu))
|
|
|
+ .map_err(|_| Error::FailedToSendMessage)
|
|
|
+ }
|
|
|
+
|
|
|
fn show(&self) -> Result<()> {
|
|
|
self
|
|
|
.context
|
|
@@ -916,6 +948,8 @@ struct WebviewWrapper {
|
|
|
inner: WebView,
|
|
|
#[cfg(feature = "menu")]
|
|
|
menu_items: HashMap<u32, WryCustomMenuItem>,
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ is_menu_visible: AtomicBool,
|
|
|
}
|
|
|
|
|
|
/// A Tauri [`Runtime`] wrapper around wry.
|
|
@@ -1275,6 +1309,10 @@ fn handle_event_loop(
|
|
|
WindowMessage::IsDecorated(tx) => tx.send(window.is_decorated()).unwrap(),
|
|
|
WindowMessage::IsResizable(tx) => tx.send(window.is_resizable()).unwrap(),
|
|
|
WindowMessage::IsVisible(tx) => tx.send(window.is_visible()).unwrap(),
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ WindowMessage::IsMenuVisible(tx) => tx
|
|
|
+ .send(webview.is_menu_visible.load(Ordering::Relaxed))
|
|
|
+ .unwrap(),
|
|
|
WindowMessage::CurrentMonitor(tx) => tx.send(window.current_monitor()).unwrap(),
|
|
|
WindowMessage::PrimaryMonitor(tx) => tx.send(window.primary_monitor()).unwrap(),
|
|
|
WindowMessage::AvailableMonitors(tx) => {
|
|
@@ -1295,6 +1333,16 @@ fn handle_event_loop(
|
|
|
WindowMessage::Unmaximize => window.set_maximized(false),
|
|
|
WindowMessage::Minimize => window.set_minimized(true),
|
|
|
WindowMessage::Unminimize => window.set_minimized(false),
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ WindowMessage::ShowMenu => {
|
|
|
+ window.show_menu();
|
|
|
+ webview.is_menu_visible.store(true, Ordering::Relaxed);
|
|
|
+ }
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ WindowMessage::HideMenu => {
|
|
|
+ window.hide_menu();
|
|
|
+ webview.is_menu_visible.store(false, Ordering::Relaxed);
|
|
|
+ }
|
|
|
WindowMessage::Show => window.set_visible(true),
|
|
|
WindowMessage::Hide => window.set_visible(false),
|
|
|
WindowMessage::Close => {
|
|
@@ -1494,6 +1542,8 @@ fn create_webview<P: Params<Runtime = Wry>>(
|
|
|
inner: webview,
|
|
|
#[cfg(feature = "menu")]
|
|
|
menu_items,
|
|
|
+ #[cfg(feature = "menu")]
|
|
|
+ is_menu_visible: AtomicBool::new(true),
|
|
|
})
|
|
|
}
|
|
|
|