From 075996b1fa98c7c7eed1a447cb89022c1f72d629 Mon Sep 17 00:00:00 2001 From: OG Date: Tue, 28 Nov 2023 23:39:12 +0300 Subject: [PATCH] feat: macos services menu added (#3231) --- CHANGELOG.md | 1 + src/platform_impl/macos/appkit/application.rs | 3 +++ src/platform_impl/macos/appkit/menu_item.rs | 6 ++++- src/platform_impl/macos/menu.rs | 27 ++++++++++++++----- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df8dabd..415f989b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Unreleased` header. # Unreleased +- On macOS, add services menu. - On macOS, remove spurious error logging when handling `Fn`. # 0.29.4 diff --git a/src/platform_impl/macos/appkit/application.rs b/src/platform_impl/macos/appkit/application.rs index f5f2e77d..22d166f2 100644 --- a/src/platform_impl/macos/appkit/application.rs +++ b/src/platform_impl/macos/appkit/application.rs @@ -80,6 +80,9 @@ extern_methods!( #[method(setMainMenu:)] pub fn setMainMenu(&self, menu: &NSMenu); + #[method(setServicesMenu:)] + pub fn setServicesMenu(&self, menu: &NSMenu); + #[method_id(effectiveAppearance)] pub fn effectiveAppearance(&self) -> Id; diff --git a/src/platform_impl/macos/appkit/menu_item.rs b/src/platform_impl/macos/appkit/menu_item.rs index 63c9a501..c4065291 100644 --- a/src/platform_impl/macos/appkit/menu_item.rs +++ b/src/platform_impl/macos/appkit/menu_item.rs @@ -20,7 +20,11 @@ extern_methods!( #[method_id(new)] pub fn new() -> Id; - pub fn newWithTitle(title: &NSString, action: Sel, key_equivalent: &NSString) -> Id { + pub fn newWithTitle( + title: &NSString, + action: Option, + key_equivalent: &NSString, + ) -> Id { unsafe { msg_send_id![ Self::alloc(), diff --git a/src/platform_impl/macos/menu.rs b/src/platform_impl/macos/menu.rs index 8e69cbbb..978e0bff 100644 --- a/src/platform_impl/macos/menu.rs +++ b/src/platform_impl/macos/menu.rs @@ -21,7 +21,16 @@ pub fn initialize() { // About menu item let about_item_title = ns_string!("About ").stringByAppendingString(&process_name); - let about_item = menu_item(&about_item_title, sel!(orderFrontStandardAboutPanel:), None); + let about_item = menu_item( + &about_item_title, + Some(sel!(orderFrontStandardAboutPanel:)), + None, + ); + + // Services menu item + let services_menu = NSMenu::new(); + let services_item = menu_item(ns_string!("Services"), None, None); + services_item.setSubmenu(&services_menu); // Seperator menu item let sep_first = NSMenuItem::separatorItem(); @@ -30,7 +39,7 @@ pub fn initialize() { let hide_item_title = ns_string!("Hide ").stringByAppendingString(&process_name); let hide_item = menu_item( &hide_item_title, - sel!(hide:), + Some(sel!(hide:)), Some(KeyEquivalent { key: ns_string!("h"), masks: None, @@ -41,7 +50,7 @@ pub fn initialize() { let hide_others_item_title = ns_string!("Hide Others"); let hide_others_item = menu_item( hide_others_item_title, - sel!(hideOtherApplications:), + Some(sel!(hideOtherApplications:)), Some(KeyEquivalent { key: ns_string!("h"), masks: Some( @@ -52,7 +61,11 @@ pub fn initialize() { // Show applications menu item let show_all_item_title = ns_string!("Show All"); - let show_all_item = menu_item(show_all_item_title, sel!(unhideAllApplications:), None); + let show_all_item = menu_item( + show_all_item_title, + Some(sel!(unhideAllApplications:)), + None, + ); // Seperator menu item let sep = NSMenuItem::separatorItem(); @@ -61,7 +74,7 @@ pub fn initialize() { let quit_item_title = ns_string!("Quit ").stringByAppendingString(&process_name); let quit_item = menu_item( &quit_item_title, - sel!(terminate:), + Some(sel!(terminate:)), Some(KeyEquivalent { key: ns_string!("q"), masks: None, @@ -70,6 +83,7 @@ pub fn initialize() { app_menu.addItem(&about_item); app_menu.addItem(&sep_first); + app_menu.addItem(&services_item); app_menu.addItem(&hide_item); app_menu.addItem(&hide_others_item); app_menu.addItem(&show_all_item); @@ -78,12 +92,13 @@ pub fn initialize() { app_menu_item.setSubmenu(&app_menu); let app = NSApp(); + app.setServicesMenu(&services_menu); app.setMainMenu(&menubar); } fn menu_item( title: &NSString, - selector: Sel, + selector: Option, key_equivalent: Option>, ) -> Id { let (key, masks) = match key_equivalent {