From 4a34a7ce747be486650c048275a7ba93c761cb16 Mon Sep 17 00:00:00 2001 From: Sebastian Marsching Date: Tue, 23 Apr 2024 22:49:09 +0200 Subject: [PATCH] Improve app menu on macOS. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit fixes the app menu (the leftmost menu with a bold label in the macOS menu bar). In particular, it resolves a problem where the “Hide CS-Studio” menu item does not hide the application and instead shows a standard about dialog (not even the “real” about dialog for Phoebus). --- core/ui/pom.xml | 6 +++++ .../ui/application/PhoebusApplication.java | 24 ++++++++++++++++++- dependencies/phoebus-target/pom.xml | 7 ++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/core/ui/pom.xml b/core/ui/pom.xml index 6a0ce70dad..9325822a37 100644 --- a/core/ui/pom.xml +++ b/core/ui/pom.xml @@ -94,6 +94,12 @@ + + + de.jangassen + nsmenufx + 3.1.0 + diff --git a/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java b/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java index cdbd71a08c..27c4ba2868 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java @@ -14,6 +14,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.SortedMap; @@ -706,7 +707,8 @@ private MenuBar createMenu(final Stage stage) { // Help final MenuItem content = createMenuItem(new OpenHelp()); - final MenuItem about = createMenuItem(new OpenAbout()); + final var open_about = new OpenAbout(); + final MenuItem about = createMenuItem(open_about); menuBar.getMenus().add(new Menu(Messages.Help, null, about, content)); selectTabMenu.getParentMenu().setOnShowing(e -> { @@ -734,6 +736,26 @@ private MenuBar createMenu(final Stage stage) { }); closeAllTabsMenuItem.setOnAction(ae -> closeAllTabs()); + + // The application menu (the left-most menu in the menu bar) on macOS + // that is generated by JavaFX is broken, so we replace it with a menu + // that satisfies the expectations for a macOS app. + if (PlatformInfo.is_mac_os_x) { + final var toolkit = de.jangassen.MenuToolkit.toolkit(Locale.getDefault()); + final var app_name = Messages.FixedTitle; + final var default_menu = new Menu( + app_name, + null, + toolkit.createAboutMenuItem(app_name, event -> open_about.call()), + new SeparatorMenuItem(), + toolkit.createHideMenuItem(app_name), + toolkit.createHideOthersMenuItem(), + toolkit.createUnhideAllMenuItem(), + new SeparatorMenuItem(), + toolkit.createQuitMenuItem(app_name)); + toolkit.setApplicationMenu(default_menu); + } + return menuBar; } diff --git a/dependencies/phoebus-target/pom.xml b/dependencies/phoebus-target/pom.xml index 09e7970137..8faa3a2cfc 100644 --- a/dependencies/phoebus-target/pom.xml +++ b/dependencies/phoebus-target/pom.xml @@ -532,6 +532,13 @@ 3.1.0 + + + de.jangassen + nsmenufx + 3.1.0 + +