From 9758c1556c6cd9d01a8f8dae24826735a18de567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 17 Jun 2024 15:33:34 +0200 Subject: [PATCH] macOS: Track menu bar clicks for popup closing in QCocoaIntegration A static member in QCocoaMenuBar relies on the app having at least one QCocoaMenuBar, and also stays around after the qGuiApp has gone away, potentially leading to a crash. As a drive-by, clarify the comment and variable name to point out that we're closing popups on _any_ native menu opening, not just menus in the main menu bar (NSApp.mainMenu). Pick-to: 6.7 6.5 Change-Id: Ib14919e317d70e4c76f3d89c78331edb958bf048 Reviewed-by: Volker Hilsheimer (cherry picked from commit daad2b28fdb884e6d796ab024bcb962155cf5534) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/cocoa/qcocoaintegration.h | 2 ++ src/plugins/platforms/cocoa/qcocoaintegration.mm | 6 ++++++ src/plugins/platforms/cocoa/qcocoamenubar.mm | 5 ----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index 664700cf51..f517311025 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -119,6 +119,8 @@ private: #endif QCocoaWindowManager m_windowManager; + + QMacNotificationObserver m_menuTrackingObserver; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCocoaIntegration::Options) diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 2ce39ff897..ad767a0694 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -168,6 +168,12 @@ QCocoaIntegration::QCocoaIntegration(const QStringList ¶mList) connect(qGuiApp, &QGuiApplication::focusWindowChanged, this, &QCocoaIntegration::focusWindowChanged); + + // Opening of a native menu should close all popup windows + m_menuTrackingObserver = QMacNotificationObserver(nil, + NSMenuDidBeginTrackingNotification, ^{ + QGuiApplicationPrivate::instance()->closeAllPopups(); + }); } QCocoaIntegration::~QCocoaIntegration() diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 2493d90724..f938d8ad5c 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -25,11 +25,6 @@ QCocoaMenuBar::QCocoaMenuBar() { static_menubars.append(this); - // clicks into the menu bar should close all popup windows - static QMacNotificationObserver menuBarClickObserver(nil, NSMenuDidBeginTrackingNotification, ^{ - QGuiApplicationPrivate::instance()->closeAllPopups(); - }); - m_nativeMenu = [[NSMenu alloc] init]; qCDebug(lcQpaMenus) << "Constructed" << this << "with" << m_nativeMenu; }