summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Fedin <fedin-ilja2010@ya.ru>2023-03-28 01:16:56 +0400
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-04-03 16:41:51 +0000
commit5b64b363bf9c8a8a14e292de5ddf361f68917e26 (patch)
tree08f518fb54ac6e552620e9b12d7e574046c5b1ac
parent23a026cd33582f2ca65dabfd45a3ed33f1a7da71 (diff)
downloadqtwayland-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.cpp7
-rw-r--r--src/client/qwaylanddisplay_p.h2
-rw-r--r--src/client/qwaylandintegration.cpp18
-rw-r--r--src/client/qwaylandintegration_p.h3
-rw-r--r--src/plugins/platforms/qwayland-brcm-egl/main.cpp2
-rw-r--r--src/plugins/platforms/qwayland-egl/main.cpp2
-rw-r--r--src/plugins/platforms/qwayland-generic/main.cpp2
-rw-r--r--tests/auto/client/clientextension/tst_clientextension.cpp14
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"