diff --git a/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp b/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp index 04aca8c2e12..4202b333b47 100644 --- a/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp +++ b/src/plugins/platforms/wayland/global/qwaylandclientextension.cpp @@ -39,7 +39,7 @@ #include #include #include -#include +#include QT_BEGIN_NAMESPACE @@ -51,35 +51,37 @@ QWaylandClientExtensionPrivate::QWaylandClientExtensionPrivate() { // Keep the possibility to use a custom waylandIntegration as a plugin, // but also add the possibility to run it as a QML component. - struct ::wl_display *waylandDisplay = NULL; - if (QGuiApplication::platformNativeInterface()) { - waylandDisplay = static_cast(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_display")); - } else { + waylandIntegration = static_cast(QGuiApplicationPrivate::platformIntegration()); + if (!waylandIntegration) waylandIntegration = new QtWaylandClient::QWaylandIntegration(); - waylandDisplay = waylandIntegration->display()->wl_display(); - } - - Q_ASSERT(waylandDisplay); - struct ::wl_registry *registry = wl_display_get_registry(waylandDisplay); - QtWayland::wl_registry::init(registry); } -void QWaylandClientExtensionPrivate::registry_global(uint32_t id, const QString &interfaceName, uint32_t ver) +void QWaylandClientExtensionPrivate::handleRegistryGlobal(void *data, ::wl_registry *registry, uint32_t id, + const QString &interface, uint32_t version) { - Q_Q(QWaylandClientExtension); - if (interfaceName == QLatin1String(q->extensionInterface()->name)) { - struct ::wl_registry *registry = static_cast(QtWayland::wl_registry::object()); - q->bind(registry, id, ver); - active = true; - emit q->activeChanged(); + QWaylandClientExtension *extension = static_cast(data); + if (interface == QLatin1String(extension->extensionInterface()->name)) { + extension->bind(registry, id, version); + extension->d_func()->active = true; + emit extension->activeChanged(); } } +void QWaylandClientExtension::addRegistryListener() +{ + Q_D(QWaylandClientExtension); + d->waylandIntegration->display()->addRegistryListener(&QWaylandClientExtensionPrivate::handleRegistryGlobal, this); +} + QWaylandClientExtension::QWaylandClientExtension(const int ver) : QObject(*new QWaylandClientExtensionPrivate()) { Q_D(QWaylandClientExtension); d->version = ver; + + // The registry listener uses virtual functions and we don't want it to be called from + // the constructor. + QMetaObject::invokeMethod(this, "addRegistryListener", Qt::QueuedConnection); } QtWaylandClient::QWaylandIntegration *QWaylandClientExtension::integration() const diff --git a/src/plugins/platforms/wayland/global/qwaylandclientextension.h b/src/plugins/platforms/wayland/global/qwaylandclientextension.h index 9ff45ea00d0..a39f32b7f29 100644 --- a/src/plugins/platforms/wayland/global/qwaylandclientextension.h +++ b/src/plugins/platforms/wayland/global/qwaylandclientextension.h @@ -69,6 +69,9 @@ protected: Q_SIGNALS: void versionChanged(); void activeChanged(); + +private Q_SLOTS: + void addRegistryListener(); }; template diff --git a/src/plugins/platforms/wayland/global/qwaylandclientextension_p.h b/src/plugins/platforms/wayland/global/qwaylandclientextension_p.h index 70cf36c3da9..88cc7a88718 100644 --- a/src/plugins/platforms/wayland/global/qwaylandclientextension_p.h +++ b/src/plugins/platforms/wayland/global/qwaylandclientextension_p.h @@ -51,22 +51,20 @@ #include "qwaylandclientextension.h" #include #include -#include QT_BEGIN_NAMESPACE -class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtensionPrivate : public QObjectPrivate, public QtWayland::wl_registry +class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtensionPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QWaylandClientExtension) public: QWaylandClientExtensionPrivate(); + static void handleRegistryGlobal(void *data, ::wl_registry *registry, uint32_t id, + const QString &interface, uint32_t version); QtWaylandClient::QWaylandIntegration *waylandIntegration; int version; bool active; - -protected: - void registry_global(uint32_t id, const QString &interfaceName, uint32_t version) Q_DECL_OVERRIDE; }; class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtensionTemplatePrivate : public QWaylandClientExtensionPrivate