From 4adb2b65e87f410bd844822c54a68aebcab863fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 28 Mar 2017 22:01:16 +0200 Subject: [PATCH] [autotests] Add test case for showing auto-hiding panel through swipe gesture --- .../screenedge_client_show_test.cpp | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/autotests/integration/screenedge_client_show_test.cpp b/autotests/integration/screenedge_client_show_test.cpp index 20b76495c0..ece4d2cc0e 100644 --- a/autotests/integration/screenedge_client_show_test.cpp +++ b/autotests/integration/screenedge_client_show_test.cpp @@ -45,6 +45,8 @@ private Q_SLOTS: void init(); void testScreenEdgeShowHideX11_data(); void testScreenEdgeShowHideX11(); + void testScreenEdgeShowX11Touch_data(); + void testScreenEdgeShowX11Touch(); }; void ScreenEdgeClientShowTest::initTestCase() @@ -184,6 +186,99 @@ void ScreenEdgeClientShowTest::testScreenEdgeShowHideX11() QVERIFY(windowClosedSpy.wait()); } +void ScreenEdgeClientShowTest::testScreenEdgeShowX11Touch_data() +{ + QTest::addColumn("windowGeometry"); + QTest::addColumn("location"); + QTest::addColumn("touchDownPos"); + QTest::addColumn("targetPos"); + + QTest::newRow("bottom/left") << QRect(50, 1004, 1180, 20) << 2u << QPoint(100, 1023) << QPoint(100, 540); + QTest::newRow("bottom/right") << QRect(1330, 1004, 1180, 20) << 2u << QPoint(1400, 1023) << QPoint(1400, 520); + QTest::newRow("top/left") << QRect(50, 0, 1180, 20) << 0u << QPoint(100, 0) << QPoint(100, 350); + QTest::newRow("top/right") << QRect(1330, 0, 1180, 20) << 0u << QPoint(1400, 0) << QPoint(1400, 400); + QTest::newRow("left") << QRect(0, 10, 20, 1000) << 3u << QPoint(0, 50) << QPoint(400, 50); + QTest::newRow("right") << QRect(2540, 10, 20, 1000) << 1u << QPoint(2559, 60) << QPoint(2200, 60); +} + +void ScreenEdgeClientShowTest::testScreenEdgeShowX11Touch() +{ + // this test creates a window which borders the screen and sets the screenedge show hint + // that should trigger a show of the window whenever the touch screen swipe gesture is triggered + + // create the test window + QScopedPointer c(xcb_connect(nullptr, nullptr)); + QVERIFY(!xcb_connection_has_error(c.data())); + // atom for the screenedge show hide functionality + Xcb::Atom atom(QByteArrayLiteral("_KDE_NET_WM_SCREEN_EDGE_SHOW"), false, c.data()); + + xcb_window_t w = xcb_generate_id(c.data()); + QFETCH(QRect, windowGeometry); + xcb_create_window(c.data(), XCB_COPY_FROM_PARENT, w, rootWindow(), + windowGeometry.x(), + windowGeometry.y(), + windowGeometry.width(), + windowGeometry.height(), + 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0, nullptr); + xcb_size_hints_t hints; + memset(&hints, 0, sizeof(hints)); + xcb_icccm_size_hints_set_position(&hints, 1, windowGeometry.x(), windowGeometry.y()); + xcb_icccm_size_hints_set_size(&hints, 1, windowGeometry.width(), windowGeometry.height()); + xcb_icccm_set_wm_normal_hints(c.data(), w, &hints); + NETWinInfo info(c.data(), w, rootWindow(), NET::WMAllProperties, NET::WM2AllProperties); + info.setWindowType(NET::Dock); + xcb_map_window(c.data(), w); + xcb_flush(c.data()); + + QSignalSpy windowCreatedSpy(workspace(), &Workspace::clientAdded); + QVERIFY(windowCreatedSpy.isValid()); + QVERIFY(windowCreatedSpy.wait()); + Client *client = windowCreatedSpy.last().first().value(); + QVERIFY(client); + QVERIFY(!client->isDecorated()); + QCOMPARE(client->geometry(), windowGeometry); + QVERIFY(!client->hasStrut()); + QVERIFY(!client->isHiddenInternal()); + + QSignalSpy effectsWindowAdded(effects, &EffectsHandler::windowAdded); + QVERIFY(effectsWindowAdded.isValid()); + QVERIFY(effectsWindowAdded.wait()); + + // now try to hide + QFETCH(quint32, location); + xcb_change_property(c.data(), XCB_PROP_MODE_REPLACE, w, atom, XCB_ATOM_CARDINAL, 32, 1, &location); + xcb_flush(c.data()); + + QSignalSpy effectsWindowHiddenSpy(effects, &EffectsHandler::windowHidden); + QVERIFY(effectsWindowHiddenSpy.isValid()); + QSignalSpy clientHiddenSpy(client, &Client::windowHidden); + QVERIFY(clientHiddenSpy.isValid()); + QVERIFY(clientHiddenSpy.wait()); + QVERIFY(client->isHiddenInternal()); + QCOMPARE(effectsWindowHiddenSpy.count(), 1); + + // now trigger the edge + QSignalSpy effectsWindowShownSpy(effects, &EffectsHandler::windowShown); + QVERIFY(effectsWindowShownSpy.isValid()); + quint32 timestamp = 0; + QFETCH(QPoint, touchDownPos); + QFETCH(QPoint, targetPos); + kwinApp()->platform()->touchDown(0, touchDownPos, timestamp++); + kwinApp()->platform()->touchMotion(0, targetPos, timestamp++); + kwinApp()->platform()->touchUp(0, timestamp++); + QVERIFY(effectsWindowShownSpy.wait()); + QVERIFY(!client->isHiddenInternal()); + QCOMPARE(effectsWindowShownSpy.count(), 1); + + // destroy window again + QSignalSpy windowClosedSpy(client, &Client::windowClosed); + QVERIFY(windowClosedSpy.isValid()); + xcb_unmap_window(c.data(), w); + xcb_destroy_window(c.data(), w); + xcb_flush(c.data()); + QVERIFY(windowClosedSpy.wait()); +} + } WAYLANDTEST_MAIN(KWin::ScreenEdgeClientShowTest)