From 3fcdb6cb6e35a37f9b511ec2705336102c194d6b Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 10 Nov 2021 15:19:51 +0100 Subject: [PATCH] QCocoaMenuBar: set the app's 'Window' menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To enable a list of windows the app has open in the Dock's menu. Not to surprise existing applications with a 'Window' menu where they did not have it before, make the item hidden. Fixes: QTBUG-59433 Change-Id: I1ac3d3de69f4313f39c4631dc4b68bf6e096532a Reviewed-by: Tor Arne Vestbø --- .../cocoa/qcocoaapplicationdelegate.mm | 3 +++ src/plugins/platforms/cocoa/qcocoamenubar.h | 1 + src/plugins/platforms/cocoa/qcocoamenubar.mm | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index 8b346fa89f..8e5ecd0f69 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -75,6 +75,7 @@ #include "qcocoaapplicationdelegate.h" #include "qcocoaintegration.h" +#include "qcocoamenubar.h" #include "qcocoamenu.h" #include "qcocoamenuloader.h" #include "qcocoamenuitem.h" @@ -230,6 +231,8 @@ QT_USE_NAMESPACE // (See the activateIgnoringOtherApps docs.) [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } + + QCocoaMenuBar::insertWindowMenu(); } - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.h b/src/plugins/platforms/cocoa/qcocoamenubar.h index 0054cdf6ad..6f8409434c 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.h +++ b/src/plugins/platforms/cocoa/qcocoamenubar.h @@ -67,6 +67,7 @@ public: NSMenu *nsMenu() const override { return m_nativeMenu; } static void updateMenuBarImmediately(); + static void insertWindowMenu(); QList merged() const; NSMenuItem *itemForRole(QPlatformMenuItem::MenuRole role); diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 524746f952..365346ac8c 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -333,9 +333,36 @@ void QCocoaMenuBar::updateMenuBarImmediately() [mergedItems release]; [NSApp setMainMenu:mb->nsMenu()]; + insertWindowMenu(); [loader qtTranslateApplicationMenu]; } +void QCocoaMenuBar::insertWindowMenu() +{ + // For such an item/menu we get for 'free' an additional feature - + // a list of windows the application has created in the Dock's menu. + + NSApplication *app = NSApplication.sharedApplication; + if (app.windowsMenu) + return; + + NSMenu *mainMenu = app.mainMenu; + NSMenuItem *winMenuItem = [[[NSMenuItem alloc] initWithTitle:@"QtWindowMenu" + action:nil keyEquivalent:@""] autorelease]; + // We don't want to show this menu, nobody asked us to do so: + winMenuItem.hidden = YES; + + winMenuItem.submenu = [[[NSMenu alloc] initWithTitle:@"QtWindowMenu"] autorelease]; + [mainMenu insertItem:winMenuItem atIndex:mainMenu.itemArray.count]; + app.windowsMenu = winMenuItem.submenu; + + // Windows, created and 'ordered front' before, will not be in this menu: + for (NSWindow *win in app.windows) { + if (win.title && ![win.title isEqualToString:@""]) + [app addWindowsItem:win title:win.title filename:NO]; + } +} + QList QCocoaMenuBar::merged() const { QList r;