Implement whell command in input handling
With that all the actions are implemented just like on X11. There are two not yet implemented differences: * hide splash window when clicking it * replay event on special window
This commit is contained in:
parent
1f1a4ac6e8
commit
2a98c681d0
2 changed files with 54 additions and 1 deletions
|
@ -62,6 +62,7 @@ private Q_SLOTS:
|
||||||
void testModifierClickUnrestrictedMove();
|
void testModifierClickUnrestrictedMove();
|
||||||
void testModifierScrollOpacity_data();
|
void testModifierScrollOpacity_data();
|
||||||
void testModifierScrollOpacity();
|
void testModifierScrollOpacity();
|
||||||
|
void testScrollAction();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void render(KWayland::Client::Surface *surface, const QSize &size = QSize(100, 50));
|
void render(KWayland::Client::Surface *surface, const QSize &size = QSize(100, 50));
|
||||||
|
@ -466,6 +467,57 @@ void PointerInputTest::testModifierScrollOpacity()
|
||||||
QVERIFY(!axisSpy.wait(100));
|
QVERIFY(!axisSpy.wait(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PointerInputTest::testScrollAction()
|
||||||
|
{
|
||||||
|
// this test verifies that scroll on inactive window performs a mouse action
|
||||||
|
using namespace KWayland::Client;
|
||||||
|
auto pointer = m_seat->createPointer(m_seat);
|
||||||
|
QVERIFY(pointer);
|
||||||
|
QVERIFY(pointer->isValid());
|
||||||
|
QSignalSpy axisSpy(pointer, &Pointer::axisChanged);
|
||||||
|
QVERIFY(axisSpy.isValid());
|
||||||
|
|
||||||
|
// first modify the config for this run
|
||||||
|
KConfigGroup group = kwinApp()->config()->group("MouseBindings");
|
||||||
|
group.writeEntry("CommandWindowWheel", "activate and scroll");
|
||||||
|
group.sync();
|
||||||
|
workspace()->slotReconfigure();
|
||||||
|
// create two windows
|
||||||
|
QSignalSpy clientAddedSpy(waylandServer(), &WaylandServer::shellClientAdded);
|
||||||
|
QVERIFY(clientAddedSpy.isValid());
|
||||||
|
Surface *surface1 = m_compositor->createSurface(m_compositor);
|
||||||
|
QVERIFY(surface1);
|
||||||
|
ShellSurface *shellSurface1 = m_shell->createSurface(surface1, surface1);
|
||||||
|
QVERIFY(shellSurface1);
|
||||||
|
render(surface1);
|
||||||
|
QVERIFY(clientAddedSpy.wait());
|
||||||
|
AbstractClient *window1 = workspace()->activeClient();
|
||||||
|
QVERIFY(window1);
|
||||||
|
Surface *surface2 = m_compositor->createSurface(m_compositor);
|
||||||
|
QVERIFY(surface2);
|
||||||
|
ShellSurface *shellSurface2 = m_shell->createSurface(surface2, surface2);
|
||||||
|
QVERIFY(shellSurface2);
|
||||||
|
render(surface2);
|
||||||
|
QVERIFY(clientAddedSpy.wait());
|
||||||
|
AbstractClient *window2 = workspace()->activeClient();
|
||||||
|
QVERIFY(window2);
|
||||||
|
QVERIFY(window1 != window2);
|
||||||
|
|
||||||
|
// move cursor to the inactive window
|
||||||
|
Cursor::setPos(window1->geometry().center());
|
||||||
|
|
||||||
|
quint32 timestamp = 1;
|
||||||
|
QVERIFY(!window1->isActive());
|
||||||
|
waylandServer()->backend()->pointerAxisVertical(5, timestamp++);
|
||||||
|
QVERIFY(window1->isActive());
|
||||||
|
|
||||||
|
// but also the wheel event should be passed to the window
|
||||||
|
QVERIFY(axisSpy.wait());
|
||||||
|
|
||||||
|
// we need to wait a little bit, otherwise the test crashes in effectshandler, needs fixing
|
||||||
|
QTest::qWait(100);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WAYLANDTEST_MAIN(KWin::PointerInputTest)
|
WAYLANDTEST_MAIN(KWin::PointerInputTest)
|
||||||
|
|
|
@ -568,12 +568,13 @@ public:
|
||||||
// check for modifier
|
// check for modifier
|
||||||
bool passThrough = true;
|
bool passThrough = true;
|
||||||
if (AbstractClient *c = dynamic_cast<AbstractClient*>(input()->pointer()->window().data())) {
|
if (AbstractClient *c = dynamic_cast<AbstractClient*>(input()->pointer()->window().data())) {
|
||||||
// TODO: implement wheel action
|
|
||||||
bool wasAction = false;
|
bool wasAction = false;
|
||||||
Options::MouseCommand command = Options::MouseNothing;
|
Options::MouseCommand command = Options::MouseNothing;
|
||||||
if (orientation == Qt::Vertical && event->modifiers() == options->commandAllModifier()) {
|
if (orientation == Qt::Vertical && event->modifiers() == options->commandAllModifier()) {
|
||||||
wasAction = true;
|
wasAction = true;
|
||||||
command = options->operationWindowMouseWheel(event->angleDelta().y());
|
command = options->operationWindowMouseWheel(event->angleDelta().y());
|
||||||
|
} else {
|
||||||
|
command = c->getWheelCommand(Qt::Vertical, &wasAction);
|
||||||
}
|
}
|
||||||
if (wasAction) {
|
if (wasAction) {
|
||||||
passThrough = c->performMouseCommand(command, event->globalPos());
|
passThrough = c->performMouseCommand(command, event->globalPos());
|
||||||
|
|
Loading…
Reference in a new issue