aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Gräßlin <[email protected]>2017-03-28 22:01:16 +0200
committerMartin Gräßlin <[email protected]>2017-03-28 22:01:16 +0200
commit4adb2b65e87f410bd844822c54a68aebcab863fd (patch)
treed99b565f179d58084600ac047c5fb93b0595ea78
parent634dfc09e42ad44672e8f235fabb3110010491ce (diff)
[autotests] Add test case for showing auto-hiding panel through swipe gesture
-rw-r--r--autotests/integration/screenedge_client_show_test.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/autotests/integration/screenedge_client_show_test.cpp b/autotests/integration/screenedge_client_show_test.cpp
index 20b7649..ece4d2c 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<QRect>("windowGeometry");
+ QTest::addColumn<quint32>("location");
+ QTest::addColumn<QPoint>("touchDownPos");
+ QTest::addColumn<QPoint>("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<xcb_connection_t, XcbConnectionDeleter> 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<Client*>();
+ 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)