From fc5cbf3606fae543f667a4f6cf861a19bb478f1a 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.5 Change-Id: I5c0d2616ace9fbc0e077eece32d8836b40fc83dd Reviewed-by: Volker Hilsheimer (cherry picked from commit ff51ea5418d131248b07e327513b41dad1231f37) Reviewed-by: Liang Qi (cherry picked from commit dcac89b5c78110be635c5da843a02b89fe77ced6) Reviewed-by: Qt Cherry-pick Bot --- .../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 c01c130bcf..6b546ea6c3 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -217,7 +217,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(); @@ -454,7 +453,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 b7bfb58d1d..135790dda6 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 c56499b3a4..58a542bbd7 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 8d2b572fb6..319071c716 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 f517311025..9ce85a5165 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 ad767a0694..8c6dcfd4f6 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 c52213b161..562ab7f16f 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 8dd2a4516a..b472e15ae7 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 f0b64c475c..8416798800 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp @@ -74,7 +74,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"); @@ -129,6 +128,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 8007167ec7..639389cff8 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h @@ -98,7 +98,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 2b0672e363..cf63f3039a 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 8e5f3d52f1..5c917e31af 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 e57ad83cf8..e06011a38d 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 5c0d16516d..bed7641a57 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 6c2014d048..a7733d8216 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 69b79b111b..dcb37076bf 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 f87766cf1b..e1da984923 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 352bddd907..2a2b53ea3d 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 ea8042928a..5decacc61a 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 aab8d305b4..003abab99f 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 cb453f8ca7..8e3c4ee85a 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 d096a78dcb..2fc762314d 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 48e6567d89..1f4ed19455 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 6c00ba8493..282fea7a30 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 487e1d47b6..a9fcf711ed 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