[autotest] Add a test for a KWin internal QWindow
The test creates a QRasterWindow which through KWin's internal QPA is considered an internal window. In the test methods we simulate various pointer events (enter/leave, press/release, wheel).
This commit is contained in:
parent
eca06ecb02
commit
dfd0664fd6
2 changed files with 235 additions and 0 deletions
|
@ -62,3 +62,12 @@ add_executable(testDecorationInput ${testDecorationInput_SRCS})
|
||||||
target_link_libraries( testDecorationInput kwin Qt5::Test)
|
target_link_libraries( testDecorationInput kwin Qt5::Test)
|
||||||
add_test(kwin-testDecorationInput testDecorationInput)
|
add_test(kwin-testDecorationInput testDecorationInput)
|
||||||
ecm_mark_as_test(testDecorationInput)
|
ecm_mark_as_test(testDecorationInput)
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Internal Window test
|
||||||
|
########################################################
|
||||||
|
set( testInternalWindow_SRCS internal_window.cpp kwin_wayland_test.cpp )
|
||||||
|
add_executable(testInternalWindow ${testInternalWindow_SRCS})
|
||||||
|
target_link_libraries( testInternalWindow kwin Qt5::Test)
|
||||||
|
add_test(kwin-testInternalWindow testInternalWindow)
|
||||||
|
ecm_mark_as_test(testInternalWindow)
|
||||||
|
|
226
autotests/wayland/internal_window.cpp
Normal file
226
autotests/wayland/internal_window.cpp
Normal file
|
@ -0,0 +1,226 @@
|
||||||
|
/********************************************************************
|
||||||
|
KWin - the KDE window manager
|
||||||
|
This file is part of the KDE project.
|
||||||
|
|
||||||
|
Copyright (C) 2016 Martin Gräßlin <mgraesslin@kde.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*********************************************************************/
|
||||||
|
#include "kwin_wayland_test.h"
|
||||||
|
#include "abstract_backend.h"
|
||||||
|
#include "cursor.h"
|
||||||
|
#include "shell_client.h"
|
||||||
|
#include "screens.h"
|
||||||
|
#include "wayland_server.h"
|
||||||
|
#include "workspace.h"
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QRasterWindow>
|
||||||
|
|
||||||
|
#include <linux/input.h>
|
||||||
|
|
||||||
|
namespace KWin
|
||||||
|
{
|
||||||
|
|
||||||
|
static const QString s_socketName = QStringLiteral("wayland_test_kwin_internal_window-0");
|
||||||
|
|
||||||
|
class InternalWindowTest : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private Q_SLOTS:
|
||||||
|
void initTestCase();
|
||||||
|
void init();
|
||||||
|
void testEnterLeave();
|
||||||
|
void testPointerPressRelease();
|
||||||
|
void testPointerAxis();
|
||||||
|
};
|
||||||
|
|
||||||
|
class HelperWindow : public QRasterWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
HelperWindow();
|
||||||
|
~HelperWindow();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void entered();
|
||||||
|
void left();
|
||||||
|
void mouseMoved(const QPoint &global);
|
||||||
|
void mousePressed();
|
||||||
|
void mouseReleased();
|
||||||
|
void wheel();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
bool event(QEvent *event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||||
|
void wheelEvent(QWheelEvent *event) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
HelperWindow::HelperWindow()
|
||||||
|
: QRasterWindow(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HelperWindow::~HelperWindow() = default;
|
||||||
|
|
||||||
|
void HelperWindow::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event)
|
||||||
|
QPainter p(this);
|
||||||
|
p.fillRect(0, 0, width(), height(), Qt::red);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HelperWindow::event(QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::Enter) {
|
||||||
|
emit entered();
|
||||||
|
}
|
||||||
|
if (event->type() == QEvent::Leave) {
|
||||||
|
emit left();
|
||||||
|
}
|
||||||
|
return QRasterWindow::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperWindow::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
emit mouseMoved(event->globalPos());
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperWindow::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event)
|
||||||
|
emit mousePressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperWindow::mouseReleaseEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event)
|
||||||
|
emit mouseReleased();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperWindow::wheelEvent(QWheelEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event)
|
||||||
|
emit wheel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternalWindowTest::initTestCase()
|
||||||
|
{
|
||||||
|
qRegisterMetaType<KWin::ShellClient*>();
|
||||||
|
qRegisterMetaType<KWin::AbstractClient*>();
|
||||||
|
QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated);
|
||||||
|
QVERIFY(workspaceCreatedSpy.isValid());
|
||||||
|
waylandServer()->backend()->setInitialWindowSize(QSize(1280, 1024));
|
||||||
|
QMetaObject::invokeMethod(waylandServer()->backend(), "setOutputCount", Qt::DirectConnection, Q_ARG(int, 2));
|
||||||
|
waylandServer()->init(s_socketName.toLocal8Bit());
|
||||||
|
|
||||||
|
kwinApp()->start();
|
||||||
|
QVERIFY(workspaceCreatedSpy.wait());
|
||||||
|
QCOMPARE(screens()->count(), 2);
|
||||||
|
QCOMPARE(screens()->geometry(0), QRect(0, 0, 1280, 1024));
|
||||||
|
QCOMPARE(screens()->geometry(1), QRect(1280, 0, 1280, 1024));
|
||||||
|
waylandServer()->initWorkspace();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternalWindowTest::init()
|
||||||
|
{
|
||||||
|
Cursor::setPos(QPoint(1280, 512));
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternalWindowTest::testEnterLeave()
|
||||||
|
{
|
||||||
|
QSignalSpy clientAddedSpy(waylandServer(), &WaylandServer::shellClientAdded);
|
||||||
|
QVERIFY(clientAddedSpy.isValid());
|
||||||
|
HelperWindow win;
|
||||||
|
win.setGeometry(0, 0, 100, 100);
|
||||||
|
win.show();
|
||||||
|
|
||||||
|
QVERIFY(clientAddedSpy.wait());
|
||||||
|
QCOMPARE(clientAddedSpy.count(), 1);
|
||||||
|
QVERIFY(!workspace()->activeClient());
|
||||||
|
ShellClient *c = clientAddedSpy.first().first().value<ShellClient*>();
|
||||||
|
QVERIFY(c->isInternal());
|
||||||
|
QCOMPARE(c->geometry(), QRect(0, 0, 100, 100));
|
||||||
|
|
||||||
|
QSignalSpy enterSpy(&win, &HelperWindow::entered);
|
||||||
|
QVERIFY(enterSpy.isValid());
|
||||||
|
QSignalSpy leaveSpy(&win, &HelperWindow::left);
|
||||||
|
QVERIFY(leaveSpy.isValid());
|
||||||
|
QSignalSpy moveSpy(&win, &HelperWindow::mouseMoved);
|
||||||
|
QVERIFY(moveSpy.isValid());
|
||||||
|
|
||||||
|
quint32 timestamp = 1;
|
||||||
|
waylandServer()->backend()->pointerMotion(QPoint(50, 50), timestamp++);
|
||||||
|
QTRY_COMPARE(enterSpy.count(), 1);
|
||||||
|
|
||||||
|
waylandServer()->backend()->pointerMotion(QPoint(60, 50), timestamp++);
|
||||||
|
QTRY_COMPARE(moveSpy.count(), 1);
|
||||||
|
QCOMPARE(moveSpy.first().first().toPoint(), QPoint(60, 50));
|
||||||
|
|
||||||
|
waylandServer()->backend()->pointerMotion(QPoint(101, 50), timestamp++);
|
||||||
|
QTRY_COMPARE(leaveSpy.count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternalWindowTest::testPointerPressRelease()
|
||||||
|
{
|
||||||
|
QSignalSpy clientAddedSpy(waylandServer(), &WaylandServer::shellClientAdded);
|
||||||
|
QVERIFY(clientAddedSpy.isValid());
|
||||||
|
HelperWindow win;
|
||||||
|
win.setGeometry(0, 0, 100, 100);
|
||||||
|
win.show();
|
||||||
|
QSignalSpy pressSpy(&win, &HelperWindow::mousePressed);
|
||||||
|
QVERIFY(pressSpy.isValid());
|
||||||
|
QSignalSpy releaseSpy(&win, &HelperWindow::mouseReleased);
|
||||||
|
QVERIFY(releaseSpy.isValid());
|
||||||
|
|
||||||
|
QVERIFY(clientAddedSpy.wait());
|
||||||
|
QCOMPARE(clientAddedSpy.count(), 1);
|
||||||
|
|
||||||
|
quint32 timestamp = 1;
|
||||||
|
waylandServer()->backend()->pointerMotion(QPoint(50, 50), timestamp++);
|
||||||
|
|
||||||
|
waylandServer()->backend()->pointerButtonPressed(BTN_LEFT, timestamp++);
|
||||||
|
QTRY_COMPARE(pressSpy.count(), 1);
|
||||||
|
waylandServer()->backend()->pointerButtonReleased(BTN_LEFT, timestamp++);
|
||||||
|
QTRY_COMPARE(releaseSpy.count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternalWindowTest::testPointerAxis()
|
||||||
|
{
|
||||||
|
QSignalSpy clientAddedSpy(waylandServer(), &WaylandServer::shellClientAdded);
|
||||||
|
QVERIFY(clientAddedSpy.isValid());
|
||||||
|
HelperWindow win;
|
||||||
|
win.setGeometry(0, 0, 100, 100);
|
||||||
|
win.show();
|
||||||
|
QSignalSpy wheelSpy(&win, &HelperWindow::wheel);
|
||||||
|
QVERIFY(wheelSpy.isValid());
|
||||||
|
QVERIFY(clientAddedSpy.wait());
|
||||||
|
QCOMPARE(clientAddedSpy.count(), 1);
|
||||||
|
|
||||||
|
quint32 timestamp = 1;
|
||||||
|
waylandServer()->backend()->pointerMotion(QPoint(50, 50), timestamp++);
|
||||||
|
|
||||||
|
waylandServer()->backend()->pointerAxisVertical(5.0, timestamp++);
|
||||||
|
QTRY_COMPARE(wheelSpy.count(), 1);
|
||||||
|
waylandServer()->backend()->pointerAxisHorizontal(5.0, timestamp++);
|
||||||
|
QTRY_COMPARE(wheelSpy.count(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WAYLANTEST_MAIN(KWin::InternalWindowTest)
|
||||||
|
#include "internal_window.moc"
|
Loading…
Reference in a new issue