diff options
Diffstat (limited to 'tests/auto/compositor/compositor/tst_compositor.cpp')
-rw-r--r-- | tests/auto/compositor/compositor/tst_compositor.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/auto/compositor/compositor/tst_compositor.cpp b/tests/auto/compositor/compositor/tst_compositor.cpp index e3c4dacc..c7661e8d 100644 --- a/tests/auto/compositor/compositor/tst_compositor.cpp +++ b/tests/auto/compositor/compositor/tst_compositor.cpp @@ -67,6 +67,7 @@ private slots: void seatCreation(); void seatKeyboardFocus(); void seatMouseFocus(); + void inputRegion(); void singleClient(); void multipleClients(); void geometry(); @@ -650,6 +651,61 @@ void tst_WaylandCompositor::seatMouseFocus() delete view; } +void tst_WaylandCompositor::inputRegion() +{ + TestCompositor compositor(true); + compositor.create(); + + // Create client after all the seats have been set up as the mock client + // does not dynamically listen to new seats + MockClient client; + wl_surface *surface = client.createSurface(); + + // We need to attach a buffer, since QWaylandSurface::inputRegionContains will will return + // false for coordinates outside the buffer (so don't let it be 0x0). + QSize size(16, 16); + ShmBuffer buffer(size, client.shm); + wl_surface_attach(surface, buffer.handle, 0, 0); + wl_surface_damage(surface, 0, 0, size.width(), size.height()); + + // Set the input region + wl_region *region = wl_compositor_create_region(client.compositor); + wl_region_add(region, 1, 2, 3, 4); + wl_surface_set_input_region(surface, region); + + // Commit everything + wl_surface_commit(surface); + + QTRY_COMPARE(compositor.surfaces.size(), 1); + QWaylandSurface *waylandSurface = compositor.surfaces.at(0); + + QVERIFY(waylandSurface->inputRegionContains(QPoint(1, 2))); + QVERIFY(waylandSurface->inputRegionContains(QPoint(3, 5))); + QVERIFY(!waylandSurface->inputRegionContains(QPoint(0, 0))); + QVERIFY(!waylandSurface->inputRegionContains(QPoint(1, 6))); + QVERIFY(!waylandSurface->inputRegionContains(QPoint(4, 2))); + + // Setting a nullptr input region means we want all events + wl_surface_set_input_region(surface, nullptr); + wl_surface_commit(surface); + + QTRY_VERIFY(waylandSurface->inputRegionContains(QPoint(0, 0))); + QVERIFY(waylandSurface->inputRegionContains(QPoint(1, 6))); + QVERIFY(waylandSurface->inputRegionContains(QPoint(4, 2))); + + // But points outside the buffer should still return false + QVERIFY(!waylandSurface->inputRegionContains(QPoint(-1, -1))); + QVERIFY(!waylandSurface->inputRegionContains(QPoint(16, 16))); + + // Setting an empty region means we want no events + wl_region *emptyRegion = wl_compositor_create_region(client.compositor); + wl_surface_set_input_region(surface, emptyRegion); + wl_surface_commit(surface); + + QTRY_VERIFY(!waylandSurface->inputRegionContains(QPoint(0, 0))); + QVERIFY(!waylandSurface->inputRegionContains(QPoint(1, 2))); +} + class XdgTestCompositor: public TestCompositor { Q_OBJECT public: |