diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2018-02-14 16:22:25 +0100 |
---|---|---|
committer | Johan Helsing <johan.helsing@qt.io> | 2018-02-26 15:59:45 +0000 |
commit | 72999738489b5251d025c954a77c93e8e1fdfd9d (patch) | |
tree | 1e17836dea84c49e078aacbc3a363ca305dbe605 | |
parent | 5b69d5f05fdf187ae8a5f08e9a57375cbbd7f142 (diff) | |
download | qtwayland-72999738489b5251d025c954a77c93e8e1fdfd9d.tar.gz |
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 <paul.tvete@qt.io>
-rw-r--r-- | src/client/qwaylanddisplay.cpp | 9 | ||||
-rw-r--r-- | src/client/qwaylandintegration.cpp | 4 | ||||
-rw-r--r-- | src/client/qwaylandintegration_p.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-brcm-egl/main.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-egl/main.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-generic/main.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-xcomposite-egl/main.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/qwayland-xcomposite-glx/main.cpp | 9 |
8 files changed, 52 insertions, 9 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp index 942494f9..179c0454 100644 --- a/src/client/qwaylanddisplay.cpp +++ b/src/client/qwaylanddisplay.cpp @@ -142,9 +142,9 @@ QWaylandDisplay::QWaylandDisplay(QWaylandIntegration *waylandIntegration) qRegisterMetaType<uint32_t>("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/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp index 698abd8f..267e481a 100644 --- a/src/client/qwaylandintegration.cpp +++ b/src/client/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/client/qwaylandintegration_p.h b/src/client/qwaylandintegration_p.h index 174eca25..17144b8d 100644 --- a/src/client/qwaylandintegration_p.h +++ b/src/client/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<QPlatformAccessibility> mAccessibility; #endif + bool mFailed = false; bool mClientBufferIntegrationInitialized; bool mServerBufferIntegrationInitialized; bool mShellIntegrationInitialized; diff --git a/src/plugins/platforms/qwayland-brcm-egl/main.cpp b/src/plugins/platforms/qwayland-brcm-egl/main.cpp index 2640c8ea..5fa40b8a 100644 --- a/src/plugins/platforms/qwayland-brcm-egl/main.cpp +++ b/src/plugins/platforms/qwayland-brcm-egl/main.cpp @@ -56,7 +56,14 @@ QPlatformIntegration *QWaylandBrcmEglPlatformIntegrationPlugin::create(const QSt { Q_UNUSED(paramList); Q_UNUSED(system); - return new QWaylandBrcmEglPlatformIntegration(); + auto *integration = new QWaylandBrcmEglPlatformIntegration(); + + if (integration->hasFailed()) { + delete integration; + integration = nullptr; + } + + return integration; } } diff --git a/src/plugins/platforms/qwayland-egl/main.cpp b/src/plugins/platforms/qwayland-egl/main.cpp index ebeeff39..76b82b3b 100644 --- a/src/plugins/platforms/qwayland-egl/main.cpp +++ b/src/plugins/platforms/qwayland-egl/main.cpp @@ -56,7 +56,14 @@ QPlatformIntegration *QWaylandEglPlatformIntegrationPlugin::create(const QString { Q_UNUSED(paramList); Q_UNUSED(system); - return new QWaylandEglPlatformIntegration(); + auto *integration = new QWaylandEglPlatformIntegration(); + + if (integration->hasFailed()) { + delete integration; + integration = nullptr; + } + + return integration; } } diff --git a/src/plugins/platforms/qwayland-generic/main.cpp b/src/plugins/platforms/qwayland-generic/main.cpp index 08295c97..e66a5d45 100644 --- a/src/plugins/platforms/qwayland-generic/main.cpp +++ b/src/plugins/platforms/qwayland-generic/main.cpp @@ -56,7 +56,14 @@ QPlatformIntegration *QWaylandIntegrationPlugin::create(const QString& system, c { Q_UNUSED(paramList); Q_UNUSED(system); - return new QWaylandIntegration(); + auto *integration = new QWaylandIntegration(); + + if (integration->hasFailed()) { + delete integration; + integration = nullptr; + } + + return integration; } } diff --git a/src/plugins/platforms/qwayland-xcomposite-egl/main.cpp b/src/plugins/platforms/qwayland-xcomposite-egl/main.cpp index 996f6084..d191bba9 100644 --- a/src/plugins/platforms/qwayland-xcomposite-egl/main.cpp +++ b/src/plugins/platforms/qwayland-xcomposite-egl/main.cpp @@ -56,7 +56,14 @@ QPlatformIntegration *QWaylandXCompositeEglPlatformIntegrationPlugin::create(con { Q_UNUSED(paramList); Q_UNUSED(system); - return new QWaylandXCompositeEglPlatformIntegration(); + auto *integration = new QWaylandXCompositeEglPlatformIntegration(); + + if (integration->hasFailed()) { + delete integration; + integration = nullptr; + } + + return integration; } } diff --git a/src/plugins/platforms/qwayland-xcomposite-glx/main.cpp b/src/plugins/platforms/qwayland-xcomposite-glx/main.cpp index 9f075ebb..1dfbc0cf 100644 --- a/src/plugins/platforms/qwayland-xcomposite-glx/main.cpp +++ b/src/plugins/platforms/qwayland-xcomposite-glx/main.cpp @@ -58,7 +58,14 @@ QPlatformIntegration *QWaylandXCompositeGlxPlatformIntegrationPlugin::create(con { Q_UNUSED(paramList); Q_UNUSED(system); - return new QWaylandXCompositeGlxPlatformIntegration(); + auto *integration = new QWaylandXCompositeGlxPlatformIntegration(); + + if (integration->hasFailed()) { + delete integration; + integration = nullptr; + } + + return integration; } } |