From ef99cac249b97bc06aac7a056a38532b1207d1ce Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Wed, 14 Feb 2018 16:22:25 +0100 Subject: [PATCH] Client: Fail gracefully when wl_display_connect fails [ChangeLog][QPA plugin] If we're unable to create a connection to the Wayland display, fail gracefully so other platform integrations can be tried instead. This also adds QWaylandIntegration::hasFailed() which can later be extended to report that the platform plugin is unusable for other reasons. I.e. no compatible shell extensions or similar. Task-number: QTBUG-59762 Change-Id: I0f1ae73982e2860814235c1a189741d130e1db3e Reviewed-by: Paul Olav Tvete --- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 9 +++++---- src/plugins/platforms/wayland/qwaylandintegration.cpp | 4 ++++ src/plugins/platforms/wayland/qwaylandintegration_p.h | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 942494f93cd..179c0454e0c 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -142,9 +142,9 @@ QWaylandDisplay::QWaylandDisplay(QWaylandIntegration *waylandIntegration) qRegisterMetaType("uint32_t"); mDisplay = wl_display_connect(nullptr); - if (mDisplay == nullptr) { - qErrnoWarning(errno, "Failed to create display"); - ::exit(1); + if (!mDisplay) { + qErrnoWarning(errno, "Failed to create wl_display"); + return; } struct ::wl_registry *registry = wl_display_get_registry(mDisplay); @@ -170,7 +170,8 @@ QWaylandDisplay::~QWaylandDisplay(void) #if QT_CONFIG(wayland_datadevice) delete mDndSelectionHandler.take(); #endif - wl_display_disconnect(mDisplay); + if (mDisplay) + wl_display_disconnect(mDisplay); } void QWaylandDisplay::checkError() const diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 698abd8fd4a..267e481ac9c 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -134,6 +134,10 @@ QWaylandIntegration::QWaylandIntegration() { initializeInputDeviceIntegration(); mDisplay.reset(new QWaylandDisplay(this)); + if (!mDisplay->isInitialized()) { + mFailed = true; + return; + } #if QT_CONFIG(clipboard) mClipboard.reset(new QWaylandClipboard(mDisplay.data())); #endif diff --git a/src/plugins/platforms/wayland/qwaylandintegration_p.h b/src/plugins/platforms/wayland/qwaylandintegration_p.h index 174eca25315..17144b8d716 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration_p.h +++ b/src/plugins/platforms/wayland/qwaylandintegration_p.h @@ -73,6 +73,8 @@ public: QWaylandIntegration(); ~QWaylandIntegration(); + bool hasFailed() { return mFailed; } + bool hasCapability(QPlatformIntegration::Capability cap) const override; QPlatformWindow *createPlatformWindow(QWindow *window) const override; #if QT_CONFIG(opengl) @@ -144,6 +146,7 @@ private: #if QT_CONFIG(accessibility) QScopedPointer mAccessibility; #endif + bool mFailed = false; bool mClientBufferIntegrationInitialized; bool mServerBufferIntegrationInitialized; bool mShellIntegrationInitialized;