From 1959b39f401f129f6c9b924a4df686997cc65a7e Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Mon, 13 Oct 2025 10:24:25 -0600 Subject: [PATCH 1/2] Fix set_as_windows_menu_for_nsapp() and set_as_help_menu_for_nsapp() They were both using an NSMenu object that wasn't added to any menu, so macOS was ignoring them. This commit makes it so that the NSMenu instance that's added to the main app menu is used when available, or else the first NSMenu that has any supermenu. --- src/platform_impl/macos/mod.rs | 41 +++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index 141378ad..a51fec2e 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -664,18 +664,43 @@ impl MenuChild { show_context_menu(&self.ns_menu.as_ref().unwrap().1, view, position) } - pub fn set_as_windows_menu_for_nsapp(&self) { - let menu = &self.ns_menu.as_ref().unwrap().1; - let mtm = MainThreadMarker::from(&**menu); + fn find_menu_in_hierarchy(&self) -> Option<&NsMenuRef> { + let ns_menus = self.ns_menus.as_ref()?; + + let mtm = MainThreadMarker::from(&*self.ns_menu.as_ref().unwrap().1); let app = NSApplication::sharedApplication(mtm); - unsafe { app.setWindowsMenu(Some(menu)) } + let main_menu = unsafe { app.mainMenu() }; + + // Find menu whose supermenu is the main menu, or use first available + ns_menus + .values() + .flatten() + .find(|ns_menu| { + main_menu.as_ref().is_some_and(|main| { + unsafe { ns_menu.1.supermenu() } + .as_ref() + .is_some_and(|super_| { + Retained::as_ptr(super_) == Retained::as_ptr(main) + }) + }) + }) + .or_else(|| ns_menus.values().flatten().next()) + } + + pub fn set_as_windows_menu_for_nsapp(&self) { + if let Some(ns_menu) = self.find_menu_in_hierarchy() { + let mtm = MainThreadMarker::from(&*ns_menu.1); + let app = NSApplication::sharedApplication(mtm); + unsafe { app.setWindowsMenu(Some(&ns_menu.1)) } + } } pub fn set_as_help_menu_for_nsapp(&self) { - let menu = &self.ns_menu.as_ref().unwrap().1; - let mtm = MainThreadMarker::from(&**menu); - let app = NSApplication::sharedApplication(mtm); - unsafe { app.setHelpMenu(Some(menu)) } + if let Some(ns_menu) = self.find_menu_in_hierarchy() { + let mtm = MainThreadMarker::from(&*ns_menu.1); + let app = NSApplication::sharedApplication(mtm); + unsafe { app.setHelpMenu(Some(&ns_menu.1)) } + } } pub fn ns_menu(&self) -> *mut std::ffi::c_void { From 23643260921147afa17eeab8e4cf91184814c81a Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:48:11 -0600 Subject: [PATCH 2/2] Add change file and fix clippy errors and formatting --- .changes/fix-macos-special-menu-functions.md | 6 ++++++ src/platform_impl/macos/mod.rs | 4 +--- src/platform_impl/mod.rs | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .changes/fix-macos-special-menu-functions.md diff --git a/.changes/fix-macos-special-menu-functions.md b/.changes/fix-macos-special-menu-functions.md new file mode 100644 index 00000000..4dff14b3 --- /dev/null +++ b/.changes/fix-macos-special-menu-functions.md @@ -0,0 +1,6 @@ +--- +"muda": patch +--- + + +Fix `set_as_windows_menu_for_nsapp()` and `set_as_help_menu_for_nsapp()` diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index a51fec2e..ef20f90c 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -679,9 +679,7 @@ impl MenuChild { main_menu.as_ref().is_some_and(|main| { unsafe { ns_menu.1.supermenu() } .as_ref() - .is_some_and(|super_| { - Retained::as_ptr(super_) == Retained::as_ptr(main) - }) + .is_some_and(|super_| Retained::as_ptr(super_) == Retained::as_ptr(main)) }) }) .or_else(|| ns_menus.values().flatten().next()) diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs index 17018a33..d3908f28 100644 --- a/src/platform_impl/mod.rs +++ b/src/platform_impl/mod.rs @@ -88,7 +88,7 @@ impl MenuItemKind { } } - pub(crate) fn child(&self) -> Ref { + pub(crate) fn child(&self) -> Ref<'_, MenuChild> { match self { MenuItemKind::MenuItem(i) => i.inner.borrow(), MenuItemKind::Submenu(i) => i.inner.borrow(), @@ -98,7 +98,7 @@ impl MenuItemKind { } } - pub(crate) fn child_mut(&self) -> RefMut { + pub(crate) fn child_mut(&self) -> RefMut<'_, MenuChild> { match self { MenuItemKind::MenuItem(i) => i.inner.borrow_mut(), MenuItemKind::Submenu(i) => i.inner.borrow_mut(),