diff options
Diffstat (limited to 'tests/auto/compositor/compositor')
-rw-r--r-- | tests/auto/compositor/compositor/mockclient.cpp | 24 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/mockclient.h | 4 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testcompositor.cpp | 2 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/tst_compositor.cpp | 19 |
4 files changed, 40 insertions, 9 deletions
diff --git a/tests/auto/compositor/compositor/mockclient.cpp b/tests/auto/compositor/compositor/mockclient.cpp index da1096fb9..bdc2b3b93 100644 --- a/tests/auto/compositor/compositor/mockclient.cpp +++ b/tests/auto/compositor/compositor/mockclient.cpp @@ -41,13 +41,13 @@ #include <sys/mman.h> const struct wl_registry_listener MockClient::registryListener = { - MockClient::handleGlobal + MockClient::handleGlobal, + MockClient::handleGlobalRemove }; MockClient::MockClient() : display(wl_display_connect("wayland-qt-test-0")) , compositor(0) - , output(0) , registry(0) , wlshell(0) , xdgShell(nullptr) @@ -74,9 +74,9 @@ MockClient::MockClient() timeout.start(); do { QCoreApplication::processEvents(); - } while (!(compositor && output) && timeout.elapsed() < 1000); + } while (!(compositor && !m_outputs.isEmpty()) && timeout.elapsed() < 1000); - if (!compositor || !output) + if (!compositor || m_outputs.empty()) qFatal("MockClient(): failed to receive globals from display"); } @@ -165,12 +165,19 @@ void MockClient::handleGlobal(void *data, wl_registry *registry, uint32_t id, co resolve(data)->handleGlobal(id, QByteArray(interface)); } +void MockClient::handleGlobalRemove(void *data, wl_registry *wl_registry, uint32_t id) +{ + Q_UNUSED(wl_registry); + resolve(data)->handleGlobalRemove(id); +} + void MockClient::handleGlobal(uint32_t id, const QByteArray &interface) { if (interface == "wl_compositor") { compositor = static_cast<wl_compositor *>(wl_registry_bind(registry, id, &wl_compositor_interface, 1)); } else if (interface == "wl_output") { - output = static_cast<wl_output *>(wl_registry_bind(registry, id, &wl_output_interface, 2)); + auto output = static_cast<wl_output *>(wl_registry_bind(registry, id, &wl_output_interface, 2)); + m_outputs.insert(id, output); wl_output_add_listener(output, &outputListener, this); } else if (interface == "wl_shm") { shm = static_cast<wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface, 1)); @@ -186,6 +193,11 @@ void MockClient::handleGlobal(uint32_t id, const QByteArray &interface) } } +void MockClient::handleGlobalRemove(uint32_t id) +{ + m_outputs.remove(id); +} + wl_surface *MockClient::createSurface() { flushDisplay(); @@ -248,7 +260,7 @@ ShmBuffer::ShmBuffer(const QSize &size, wl_shm *shm) ShmBuffer::~ShmBuffer() { - munmap(image.bits(), image.byteCount()); + munmap(image.bits(), image.sizeInBytes()); wl_buffer_destroy(handle); wl_shm_pool_destroy(shm_pool); } diff --git a/tests/auto/compositor/compositor/mockclient.h b/tests/auto/compositor/compositor/mockclient.h index 1881393a6..dd50f9a28 100644 --- a/tests/auto/compositor/compositor/mockclient.h +++ b/tests/auto/compositor/compositor/mockclient.h @@ -64,7 +64,7 @@ public: wl_display *display; wl_compositor *compositor; - wl_output *output; + QMap<uint, wl_output *> m_outputs; wl_shm *shm; wl_registry *registry; wl_shell *wlshell; @@ -96,6 +96,7 @@ private: static MockClient *resolve(void *data) { return static_cast<MockClient *>(data); } static const struct wl_registry_listener registryListener; static void handleGlobal(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version); + static void handleGlobalRemove(void *data, struct wl_registry *wl_registry, uint32_t id); static int sourceUpdate(uint32_t mask, void *data); static void outputGeometryEvent(void *data, @@ -117,6 +118,7 @@ private: static void outputScale(void *data, wl_output *output, int factor); void handleGlobal(uint32_t id, const QByteArray &interface); + void handleGlobalRemove(uint32_t id); static const wl_output_listener outputListener; }; diff --git a/tests/auto/compositor/compositor/testcompositor.cpp b/tests/auto/compositor/compositor/testcompositor.cpp index 733bea5b3..f91d0d3f1 100644 --- a/tests/auto/compositor/compositor/testcompositor.cpp +++ b/tests/auto/compositor/compositor/testcompositor.cpp @@ -42,7 +42,7 @@ TestCompositor::TestCompositor(bool createInputDev) void TestCompositor::create() { - new QWaylandOutput(this, Q_NULLPTR); + new QWaylandOutput(this, nullptr); QWaylandCompositor::create(); connect(this, &QWaylandCompositor::surfaceCreated, this, &TestCompositor::onSurfaceCreated); diff --git a/tests/auto/compositor/compositor/tst_compositor.cpp b/tests/auto/compositor/compositor/tst_compositor.cpp index c51c13bd6..96095a0d4 100644 --- a/tests/auto/compositor/compositor/tst_compositor.cpp +++ b/tests/auto/compositor/compositor/tst_compositor.cpp @@ -67,6 +67,7 @@ private slots: void sizeFollowsWindow(); void mapSurface(); void frameCallback(); + void removeOutput(); void advertisesXdgShellSupport(); void createsXdgSurfaces(); @@ -201,7 +202,7 @@ void tst_WaylandCompositor::keyboardGrab() QTRY_COMPARE(grabKeyReleaseSpy.count(), 2); // Stop grabbing - seat->setKeyboardFocus(Q_NULLPTR); + seat->setKeyboardFocus(nullptr); seat->sendFullKeyEvent(&ke); seat->sendFullKeyEvent(&ke1); QTRY_COMPARE(grabKeyPressSpy.count(), 2); @@ -378,6 +379,22 @@ void tst_WaylandCompositor::frameCallback() wl_surface_destroy(surface); } +void tst_WaylandCompositor::removeOutput() +{ + TestCompositor compositor; + QWindow window; + window.resize(800, 600); + auto output = new QWaylandOutput(&compositor, &window); + + compositor.create(); + MockClient client; + QTRY_COMPARE(client.m_outputs.size(), 2); + + delete output; + compositor.flushClients(); + QTRY_COMPARE(client.m_outputs.size(), 1); +} + void tst_WaylandCompositor::seatCapabilities() { TestCompositor compositor; |