From dcac89b5c78110be635c5da843a02b89fe77ced6 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Thu, 5 Dec 2024 12:01:36 +0100 Subject: [PATCH] qpa: lazily populate the services object except xcb In order to optimize the footprint of QPA plugins, we avoid to create QPlatformServices object in QPlatformIntegration constructor. It benefits embedded platforms and others. Task-number: QTBUG-130884 Pick-to: 6.8 6.5 Change-Id: I5c0d2616ace9fbc0e077eece32d8836b40fc83dd Reviewed-by: Volker Hilsheimer (cherry picked from commit ff51ea5418d131248b07e327513b41dad1231f37) Reviewed-by: Liang Qi --- .../platforms/android/qandroidplatformintegration.cpp | 6 ++++-- .../platforms/android/qandroidplatformintegration.h | 2 +- src/plugins/platforms/bsdfb/qbsdfbintegration.cpp | 4 +++- src/plugins/platforms/bsdfb/qbsdfbintegration.h | 2 +- src/plugins/platforms/cocoa/qcocoaintegration.h | 2 +- src/plugins/platforms/cocoa/qcocoaintegration.mm | 4 +++- src/plugins/platforms/directfb/qdirectfbintegration.cpp | 4 +++- src/plugins/platforms/directfb/qdirectfbintegration.h | 2 +- src/plugins/platforms/eglfs/api/qeglfsintegration.cpp | 4 +++- src/plugins/platforms/eglfs/api/qeglfsintegration_p.h | 2 +- src/plugins/platforms/haiku/qhaikuintegration.cpp | 5 +++-- src/plugins/platforms/haiku/qhaikuintegration.h | 2 +- .../platforms/integrity/qintegrityfbintegration.cpp | 6 ++++-- .../platforms/integrity/qintegrityfbintegration.h | 2 +- src/plugins/platforms/ios/qiosintegration.h | 2 +- src/plugins/platforms/ios/qiosintegration.mm | 4 +++- src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp | 4 +++- src/plugins/platforms/linuxfb/qlinuxfbintegration.h | 2 +- .../platforms/offscreen/qoffscreenintegration.cpp | 4 +++- src/plugins/platforms/offscreen/qoffscreenintegration.h | 2 +- src/plugins/platforms/qnx/qqnxintegration.cpp | 9 ++++----- src/plugins/platforms/qnx/qqnxintegration.h | 2 +- src/plugins/platforms/vnc/qvncintegration.cpp | 6 ++++-- src/plugins/platforms/vnc/qvncintegration.h | 2 +- src/plugins/platforms/windows/qwindowsintegration.cpp | 7 +++++-- 25 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 0112889355f..a311fb1adaf 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -216,7 +216,6 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶ m_mainThread = QThread::currentThread(); m_androidFDB = new QAndroidPlatformFontDatabase(); - m_androidPlatformServices = new QAndroidPlatformServices(); #ifndef QT_NO_CLIPBOARD m_androidPlatformClipboard = new QAndroidPlatformClipboard(); @@ -453,7 +452,10 @@ QPlatformNativeInterface *QAndroidPlatformIntegration::nativeInterface() const QPlatformServices *QAndroidPlatformIntegration::services() const { - return m_androidPlatformServices; + if (m_androidPlatformServices.isNull()) + m_androidPlatformServices.reset(new QAndroidPlatformServices); + + return m_androidPlatformServices.data(); } QVariant QAndroidPlatformIntegration::styleHint(StyleHint hint) const diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h index b7bfb58d1dd..135790dda63 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.h +++ b/src/plugins/platforms/android/qandroidplatformintegration.h @@ -136,7 +136,7 @@ private: QPlatformFontDatabase *m_androidFDB; QAndroidPlatformNativeInterface *m_androidPlatformNativeInterface; - QAndroidPlatformServices *m_androidPlatformServices; + mutable QScopedPointer m_androidPlatformServices; // Handling the multiple screens connected. Every display is identified // with an unique (autoincremented) displayID. The values of this ID will diff --git a/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp b/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp index c56499b3a4d..58a542bbd7d 100644 --- a/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp +++ b/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp @@ -30,7 +30,6 @@ using namespace Qt::StringLiterals; QBsdFbIntegration::QBsdFbIntegration(const QStringList ¶mList) { m_fontDb.reset(new QGenericUnixFontDatabase); - m_services.reset(new QGenericUnixServices); m_primaryScreen.reset(new QBsdFbScreen(paramList)); } @@ -97,6 +96,9 @@ QPlatformFontDatabase *QBsdFbIntegration::fontDatabase() const QPlatformServices *QBsdFbIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/bsdfb/qbsdfbintegration.h b/src/plugins/platforms/bsdfb/qbsdfbintegration.h index 8d2b572fb69..319071c7163 100644 --- a/src/plugins/platforms/bsdfb/qbsdfbintegration.h +++ b/src/plugins/platforms/bsdfb/qbsdfbintegration.h @@ -41,7 +41,7 @@ private: QScopedPointer m_primaryScreen; QScopedPointer m_inputContext; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QScopedPointer m_vtHandler; QScopedPointer m_nativeInterface; }; diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index f5173110259..9ce85a51659 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -111,7 +111,7 @@ private: #endif QScopedPointer mCocoaDrag; QScopedPointer mNativeInterface; - QScopedPointer mServices; + mutable QScopedPointer mServices; QScopedPointer mKeyboardMapper; #if QT_CONFIG(vulkan) diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index ad767a0694a..8c6dcfd4f60 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -109,7 +109,6 @@ QCocoaIntegration::QCocoaIntegration(const QStringList ¶mList) #endif , mCocoaDrag(new QCocoaDrag) , mNativeInterface(new QCocoaNativeInterface) - , mServices(new QCocoaServices) , mKeyboardMapper(new QAppleKeyMapper) { logVersionInformation(); @@ -394,6 +393,9 @@ QPlatformTheme *QCocoaIntegration::createPlatformTheme(const QString &name) cons QCocoaServices *QCocoaIntegration::services() const { + if (mServices.isNull()) + mServices.reset(new QCocoaServices); + return mServices.data(); } diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp index c52213b1615..562ab7f16fb 100644 --- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp +++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp @@ -26,7 +26,6 @@ QT_BEGIN_NAMESPACE QDirectFbIntegration::QDirectFbIntegration() : m_fontDb(new QGenericUnixFontDatabase()) - , m_services(new QGenericUnixServices) { } @@ -125,6 +124,9 @@ QPlatformFontDatabase *QDirectFbIntegration::fontDatabase() const QPlatformServices *QDirectFbIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h index 8dd2a4516aa..b472e15ae75 100644 --- a/src/plugins/platforms/directfb/qdirectfbintegration.h +++ b/src/plugins/platforms/directfb/qdirectfbintegration.h @@ -47,7 +47,7 @@ protected: QScopedPointer m_input; QScopedPointer m_inputRunner; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QPlatformInputContext *m_inputContext; }; diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp index a018919e17e..fe2b97080b5 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp @@ -77,7 +77,6 @@ QEglFSIntegration::QEglFSIntegration() : m_display(EGL_NO_DISPLAY), m_inputContext(nullptr), m_fontDb(new QGenericUnixFontDatabase), - m_services(new QGenericUnixServices), m_disableInputHandlers(false) { m_disableInputHandlers = qEnvironmentVariableIntValue("QT_QPA_EGLFS_DISABLE_INPUT"); @@ -132,6 +131,9 @@ QAbstractEventDispatcher *QEglFSIntegration::createEventDispatcher() const QPlatformServices *QEglFSIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h index f332db55e3d..2359b7f29f1 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h @@ -108,7 +108,7 @@ private: EGLDisplay m_display; QPlatformInputContext *m_inputContext; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QScopedPointer m_vtHandler; QPointer m_pointerWindow; bool m_disableInputHandlers; diff --git a/src/plugins/platforms/haiku/qhaikuintegration.cpp b/src/plugins/platforms/haiku/qhaikuintegration.cpp index 2b0672e3636..cf63f3039a8 100644 --- a/src/plugins/platforms/haiku/qhaikuintegration.cpp +++ b/src/plugins/platforms/haiku/qhaikuintegration.cpp @@ -45,8 +45,6 @@ QHaikuIntegration::QHaikuIntegration(const QStringList ¶meters) m_screen = new QHaikuScreen; - m_services = new QHaikuServices; - // notify system about available screen QWindowSystemInterface::handleScreenAdded(m_screen); } @@ -78,6 +76,9 @@ QPlatformFontDatabase *QHaikuIntegration::fontDatabase() const QPlatformServices *QHaikuIntegration::services() const { + if (!m_services) + m_services = new QHaikuServices; + return m_services; } diff --git a/src/plugins/platforms/haiku/qhaikuintegration.h b/src/plugins/platforms/haiku/qhaikuintegration.h index 8e5f3d52f14..5c917e31aff 100644 --- a/src/plugins/platforms/haiku/qhaikuintegration.h +++ b/src/plugins/platforms/haiku/qhaikuintegration.h @@ -34,7 +34,7 @@ public: private: QHaikuClipboard *m_clipboard; QHaikuScreen *m_screen; - QHaikuServices *m_services; + mutable QHaikuServices *m_services = nullptr; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/integrity/qintegrityfbintegration.cpp b/src/plugins/platforms/integrity/qintegrityfbintegration.cpp index e57ad83cf8c..e06011a38d9 100644 --- a/src/plugins/platforms/integrity/qintegrityfbintegration.cpp +++ b/src/plugins/platforms/integrity/qintegrityfbintegration.cpp @@ -20,8 +20,7 @@ QT_BEGIN_NAMESPACE QIntegrityFbIntegration::QIntegrityFbIntegration(const QStringList ¶mList) - : m_fontDb(new QGenericUnixFontDatabase), - m_services(new QGenericUnixServices) + : m_fontDb(new QGenericUnixFontDatabase) { m_primaryScreen = new QIntegrityFbScreen(paramList); } @@ -84,6 +83,9 @@ QPlatformFontDatabase *QIntegrityFbIntegration::fontDatabase() const QPlatformServices *QIntegrityFbIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/integrity/qintegrityfbintegration.h b/src/plugins/platforms/integrity/qintegrityfbintegration.h index 5c0d16516d4..bed7641a57a 100644 --- a/src/plugins/platforms/integrity/qintegrityfbintegration.h +++ b/src/plugins/platforms/integrity/qintegrityfbintegration.h @@ -40,7 +40,7 @@ private: QIntegrityFbScreen *m_primaryScreen; QPlatformInputContext *m_inputContext; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QScopedPointer m_nativeInterface; }; diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h index 6c2014d048f..a7733d8216c 100644 --- a/src/plugins/platforms/ios/qiosintegration.h +++ b/src/plugins/platforms/ios/qiosintegration.h @@ -109,7 +109,7 @@ private: #endif QPlatformInputContext *m_inputContext; QPointingDevice *m_touchDevice; - QIOSServices *m_platformServices; + mutable QIOSServices *m_platformServices = nullptr; mutable QPlatformAccessibility *m_accessibility; QFactoryLoader *m_optionalPlugins; #if !defined(Q_OS_TVOS) && !defined(Q_OS_VISIONOS) diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 69b79b111b3..dcb37076bf7 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -59,7 +59,6 @@ QIOSIntegration::QIOSIntegration() , m_clipboard(new QIOSClipboard) #endif , m_inputContext(0) - , m_platformServices(new QIOSServices) , m_accessibility(0) , m_optionalPlugins(new QFactoryLoader(QIosOptionalPluginInterface_iid, "/platforms/darwin"_L1)) { @@ -232,6 +231,9 @@ QPlatformInputContext *QIOSIntegration::inputContext() const QPlatformServices *QIOSIntegration::services() const { + if (!m_platformServices) + m_platformServices = new QIOSServices; + return m_platformServices; } diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp index f87766cf1ba..e1da9849236 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp @@ -41,7 +41,6 @@ using namespace Qt::StringLiterals; QLinuxFbIntegration::QLinuxFbIntegration(const QStringList ¶mList) : m_primaryScreen(nullptr), m_fontDb(new QGenericUnixFontDatabase), - m_services(new QGenericUnixServices), m_kbdMgr(nullptr) { #if QT_CONFIG(kms) @@ -111,6 +110,9 @@ QPlatformFontDatabase *QLinuxFbIntegration::fontDatabase() const QPlatformServices *QLinuxFbIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.h b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h index 352bddd907d..2a2b53ea3d6 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.h +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h @@ -53,7 +53,7 @@ private: QFbScreen *m_primaryScreen; QPlatformInputContext *m_inputContext; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QScopedPointer m_vtHandler; QEvdevKeyboardManager *m_kbdMgr; diff --git a/src/plugins/platforms/offscreen/qoffscreenintegration.cpp b/src/plugins/platforms/offscreen/qoffscreenintegration.cpp index ea8042928a1..5decacc61a3 100644 --- a/src/plugins/platforms/offscreen/qoffscreenintegration.cpp +++ b/src/plugins/platforms/offscreen/qoffscreenintegration.cpp @@ -74,7 +74,6 @@ QOffscreenIntegration::QOffscreenIntegration(const QStringList& paramList) #if QT_CONFIG(draganddrop) m_drag.reset(new QOffscreenDrag); #endif - m_services.reset(new QPlatformServices); QJsonObject config = resolveConfigFileConfiguration(paramList).value_or(defaultConfiguration()); setConfiguration(config); @@ -417,6 +416,9 @@ QPlatformDrag *QOffscreenIntegration::drag() const QPlatformServices *QOffscreenIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QPlatformServices); + return m_services.data(); } diff --git a/src/plugins/platforms/offscreen/qoffscreenintegration.h b/src/plugins/platforms/offscreen/qoffscreenintegration.h index aab8d305b42..003abab99f7 100644 --- a/src/plugins/platforms/offscreen/qoffscreenintegration.h +++ b/src/plugins/platforms/offscreen/qoffscreenintegration.h @@ -55,7 +55,7 @@ protected: QScopedPointer m_drag; #endif QScopedPointer m_inputContext; - QScopedPointer m_services; + mutable QScopedPointer m_services; mutable QScopedPointer m_nativeInterface; QList m_screens; bool m_windowFrameMarginsEnabled = true; diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp index cb453f8ca7d..8e3c4ee85a8 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.cpp +++ b/src/plugins/platforms/qnx/qqnxintegration.cpp @@ -124,7 +124,6 @@ QQnxIntegration::QQnxIntegration(const QStringList ¶mList) , m_buttonsNotifier(new QQnxButtonEventNotifier()) #endif , m_qpaInputContext(0) - , m_services(0) , m_fontDatabase(new QGenericUnixFontDatabase()) , m_eventDispatcher(createUnixEventDispatcher()) , m_nativeInterface(new QQnxNativeInterface(this)) @@ -190,10 +189,6 @@ QQnxIntegration::QQnxIntegration(const QStringList ¶mList) m_navigator = new QQnxNavigatorPps(); #endif - // Create services handling class - if (m_navigator) - m_services = new QQnxServices(m_navigator); - createDisplays(); if (m_virtualKeyboard) { @@ -473,6 +468,10 @@ QVariant QQnxIntegration::styleHint(QPlatformIntegration::StyleHint hint) const QPlatformServices * QQnxIntegration::services() const { + // Create services handling class + if (m_navigator && !m_services) + m_services = new QQnxServices(m_navigator); + return m_services; } diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h index d096a78dcb8..2fc762314d8 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.h +++ b/src/plugins/platforms/qnx/qqnxintegration.h @@ -128,7 +128,7 @@ private: QQnxButtonEventNotifier *m_buttonsNotifier; #endif QPlatformInputContext *m_qpaInputContext; - QQnxServices *m_services; + mutable QQnxServices *m_services = nullptr; QPlatformFontDatabase *m_fontDatabase; mutable QAbstractEventDispatcher *m_eventDispatcher; QQnxNativeInterface *m_nativeInterface; diff --git a/src/plugins/platforms/vnc/qvncintegration.cpp b/src/plugins/platforms/vnc/qvncintegration.cpp index 48e6567d890..1f4ed194553 100644 --- a/src/plugins/platforms/vnc/qvncintegration.cpp +++ b/src/plugins/platforms/vnc/qvncintegration.cpp @@ -25,8 +25,7 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; QVncIntegration::QVncIntegration(const QStringList ¶mList) - : m_fontDb(new QGenericUnixFontDatabase), - m_services(new QGenericUnixServices) + : m_fontDb(new QGenericUnixFontDatabase) { QRegularExpression portRx("port=(\\d+)"_L1); quint16 port = 5900; @@ -105,6 +104,9 @@ QPlatformFontDatabase *QVncIntegration::fontDatabase() const QPlatformServices *QVncIntegration::services() const { + if (m_services.isNull()) + m_services.reset(new QGenericUnixServices); + return m_services.data(); } diff --git a/src/plugins/platforms/vnc/qvncintegration.h b/src/plugins/platforms/vnc/qvncintegration.h index 6c00ba8493d..282fea7a30e 100644 --- a/src/plugins/platforms/vnc/qvncintegration.h +++ b/src/plugins/platforms/vnc/qvncintegration.h @@ -40,7 +40,7 @@ private: QVncScreen *m_primaryScreen; QPlatformInputContext *m_inputContext; QScopedPointer m_fontDb; - QScopedPointer m_services; + mutable QScopedPointer m_services; QScopedPointer m_nativeInterface; }; diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 487e1d47b6f..a9fcf711edd 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -105,7 +105,7 @@ struct QWindowsIntegrationPrivate #if QT_CONFIG(accessibility) QWindowsUiaAccessibility m_accessibility; #endif - QWindowsServices m_services; + mutable QScopedPointer m_services; }; template @@ -598,7 +598,10 @@ QPlatformTheme *QWindowsIntegration::createPlatformTheme(const QString &name) co QPlatformServices *QWindowsIntegration::services() const { - return &d->m_services; + if (d->m_services.isNull()) + d->m_services.reset(new QWindowsServices); + + return d->m_services.data(); } void QWindowsIntegration::beep() const