|
@@ -5,6 +5,7 @@
|
|
|
//! The [`wry`] Tauri [`Runtime`].
|
|
|
|
|
|
use tauri_runtime::{
|
|
|
+ menu::{CustomMenuItem, Menu, MenuEntry, MenuHash, MenuItem, MenuUpdate, Submenu},
|
|
|
monitor::Monitor,
|
|
|
webview::{
|
|
|
FileDropEvent, FileDropHandler, RpcRequest, WebviewRpcHandler, WindowBuilder, WindowBuilderBase,
|
|
@@ -17,7 +18,6 @@ use tauri_runtime::{
|
|
|
RunEvent, RunIteration, Runtime, RuntimeHandle, UserAttentionType,
|
|
|
};
|
|
|
|
|
|
-#[cfg(feature = "menu")]
|
|
|
use tauri_runtime::window::MenuEvent;
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
use tauri_runtime::{SystemTray, SystemTrayEvent};
|
|
@@ -49,6 +49,10 @@ use wry::{
|
|
|
event::{Event, WindowEvent as WryWindowEvent},
|
|
|
event_loop::{ControlFlow, EventLoop, EventLoopProxy, EventLoopWindowTarget},
|
|
|
global_shortcut::{GlobalShortcut, ShortcutManager as WryShortcutManager},
|
|
|
+ menu::{
|
|
|
+ CustomMenuItem as WryCustomMenuItem, MenuBar, MenuId as WryMenuId, MenuItem as WryMenuItem,
|
|
|
+ MenuItemAttributes as WryMenuItemAttributes, MenuType,
|
|
|
+ },
|
|
|
monitor::MonitorHandle,
|
|
|
window::{Fullscreen, Icon as WindowIcon, UserAttentionType as WryUserAttentionType},
|
|
|
},
|
|
@@ -63,6 +67,13 @@ pub use wry::application::window::{Window, WindowBuilder as WryWindowBuilder, Wi
|
|
|
#[cfg(target_os = "windows")]
|
|
|
use wry::webview::WebviewExtWindows;
|
|
|
|
|
|
+#[cfg(target_os = "macos")]
|
|
|
+use tauri_runtime::menu::NativeImage;
|
|
|
+#[cfg(target_os = "macos")]
|
|
|
+pub use wry::application::platform::macos::{
|
|
|
+ CustomMenuItemExtMacOS, NativeImage as WryNativeImage,
|
|
|
+};
|
|
|
+
|
|
|
use std::{
|
|
|
collections::{
|
|
|
hash_map::Entry::{Occupied, Vacant},
|
|
@@ -80,19 +91,25 @@ use std::{
|
|
|
thread::{current as current_thread, ThreadId},
|
|
|
};
|
|
|
|
|
|
-#[cfg(any(feature = "menu", feature = "system-tray"))]
|
|
|
-mod menu;
|
|
|
-#[cfg(any(feature = "menu", feature = "system-tray"))]
|
|
|
-use menu::*;
|
|
|
+#[cfg(feature = "system-tray")]
|
|
|
+mod system_tray;
|
|
|
+#[cfg(feature = "system-tray")]
|
|
|
+use system_tray::*;
|
|
|
|
|
|
mod mime_type;
|
|
|
use mime_type::MimeType;
|
|
|
|
|
|
type WebContextStore = Mutex<HashMap<Option<PathBuf>, WebContext>>;
|
|
|
+// window
|
|
|
type WindowEventHandler = Box<dyn Fn(&WindowEvent) + Send>;
|
|
|
type WindowEventListenersMap = Arc<Mutex<HashMap<Uuid, WindowEventHandler>>>;
|
|
|
type WindowEventListeners = Arc<Mutex<HashMap<WindowId, WindowEventListenersMap>>>;
|
|
|
+// global shortcut
|
|
|
type GlobalShortcutListeners = Arc<Mutex<HashMap<AcceleratorId, Box<dyn Fn() + Send>>>>;
|
|
|
+// menu
|
|
|
+pub type MenuEventHandler = Box<dyn Fn(&MenuEvent) + Send>;
|
|
|
+pub type MenuEventListeners = Arc<Mutex<HashMap<WindowId, WindowMenuEventListeners>>>;
|
|
|
+pub type WindowMenuEventListeners = Arc<Mutex<HashMap<Uuid, MenuEventHandler>>>;
|
|
|
|
|
|
macro_rules! dispatcher_getter {
|
|
|
($self: ident, $message: expr) => {{
|
|
@@ -134,6 +151,124 @@ struct EventLoopContext {
|
|
|
proxy: EventLoopProxy<Message>,
|
|
|
}
|
|
|
|
|
|
+pub struct MenuItemAttributesWrapper<'a>(pub WryMenuItemAttributes<'a>);
|
|
|
+
|
|
|
+impl<'a> From<&'a CustomMenuItem> for MenuItemAttributesWrapper<'a> {
|
|
|
+ fn from(item: &'a CustomMenuItem) -> Self {
|
|
|
+ let mut attributes = WryMenuItemAttributes::new(&item.title)
|
|
|
+ .with_enabled(item.enabled)
|
|
|
+ .with_selected(item.selected)
|
|
|
+ .with_id(WryMenuId(item.id));
|
|
|
+ if let Some(accelerator) = item.keyboard_accelerator.as_ref() {
|
|
|
+ attributes = attributes.with_accelerators(&accelerator.parse().expect("invalid accelerator"));
|
|
|
+ }
|
|
|
+ Self(attributes)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+pub struct MenuItemWrapper(pub WryMenuItem);
|
|
|
+
|
|
|
+impl From<MenuItem> for MenuItemWrapper {
|
|
|
+ fn from(item: MenuItem) -> Self {
|
|
|
+ match item {
|
|
|
+ MenuItem::About(v) => Self(WryMenuItem::About(v)),
|
|
|
+ MenuItem::Hide => Self(WryMenuItem::Hide),
|
|
|
+ MenuItem::Services => Self(WryMenuItem::Services),
|
|
|
+ MenuItem::HideOthers => Self(WryMenuItem::HideOthers),
|
|
|
+ MenuItem::ShowAll => Self(WryMenuItem::ShowAll),
|
|
|
+ MenuItem::CloseWindow => Self(WryMenuItem::CloseWindow),
|
|
|
+ MenuItem::Quit => Self(WryMenuItem::Quit),
|
|
|
+ MenuItem::Copy => Self(WryMenuItem::Copy),
|
|
|
+ MenuItem::Cut => Self(WryMenuItem::Cut),
|
|
|
+ MenuItem::Undo => Self(WryMenuItem::Undo),
|
|
|
+ MenuItem::Redo => Self(WryMenuItem::Redo),
|
|
|
+ MenuItem::SelectAll => Self(WryMenuItem::SelectAll),
|
|
|
+ MenuItem::Paste => Self(WryMenuItem::Paste),
|
|
|
+ MenuItem::EnterFullScreen => Self(WryMenuItem::EnterFullScreen),
|
|
|
+ MenuItem::Minimize => Self(WryMenuItem::Minimize),
|
|
|
+ MenuItem::Zoom => Self(WryMenuItem::Zoom),
|
|
|
+ MenuItem::Separator => Self(WryMenuItem::Separator),
|
|
|
+ _ => unimplemented!(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(target_os = "macos")]
|
|
|
+pub struct NativeImageWrapper(pub WryNativeImage);
|
|
|
+
|
|
|
+#[cfg(target_os = "macos")]
|
|
|
+impl std::fmt::Debug for NativeImageWrapper {
|
|
|
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
+ f.debug_struct("NativeImageWrapper").finish()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(target_os = "macos")]
|
|
|
+impl From<NativeImage> for NativeImageWrapper {
|
|
|
+ fn from(image: NativeImage) -> NativeImageWrapper {
|
|
|
+ let wry_image = match image {
|
|
|
+ NativeImage::Add => WryNativeImage::Add,
|
|
|
+ NativeImage::Advanced => WryNativeImage::Advanced,
|
|
|
+ NativeImage::Bluetooth => WryNativeImage::Bluetooth,
|
|
|
+ NativeImage::Bookmarks => WryNativeImage::Bookmarks,
|
|
|
+ NativeImage::Caution => WryNativeImage::Caution,
|
|
|
+ NativeImage::ColorPanel => WryNativeImage::ColorPanel,
|
|
|
+ NativeImage::ColumnView => WryNativeImage::ColumnView,
|
|
|
+ NativeImage::Computer => WryNativeImage::Computer,
|
|
|
+ NativeImage::EnterFullScreen => WryNativeImage::EnterFullScreen,
|
|
|
+ NativeImage::Everyone => WryNativeImage::Everyone,
|
|
|
+ NativeImage::ExitFullScreen => WryNativeImage::ExitFullScreen,
|
|
|
+ NativeImage::FlowView => WryNativeImage::FlowView,
|
|
|
+ NativeImage::Folder => WryNativeImage::Folder,
|
|
|
+ NativeImage::FolderBurnable => WryNativeImage::FolderBurnable,
|
|
|
+ NativeImage::FolderSmart => WryNativeImage::FolderSmart,
|
|
|
+ NativeImage::FollowLinkFreestanding => WryNativeImage::FollowLinkFreestanding,
|
|
|
+ NativeImage::FontPanel => WryNativeImage::FontPanel,
|
|
|
+ NativeImage::GoLeft => WryNativeImage::GoLeft,
|
|
|
+ NativeImage::GoRight => WryNativeImage::GoRight,
|
|
|
+ NativeImage::Home => WryNativeImage::Home,
|
|
|
+ NativeImage::IChatTheater => WryNativeImage::IChatTheater,
|
|
|
+ NativeImage::IconView => WryNativeImage::IconView,
|
|
|
+ NativeImage::Info => WryNativeImage::Info,
|
|
|
+ NativeImage::InvalidDataFreestanding => WryNativeImage::InvalidDataFreestanding,
|
|
|
+ NativeImage::LeftFacingTriangle => WryNativeImage::LeftFacingTriangle,
|
|
|
+ NativeImage::ListView => WryNativeImage::ListView,
|
|
|
+ NativeImage::LockLocked => WryNativeImage::LockLocked,
|
|
|
+ NativeImage::LockUnlocked => WryNativeImage::LockUnlocked,
|
|
|
+ NativeImage::MenuMixedState => WryNativeImage::MenuMixedState,
|
|
|
+ NativeImage::MenuOnState => WryNativeImage::MenuOnState,
|
|
|
+ NativeImage::MobileMe => WryNativeImage::MobileMe,
|
|
|
+ NativeImage::MultipleDocuments => WryNativeImage::MultipleDocuments,
|
|
|
+ NativeImage::Network => WryNativeImage::Network,
|
|
|
+ NativeImage::Path => WryNativeImage::Path,
|
|
|
+ NativeImage::PreferencesGeneral => WryNativeImage::PreferencesGeneral,
|
|
|
+ NativeImage::QuickLook => WryNativeImage::QuickLook,
|
|
|
+ NativeImage::RefreshFreestanding => WryNativeImage::RefreshFreestanding,
|
|
|
+ NativeImage::Refresh => WryNativeImage::Refresh,
|
|
|
+ NativeImage::Remove => WryNativeImage::Remove,
|
|
|
+ NativeImage::RevealFreestanding => WryNativeImage::RevealFreestanding,
|
|
|
+ NativeImage::RightFacingTriangle => WryNativeImage::RightFacingTriangle,
|
|
|
+ NativeImage::Share => WryNativeImage::Share,
|
|
|
+ NativeImage::Slideshow => WryNativeImage::Slideshow,
|
|
|
+ NativeImage::SmartBadge => WryNativeImage::SmartBadge,
|
|
|
+ NativeImage::StatusAvailable => WryNativeImage::StatusAvailable,
|
|
|
+ NativeImage::StatusNone => WryNativeImage::StatusNone,
|
|
|
+ NativeImage::StatusPartiallyAvailable => WryNativeImage::StatusPartiallyAvailable,
|
|
|
+ NativeImage::StatusUnavailable => WryNativeImage::StatusUnavailable,
|
|
|
+ NativeImage::StopProgressFreestanding => WryNativeImage::StopProgressFreestanding,
|
|
|
+ NativeImage::StopProgress => WryNativeImage::StopProgress,
|
|
|
+
|
|
|
+ NativeImage::TrashEmpty => WryNativeImage::TrashEmpty,
|
|
|
+ NativeImage::TrashFull => WryNativeImage::TrashFull,
|
|
|
+ NativeImage::User => WryNativeImage::User,
|
|
|
+ NativeImage::UserAccounts => WryNativeImage::UserAccounts,
|
|
|
+ NativeImage::UserGroup => WryNativeImage::UserGroup,
|
|
|
+ NativeImage::UserGuest => WryNativeImage::UserGuest,
|
|
|
+ };
|
|
|
+ Self(wry_image)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[derive(Debug, Clone)]
|
|
|
pub struct GlobalShortcutWrapper(GlobalShortcut);
|
|
|
|
|
@@ -438,7 +573,6 @@ impl From<UserAttentionType> for UserAttentionTypeWrapper {
|
|
|
pub struct WindowBuilderWrapper {
|
|
|
inner: WryWindowBuilder,
|
|
|
center: bool,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu: Menu,
|
|
|
}
|
|
|
|
|
@@ -481,7 +615,6 @@ impl WindowBuilder for WindowBuilderWrapper {
|
|
|
window
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
fn menu(mut self, menu: Menu) -> Self {
|
|
|
self.menu = convert_menu_id(Menu::new(), menu);
|
|
|
self
|
|
@@ -604,7 +737,6 @@ impl WindowBuilder for WindowBuilderWrapper {
|
|
|
self.inner.window.window_icon.is_some()
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
fn has_menu(&self) -> bool {
|
|
|
self.inner.window.window_menu.is_some()
|
|
|
}
|
|
@@ -675,7 +807,6 @@ pub 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>>),
|
|
@@ -701,9 +832,7 @@ pub enum WindowMessage {
|
|
|
Unmaximize,
|
|
|
Minimize,
|
|
|
Unminimize,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
ShowMenu,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
HideMenu,
|
|
|
Show,
|
|
|
Hide,
|
|
@@ -719,8 +848,7 @@ pub enum WindowMessage {
|
|
|
SetIcon(WindowIcon),
|
|
|
SetSkipTaskbar(bool),
|
|
|
DragWindow,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
- UpdateMenuItem(u16, menu::MenuUpdate),
|
|
|
+ UpdateMenuItem(u16, MenuUpdate),
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
@@ -740,7 +868,7 @@ pub enum WebviewEvent {
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
#[derive(Debug, Clone)]
|
|
|
pub enum TrayMessage {
|
|
|
- UpdateItem(u16, menu::MenuUpdate),
|
|
|
+ UpdateItem(u16, MenuUpdate),
|
|
|
UpdateIcon(Icon),
|
|
|
#[cfg(target_os = "macos")]
|
|
|
UpdateIconAsTemplate(bool),
|
|
@@ -786,7 +914,6 @@ struct DispatcherContext {
|
|
|
is_event_loop_running: Arc<AtomicBool>,
|
|
|
proxy: EventLoopProxy<Message>,
|
|
|
window_event_listeners: WindowEventListeners,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: MenuEventListeners,
|
|
|
}
|
|
|
|
|
@@ -834,7 +961,6 @@ impl Dispatch for WryDispatcher {
|
|
|
id
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
fn on_menu_event<F: Fn(&MenuEvent) + Send + 'static>(&self, f: F) -> Uuid {
|
|
|
let id = Uuid::new_v4();
|
|
|
self
|
|
@@ -894,7 +1020,6 @@ 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))
|
|
|
}
|
|
@@ -1052,7 +1177,6 @@ impl Dispatch for WryDispatcher {
|
|
|
.map_err(|_| Error::FailedToSendMessage)
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
fn show_menu(&self) -> Result<()> {
|
|
|
self
|
|
|
.context
|
|
@@ -1061,7 +1185,6 @@ impl Dispatch for WryDispatcher {
|
|
|
.map_err(|_| Error::FailedToSendMessage)
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
fn hide_menu(&self) -> Result<()> {
|
|
|
self
|
|
|
.context
|
|
@@ -1220,8 +1343,7 @@ impl Dispatch for WryDispatcher {
|
|
|
.map_err(|_| Error::FailedToSendMessage)
|
|
|
}
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
- fn update_menu_item(&self, id: u16, update: menu::MenuUpdate) -> Result<()> {
|
|
|
+ fn update_menu_item(&self, id: u16, update: MenuUpdate) -> Result<()> {
|
|
|
self
|
|
|
.context
|
|
|
.proxy
|
|
@@ -1258,7 +1380,6 @@ impl WindowHandle {
|
|
|
pub struct WindowWrapper {
|
|
|
label: String,
|
|
|
inner: WindowHandle,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_items: HashMap<u16, WryCustomMenuItem>,
|
|
|
}
|
|
|
|
|
@@ -1274,7 +1395,6 @@ pub struct Wry {
|
|
|
windows: Arc<Mutex<HashMap<WindowId, WindowWrapper>>>,
|
|
|
web_context: WebContextStore,
|
|
|
window_event_listeners: WindowEventListeners,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: MenuEventListeners,
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context: TrayContext,
|
|
@@ -1392,7 +1512,6 @@ impl Runtime for Wry {
|
|
|
windows: Default::default(),
|
|
|
web_context: Default::default(),
|
|
|
window_event_listeners: Default::default(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: Default::default(),
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context: Default::default(),
|
|
@@ -1406,7 +1525,6 @@ impl Runtime for Wry {
|
|
|
is_event_loop_running: self.is_event_loop_running.clone(),
|
|
|
proxy: self.event_loop.create_proxy(),
|
|
|
window_event_listeners: self.window_event_listeners.clone(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: self.menu_event_listeners.clone(),
|
|
|
},
|
|
|
}
|
|
@@ -1431,7 +1549,6 @@ impl Runtime for Wry {
|
|
|
is_event_loop_running: self.is_event_loop_running.clone(),
|
|
|
proxy: proxy.clone(),
|
|
|
window_event_listeners: self.window_event_listeners.clone(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: self.menu_event_listeners.clone(),
|
|
|
},
|
|
|
pending,
|
|
@@ -1473,7 +1590,6 @@ impl Runtime for Wry {
|
|
|
is_event_loop_running: self.is_event_loop_running.clone(),
|
|
|
proxy,
|
|
|
window_event_listeners: self.window_event_listeners.clone(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: self.menu_event_listeners.clone(),
|
|
|
},
|
|
|
};
|
|
@@ -1543,7 +1659,6 @@ impl Runtime for Wry {
|
|
|
let windows = self.windows.clone();
|
|
|
let web_context = &self.web_context;
|
|
|
let window_event_listeners = self.window_event_listeners.clone();
|
|
|
- #[cfg(feature = "menu")]
|
|
|
let menu_event_listeners = self.menu_event_listeners.clone();
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
let tray_context = self.tray_context.clone();
|
|
@@ -1571,7 +1686,6 @@ impl Runtime for Wry {
|
|
|
global_shortcut_manager: global_shortcut_manager.clone(),
|
|
|
global_shortcut_manager_handle: &global_shortcut_manager_handle,
|
|
|
clipboard_manager: clipboard_manager.clone(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: &menu_event_listeners,
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context: &tray_context,
|
|
@@ -1589,7 +1703,6 @@ impl Runtime for Wry {
|
|
|
let windows = self.windows.clone();
|
|
|
let web_context = self.web_context;
|
|
|
let window_event_listeners = self.window_event_listeners.clone();
|
|
|
- #[cfg(feature = "menu")]
|
|
|
let menu_event_listeners = self.menu_event_listeners.clone();
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
let tray_context = self.tray_context;
|
|
@@ -1609,7 +1722,6 @@ impl Runtime for Wry {
|
|
|
global_shortcut_manager: global_shortcut_manager.clone(),
|
|
|
global_shortcut_manager_handle: &global_shortcut_manager_handle,
|
|
|
clipboard_manager: clipboard_manager.clone(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: &menu_event_listeners,
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context: &tray_context,
|
|
@@ -1627,7 +1739,6 @@ struct EventLoopIterationContext<'a> {
|
|
|
global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
|
|
|
global_shortcut_manager_handle: &'a GlobalShortcutManagerHandle,
|
|
|
clipboard_manager: Arc<Mutex<Clipboard>>,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners: &'a MenuEventListeners,
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context: &'a TrayContext,
|
|
@@ -1647,7 +1758,6 @@ fn handle_event_loop(
|
|
|
global_shortcut_manager,
|
|
|
global_shortcut_manager_handle,
|
|
|
clipboard_manager,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners,
|
|
|
#[cfg(feature = "system-tray")]
|
|
|
tray_context,
|
|
@@ -1667,7 +1777,6 @@ fn handle_event_loop(
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- #[cfg(feature = "menu")]
|
|
|
Event::MenuEvent {
|
|
|
window_id,
|
|
|
menu_id,
|
|
@@ -1756,7 +1865,6 @@ fn handle_event_loop(
|
|
|
control_flow,
|
|
|
#[cfg(target_os = "linux")]
|
|
|
window_event_listeners,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners.clone(),
|
|
|
);
|
|
|
}
|
|
@@ -1807,7 +1915,6 @@ 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(window.is_menu_visible()).unwrap(),
|
|
|
WindowMessage::CurrentMonitor(tx) => tx.send(window.current_monitor()).unwrap(),
|
|
|
WindowMessage::PrimaryMonitor(tx) => tx.send(window.primary_monitor()).unwrap(),
|
|
@@ -1841,9 +1948,7 @@ 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(),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
WindowMessage::HideMenu => window.hide_menu(),
|
|
|
WindowMessage::Show => window.set_visible(true),
|
|
|
WindowMessage::Hide => window.set_visible(false),
|
|
@@ -1855,7 +1960,6 @@ fn handle_event_loop(
|
|
|
control_flow,
|
|
|
#[cfg(target_os = "linux")]
|
|
|
window_event_listeners,
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners.clone(),
|
|
|
);
|
|
|
}
|
|
@@ -1893,7 +1997,6 @@ fn handle_event_loop(
|
|
|
WindowMessage::DragWindow => {
|
|
|
let _ = window.drag_window();
|
|
|
}
|
|
|
- #[cfg(feature = "menu")]
|
|
|
WindowMessage::UpdateMenuItem(id, update) => {
|
|
|
let item = webview
|
|
|
.menu_items
|
|
@@ -1962,7 +2065,6 @@ fn handle_event_loop(
|
|
|
.unwrap()
|
|
|
.insert(window.id(), WindowEventListenersMap::default());
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
context
|
|
|
.menu_event_listeners
|
|
|
.lock()
|
|
@@ -1976,7 +2078,6 @@ fn handle_event_loop(
|
|
|
WindowWrapper {
|
|
|
label,
|
|
|
inner: WindowHandle::Window(w.clone()),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_items: Default::default(),
|
|
|
},
|
|
|
);
|
|
@@ -2075,10 +2176,9 @@ fn on_window_close<'a>(
|
|
|
windows: &mut MutexGuard<'a, HashMap<WindowId, WindowWrapper>>,
|
|
|
control_flow: &mut ControlFlow,
|
|
|
#[cfg(target_os = "linux")] window_event_listeners: &WindowEventListeners,
|
|
|
- #[cfg(feature = "menu")] menu_event_listeners: MenuEventListeners,
|
|
|
+ menu_event_listeners: MenuEventListeners,
|
|
|
) {
|
|
|
if let Some(webview) = windows.remove(&window_id) {
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_event_listeners.lock().unwrap().remove(&window_id);
|
|
|
callback(RunEvent::WindowClose(webview.label.clone()));
|
|
|
|
|
@@ -2128,6 +2228,71 @@ fn center_window(window: &Window) -> Result<()> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+fn convert_menu_id(mut new_menu: Menu, menu: Menu) -> Menu {
|
|
|
+ for item in menu.items {
|
|
|
+ match item {
|
|
|
+ MenuEntry::CustomItem(c) => {
|
|
|
+ let mut item = CustomMenuItem::new(c.id_str, c.title);
|
|
|
+ #[cfg(target_os = "macos")]
|
|
|
+ if let Some(native_image) = c.native_image {
|
|
|
+ item = item.native_image(native_image);
|
|
|
+ }
|
|
|
+ if let Some(accelerator) = c.keyboard_accelerator {
|
|
|
+ item = item.accelerator(accelerator);
|
|
|
+ }
|
|
|
+ if !c.enabled {
|
|
|
+ item = item.disabled();
|
|
|
+ }
|
|
|
+ if c.selected {
|
|
|
+ item = item.selected();
|
|
|
+ }
|
|
|
+ new_menu = new_menu.add_item(item);
|
|
|
+ }
|
|
|
+ MenuEntry::NativeItem(i) => {
|
|
|
+ new_menu = new_menu.add_native_item(i);
|
|
|
+ }
|
|
|
+ MenuEntry::Submenu(submenu) => {
|
|
|
+ let new_submenu = convert_menu_id(Menu::new(), submenu.inner);
|
|
|
+ new_menu = new_menu.add_submenu(Submenu::new(submenu.title, new_submenu));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ new_menu
|
|
|
+}
|
|
|
+
|
|
|
+fn to_wry_menu(
|
|
|
+ custom_menu_items: &mut HashMap<MenuHash, WryCustomMenuItem>,
|
|
|
+ menu: Menu,
|
|
|
+) -> MenuBar {
|
|
|
+ let mut wry_menu = MenuBar::new();
|
|
|
+ for item in menu.items {
|
|
|
+ match item {
|
|
|
+ MenuEntry::CustomItem(c) => {
|
|
|
+ let mut attributes = MenuItemAttributesWrapper::from(&c).0;
|
|
|
+ attributes = attributes.with_id(WryMenuId(c.id));
|
|
|
+ #[allow(unused_mut)]
|
|
|
+ let mut item = wry_menu.add_item(attributes);
|
|
|
+ #[cfg(target_os = "macos")]
|
|
|
+ if let Some(native_image) = c.native_image {
|
|
|
+ item.set_native_image(NativeImageWrapper::from(native_image).0);
|
|
|
+ }
|
|
|
+ custom_menu_items.insert(c.id, item);
|
|
|
+ }
|
|
|
+ MenuEntry::NativeItem(i) => {
|
|
|
+ wry_menu.add_native_item(MenuItemWrapper::from(i).0);
|
|
|
+ }
|
|
|
+ MenuEntry::Submenu(submenu) => {
|
|
|
+ wry_menu.add_submenu(
|
|
|
+ &submenu.title,
|
|
|
+ submenu.enabled,
|
|
|
+ to_wry_menu(custom_menu_items, submenu.inner),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wry_menu
|
|
|
+}
|
|
|
+
|
|
|
fn create_webview(
|
|
|
event_loop: &EventLoopWindowTarget<Message>,
|
|
|
web_context: &WebContextStore,
|
|
@@ -2146,7 +2311,6 @@ fn create_webview(
|
|
|
} = pending;
|
|
|
|
|
|
let is_window_transparent = window_builder.inner.window.transparent;
|
|
|
- #[cfg(feature = "menu")]
|
|
|
let menu_items = {
|
|
|
let mut menu_items = HashMap::new();
|
|
|
let menu = to_wry_menu(&mut menu_items, window_builder.menu);
|
|
@@ -2161,7 +2325,6 @@ fn create_webview(
|
|
|
.unwrap()
|
|
|
.insert(window.id(), WindowEventListenersMap::default());
|
|
|
|
|
|
- #[cfg(feature = "menu")]
|
|
|
context
|
|
|
.menu_event_listeners
|
|
|
.lock()
|
|
@@ -2224,7 +2387,6 @@ fn create_webview(
|
|
|
Ok(WindowWrapper {
|
|
|
label,
|
|
|
inner: WindowHandle::Webview(webview),
|
|
|
- #[cfg(feature = "menu")]
|
|
|
menu_items,
|
|
|
})
|
|
|
}
|