diff --git a/.changes/macos-menus-services.md b/.changes/macos-menus-services.md new file mode 100644 index 000000000..d4254f8f7 --- /dev/null +++ b/.changes/macos-menus-services.md @@ -0,0 +1,5 @@ +--- +"tao": "patch" +--- + +Fix the native Services menu on macOS. diff --git a/examples/custom_menu.rs b/examples/custom_menu.rs index eb29e5e9b..168385880 100644 --- a/examples/custom_menu.rs +++ b/examples/custom_menu.rs @@ -49,6 +49,8 @@ fn main() { }, )); + first_menu.add_native_item(MenuItem::Services); + // Create custom Copy menu with our clipboard object let custom_insert_clipboard = first_menu.add_item(MenuItemAttributes::new("Insert clipboard")); let custom_read_clipboard = first_menu.add_item(MenuItemAttributes::new("Read clipboard")); diff --git a/src/platform_impl/macos/menu.rs b/src/platform_impl/macos/menu.rs index dab4e4ed3..2b7d3cf10 100644 --- a/src/platform_impl/macos/menu.rs +++ b/src/platform_impl/macos/menu.rs @@ -308,10 +308,12 @@ impl Menu { )), MenuItem::Services => unsafe { let item = make_menu_item("Services", None, None, MenuType::MenuBar); + // we have to assign an empty menu as the app's services menu, and macOS will populate it + let services_menu = NSMenu::alloc(nil).autorelease(); let app_class = class!(NSApplication); let app: id = msg_send![app_class, sharedApplication]; - let services: id = msg_send![app, servicesMenu]; - let _: () = msg_send![&*item, setSubmenu: services]; + let () = msg_send![app, setServicesMenu: services_menu]; + let () = msg_send![&*item, setSubmenu: services_menu]; Some((None, item)) }, };