diff options
author | Ilya Fedin <fedin-ilja2010@ya.ru> | 2023-03-28 01:16:56 +0400 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-04-03 16:41:51 +0000 |
commit | 5b64b363bf9c8a8a14e292de5ddf361f68917e26 (patch) | |
tree | 08f518fb54ac6e552620e9b12d7e574046c5b1ac | |
parent | 23a026cd33582f2ca65dabfd45a3ed33f1a7da71 (diff) | |
download | qtwayland-5b64b363bf9c8a8a14e292de5ddf361f68917e26.tar.gz |
Client: Check for shell integration when initializing platform plugin
This makes QWaylandDisplay::initialize return a boolean and moves the
QWaylandIntegration's failure check out of constructor as
QWaylandIntegration::shellIntegration is a virtual method, this also
removes the out-of-date comments about processEvents as it's no more
used in QWaylandDisplay::forceRoundTrip.
Fixes: QTBUG-102457
Change-Id: I3c8f1d9fd195326b587b45318443c2beee1ebfc2
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Edmundson <davidedmundson@kde.org>
(cherry picked from commit 2eb17abf4262b467140ed4262320bf60cbda3ba2)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/client/qwaylanddisplay.cpp | 7 | ||||
-rw-r--r-- | src/client/qwaylanddisplay_p.h | 2 | ||||
-rw-r--r-- | src/client/qwaylandintegration.cpp | 18 | ||||
-rw-r--r-- | src/client/qwaylandintegration_p.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-brcm-egl/main.cpp | 2 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-egl/main.cpp | 2 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-generic/main.cpp | 2 | ||||
-rw-r--r-- | tests/auto/client/clientextension/tst_clientextension.cpp | 14 |
8 files changed, 31 insertions, 19 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp index 2bf09331..bb88a688 100644 --- a/src/client/qwaylanddisplay.cpp +++ b/src/client/qwaylanddisplay.cpp @@ -380,8 +380,11 @@ QWaylandDisplay::~QWaylandDisplay(void) // Steps which is called just after constructor. This separates registry_global() out of the constructor // so that factory functions in integration can be overridden. -void QWaylandDisplay::initialize() +bool QWaylandDisplay::initialize() { + if (!isInitialized()) + return false; + forceRoundTrip(); if (!mWaitingScreens.isEmpty()) { @@ -390,6 +393,8 @@ void QWaylandDisplay::initialize() } if (!mClientSideInputContextRequested) mTextInputManagerIndex = INT_MAX; + + return qEnvironmentVariableIntValue("QT_WAYLAND_DONT_CHECK_SHELL_INTEGRATION") || shellIntegration(); } void QWaylandDisplay::ensureScreen() diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h index 640f33b8..8bc4c0bf 100644 --- a/src/client/qwaylanddisplay_p.h +++ b/src/client/qwaylanddisplay_p.h @@ -97,7 +97,7 @@ public: QWaylandDisplay(QWaylandIntegration *waylandIntegration); ~QWaylandDisplay(void) override; - void initialize(); + bool initialize(); #if QT_CONFIG(xkbcommon) struct xkb_context *xkbContext() const { return mXkbContext.get(); } diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp index 399cc2fd..06a1aec3 100644 --- a/src/client/qwaylandintegration.cpp +++ b/src/client/qwaylandintegration.cpp @@ -83,10 +83,6 @@ QWaylandIntegration::QWaylandIntegration() #endif { mDisplay.reset(new QWaylandDisplay(this)); - if (!mDisplay->isInitialized()) { - mFailed = true; - return; - } QWaylandWindow::fixedToplevelPositions = !qEnvironmentVariableIsSet("QT_WAYLAND_DISABLE_FIXED_POSITIONS"); @@ -99,6 +95,11 @@ QWaylandIntegration::~QWaylandIntegration() sInstance = nullptr; } +bool QWaylandIntegration::init() +{ + return mDisplay->initialize(); +} + QPlatformNativeInterface * QWaylandIntegration::nativeInterface() const { return mNativeInterface.data(); @@ -168,7 +169,7 @@ QPlatformNativeInterface *QWaylandIntegration::createPlatformNativeInterface() // Support platform specific initialization void QWaylandIntegration::initializePlatform() { - mDisplay->initialize(); + mDisplay->initEventThread(); mNativeInterface.reset(createPlatformNativeInterface()); initializeInputDeviceIntegration(); @@ -184,14 +185,9 @@ void QWaylandIntegration::initializePlatform() void QWaylandIntegration::initialize() { - mDisplay->initEventThread(); - - // Call this after initializing event thread for QWaylandDisplay::forceRoundTrip() initializePlatform(); - // But the aboutToBlock() and awake() should be connected after initializePlatform(). - // Otherwise the connected flushRequests() may consumes up all events before processEvents starts to wait, - // so that processEvents(QEventLoop::WaitForMoreEvents) may be blocked in the forceRoundTrip(). + // Call this after initializing event thread for QWaylandDisplay::flushRequests() QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher; QObject::connect(dispatcher, SIGNAL(aboutToBlock()), mDisplay.data(), SLOT(flushRequests())); QObject::connect(dispatcher, SIGNAL(awake()), mDisplay.data(), SLOT(flushRequests())); diff --git a/src/client/qwaylandintegration_p.h b/src/client/qwaylandintegration_p.h index 28406298..d3eb50f7 100644 --- a/src/client/qwaylandintegration_p.h +++ b/src/client/qwaylandintegration_p.h @@ -43,7 +43,7 @@ public: static QWaylandIntegration *instance() { return sInstance; } - bool hasFailed() { return mFailed; } + bool init(); bool hasCapability(QPlatformIntegration::Capability cap) const override; QPlatformWindow *createPlatformWindow(QWindow *window) const override; @@ -133,7 +133,6 @@ private: #if QT_CONFIG(accessibility) mutable QScopedPointer<QPlatformAccessibility> mAccessibility; #endif - bool mFailed = false; QMutex mClientBufferInitLock; bool mClientBufferIntegrationInitialized = false; bool mServerBufferIntegrationInitialized = false; diff --git a/src/plugins/platforms/qwayland-brcm-egl/main.cpp b/src/plugins/platforms/qwayland-brcm-egl/main.cpp index 9d99bbe3..4a13465c 100644 --- a/src/plugins/platforms/qwayland-brcm-egl/main.cpp +++ b/src/plugins/platforms/qwayland-brcm-egl/main.cpp @@ -22,7 +22,7 @@ QPlatformIntegration *QWaylandBrcmEglPlatformIntegrationPlugin::create(const QSt Q_UNUSED(system); auto *integration = new QWaylandBrcmEglPlatformIntegration(); - if (integration->hasFailed()) { + if (!integration->init()) { delete integration; integration = nullptr; } diff --git a/src/plugins/platforms/qwayland-egl/main.cpp b/src/plugins/platforms/qwayland-egl/main.cpp index adcb861b..149f6fc8 100644 --- a/src/plugins/platforms/qwayland-egl/main.cpp +++ b/src/plugins/platforms/qwayland-egl/main.cpp @@ -22,7 +22,7 @@ QPlatformIntegration *QWaylandEglPlatformIntegrationPlugin::create(const QString Q_UNUSED(system); auto *integration = new QWaylandEglPlatformIntegration(); - if (integration->hasFailed()) { + if (!integration->init()) { delete integration; integration = nullptr; } diff --git a/src/plugins/platforms/qwayland-generic/main.cpp b/src/plugins/platforms/qwayland-generic/main.cpp index 0c5087d6..a3486d0d 100644 --- a/src/plugins/platforms/qwayland-generic/main.cpp +++ b/src/plugins/platforms/qwayland-generic/main.cpp @@ -22,7 +22,7 @@ QPlatformIntegration *QWaylandIntegrationPlugin::create(const QString& system, c Q_UNUSED(system); auto *integration = new QWaylandIntegration(); - if (integration->hasFailed()) { + if (!integration->init()) { delete integration; integration = nullptr; } diff --git a/tests/auto/client/clientextension/tst_clientextension.cpp b/tests/auto/client/clientextension/tst_clientextension.cpp index a6e79bd2..91b02e3b 100644 --- a/tests/auto/client/clientextension/tst_clientextension.cpp +++ b/tests/auto/client/clientextension/tst_clientextension.cpp @@ -123,5 +123,17 @@ void tst_clientextension::globalRemoved() QCOMPARE(spy.size(), 1); } -QCOMPOSITOR_TEST_MAIN(tst_clientextension) +int main(int argc, char **argv) +{ + QTemporaryDir tmpRuntimeDir; + setenv("XDG_RUNTIME_DIR", tmpRuntimeDir.path().toLocal8Bit(), 1); + setenv("QT_QPA_PLATFORM", "wayland", 1); + setenv("QT_WAYLAND_DONT_CHECK_SHELL_INTEGRATION", "1", 1); + + tst_clientextension tc; + QGuiApplication app(argc, argv); + QTEST_SET_MAIN_SOURCE_PATH + return QTest::qExec(&tc, argc, argv); +} + #include "tst_clientextension.moc" |