[autotests] Add test case for showing auto-hiding panel through swipe gesture
parent
634dfc09e4
commit
4adb2b65e8
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue