diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-04-25 14:44:19 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-05-02 09:39:48 +0200 |
commit | b41b1a3f6ffb51a9c62cbe49ff2b7fc6a6af62cc (patch) | |
tree | 12a81a7dd8e9fb9ea14efb39a61e5afda4a56541 /src/plugins/platforms/cocoa | |
parent | c48795c515f7b181c7fc6409cb3b073e6fc0c0e0 (diff) |
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: <stefan.wastl@native-instruments.de>
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/plugins/platforms/cocoa')
4 files changed, 12 insertions, 17 deletions
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 <QtCore/QScopedPointer> #include <qpa/qplatformintegration.h> @@ -155,6 +156,8 @@ private: mutable QCocoaVulkanInstance *mCocoaVulkanInstance = nullptr; #endif QHash<QWindow *, NSToolbar *> 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 <QtCore/qglobal.h> +#include <QtCore/private/qcore_mac_p.h> 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() |