diff options
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.cpp | 13 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.h | 2 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/tst_compositor.cpp | 27 |
3 files changed, 41 insertions, 1 deletions
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 13ae2822..050ab564 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -431,6 +431,19 @@ QWaylandClient *QWaylandSurface::client() const } /*! + * \property QWaylandSurface::waylandClient + * + * This property holds the \c wl_client using this QWaylandSurface. + */ +::wl_client *QWaylandSurface::waylandClient() const +{ + if (auto *c = client()) + return c->client(); + + return nullptr; +} + +/*! * \qmlproperty bool QtWaylandCompositor::WaylandSurface::hasContent * * This property holds whether the WaylandSurface has content. diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index c208c16d..a138b2af 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -103,7 +103,7 @@ public: bool isInitialized() const; QWaylandClient *client() const; - struct wl_client *waylandClient() const { return client()->client(); } + ::wl_client *waylandClient() const; bool setRole(QWaylandSurfaceRole *role, wl_resource *errorResource, uint32_t errorCode); QWaylandSurfaceRole *role() const; diff --git a/tests/auto/compositor/compositor/tst_compositor.cpp b/tests/auto/compositor/compositor/tst_compositor.cpp index 97e650d9..e12aa564 100644 --- a/tests/auto/compositor/compositor/tst_compositor.cpp +++ b/tests/auto/compositor/compositor/tst_compositor.cpp @@ -78,6 +78,7 @@ private slots: void mapSurfaceHiDpi(); void frameCallback(); void removeOutput(); + void customSurface(); void advertisesXdgShellSupport(); void createsXdgSurfaces(); @@ -613,6 +614,32 @@ void tst_WaylandCompositor::removeOutput() QTRY_COMPARE(client.m_outputs.size(), 1); } +class CustomSurface : public QWaylandSurface { + Q_OBJECT +public: + explicit CustomSurface() = default; +}; + +void tst_WaylandCompositor::customSurface() +{ + TestCompositor compositor; + QObject::connect(&compositor, &TestCompositor::surfaceRequested, this, [&compositor] (QWaylandClient *client, uint id, int version) { + auto *s = new CustomSurface(); + QCOMPARE(s->waylandClient(), nullptr); + s->initialize(&compositor, client, id, version); + QCOMPARE(s->waylandClient(), client->client()); + }); + QObject::connect(&compositor, &TestCompositor::surfaceCreated, this, [] (QWaylandSurface *surface) { + auto *custom = qobject_cast<CustomSurface *>(surface); + QVERIFY(custom != nullptr); + }); + compositor.create(); + + MockClient client; + wl_surface *surface = client.createSurface(); + QTRY_COMPARE(compositor.surfaces.size(), 1); +} + void tst_WaylandCompositor::seatCapabilities() { TestCompositor compositor; |