summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2022-04-25 14:44:19 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2022-05-02 09:39:48 +0200
commitb41b1a3f6ffb51a9c62cbe49ff2b7fc6a6af62cc (patch)
tree12a81a7dd8e9fb9ea14efb39a61e5afda4a56541 /src/plugins/platforms/cocoa
parentc48795c515f7b181c7fc6409cb3b073e6fc0c0e0 (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')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindowmanager.h7
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindowmanager.mm14
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()