From b41b1a3f6ffb51a9c62cbe49ff2b7fc6a6af62cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 25 Apr 2022 14:44:19 +0200 Subject: macOS: Tie QCocoaWindowManager lifetime to QCocoaIntegration To avoid any static initialization fiasco when Qt is being used in a plugin. Fixes: QTBUG-101150 Pick-to: 6.2 6.3 Change-Id: I68fa03f982d0c07e4b725ed5f4a1f738e0220438 Reviewed-by: Reviewed-by: Doris Verria Reviewed-by: Timur Pocheptsov --- src/plugins/platforms/cocoa/qcocoaintegration.h | 3 +++ src/plugins/platforms/cocoa/qcocoaintegration.mm | 5 ----- src/plugins/platforms/cocoa/qcocoawindowmanager.h | 7 +++++-- src/plugins/platforms/cocoa/qcocoawindowmanager.mm | 14 ++++---------- 4 files changed, 12 insertions(+), 17 deletions(-) (limited to 'src/plugins/platforms/cocoa') diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index fc9580b1b8..bbdef2cbf3 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -51,6 +51,7 @@ #if QT_CONFIG(vulkan) #include "qcocoavulkaninstance.h" #endif +#include "qcocoawindowmanager.h" #include #include @@ -155,6 +156,8 @@ private: mutable QCocoaVulkanInstance *mCocoaVulkanInstance = nullptr; #endif QHash mToolbars; + + QCocoaWindowManager m_windowManager; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCocoaIntegration::Options) diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 3b2cf17f40..ffd762b012 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -82,11 +82,6 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpa, "qt.qpa", QtWarningMsg); -// Lives here so that the linker is forced to include the QCocoaWindowManager -// object file also in static builds. -static void initializeWindowManager() { Q_UNUSED(QCocoaWindowManager::instance()); } -Q_CONSTRUCTOR_FUNCTION(initializeWindowManager) - static void logVersionInformation() { if (!lcQpa().isInfoEnabled()) diff --git a/src/plugins/platforms/cocoa/qcocoawindowmanager.h b/src/plugins/platforms/cocoa/qcocoawindowmanager.h index 2877dcd5ef..abd2dcd925 100644 --- a/src/plugins/platforms/cocoa/qcocoawindowmanager.h +++ b/src/plugins/platforms/cocoa/qcocoawindowmanager.h @@ -41,18 +41,21 @@ #define QCOCOAWINDOWMANAGER_H #include +#include QT_BEGIN_NAMESPACE class QCocoaWindowManager { public: - static QCocoaWindowManager *instance(); + QCocoaWindowManager(); private: - QCocoaWindowManager(); + + QMacNotificationObserver m_applicationDidFinishLaunchingObserver; void initialize(); + QMacKeyValueObserver m_modalSessionObserver; void modalSessionChanged(); }; diff --git a/src/plugins/platforms/cocoa/qcocoawindowmanager.mm b/src/plugins/platforms/cocoa/qcocoawindowmanager.mm index 71bcecdbc6..55e57e2eee 100644 --- a/src/plugins/platforms/cocoa/qcocoawindowmanager.mm +++ b/src/plugins/platforms/cocoa/qcocoawindowmanager.mm @@ -49,19 +49,13 @@ QT_BEGIN_NAMESPACE -QCocoaWindowManager *QCocoaWindowManager::instance() -{ - static auto *instance = new QCocoaWindowManager; - return instance; -} - QCocoaWindowManager::QCocoaWindowManager() { if (NSApp) { initialize(); } else { - static auto applicationDidFinishLaunching(QMacNotificationObserver(nil, - NSApplicationDidFinishLaunchingNotification, [this] { initialize(); })); + m_applicationDidFinishLaunchingObserver = QMacNotificationObserver(nil, + NSApplicationDidFinishLaunchingNotification, [this] { initialize(); }); } } @@ -74,9 +68,9 @@ void QCocoaWindowManager::initialize() // event dispatcher sessions allows us to track session started by native // APIs as well. We need to check the initial state as well, in case there // is already a modal session running. - static auto modalSessionObserver(QMacKeyValueObserver( + m_modalSessionObserver = QMacKeyValueObserver( NSApp, @"modalWindow", [this] { modalSessionChanged(); }, - NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew)); + NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew); } void QCocoaWindowManager::modalSessionChanged() -- cgit v1.2.3