From e6e11f7853a17a46280f3cab68eaf0e6e78d3b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 18 Feb 2016 09:57:47 +0100 Subject: [PATCH] Move window action handling logic into a dedicated InputEventFilter The logic so far was in the end to decide whether the event should be further processed or not. This can be better done by a dedicated event filter. --- input.cpp | 152 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 89 insertions(+), 63 deletions(-) diff --git a/input.cpp b/input.cpp index 16f23eb287..237e6ff3cc 100644 --- a/input.cpp +++ b/input.cpp @@ -499,6 +499,91 @@ public: } }; +/** + * This filter implements window actions. If the event should not be passed to the + * current pointer window it will filter out the event + **/ +class WindowActionInputFilter : public InputEventFilter +{ +public: + bool pointerEvent(QMouseEvent *event, quint32 nativeButton) override { + Q_UNUSED(nativeButton) + if (event->type() != QEvent::MouseButtonPress) { + return false; + } + AbstractClient *c = dynamic_cast(input()->pointer()->window().data()); + if (!c) { + return false; + } + bool wasAction = false; + Options::MouseCommand command = Options::MouseNothing; + if (event->modifiers() == options->commandAllModifier()) { + wasAction = true; + switch (event->button()) { + case Qt::LeftButton: + command = options->commandAll1(); + break; + case Qt::MiddleButton: + command = options->commandAll2(); + break; + case Qt::RightButton: + command = options->commandAll3(); + break; + default: + // nothing + break; + } + } else { + c->getMouseCommand(event->button(), &wasAction); + } + if (wasAction) { + return !c->performMouseCommand(command, event->globalPos()); + } + return false; + } + bool wheelEvent(QWheelEvent *event) override { + if (event->angleDelta().y() == 0) { + // only actions on vertical scroll + return false; + } + AbstractClient *c = dynamic_cast(input()->pointer()->window().data()); + if (!c) { + return false; + } + bool wasAction = false; + Options::MouseCommand command = Options::MouseNothing; + if (event->modifiers() == options->commandAllModifier()) { + wasAction = true; + command = options->operationWindowMouseWheel(event->angleDelta().y()); + } else { + command = c->getWheelCommand(Qt::Vertical, &wasAction); + } + if (wasAction) { + return !c->performMouseCommand(command, event->globalPos()); + } + return false; + } + bool touchDown(quint32 id, const QPointF &pos, quint32 time) override { + Q_UNUSED(id) + Q_UNUSED(time) + auto seat = waylandServer()->seat(); + if (seat->isTouchSequence()) { + return false; + } + input()->touch()->update(pos); + AbstractClient *c = dynamic_cast(input()->touch()->window().data()); + if (!c) { + return false; + } + bool wasAction = false; + const Options::MouseCommand command = c->getMouseCommand(Qt::LeftButton, &wasAction); + if (wasAction) { + return !c->performMouseCommand(command, pos.toPoint()); + } + return false; + } +}; + /** * The remaining default input filter which forwards events to other windows **/ @@ -516,39 +601,9 @@ public: } seat->setPointerPos(event->globalPos()); break; - case QEvent::MouseButtonPress: { - bool passThrough = true; - if (AbstractClient *c = dynamic_cast(input()->pointer()->window().data())) { - bool wasAction = false; - Options::MouseCommand command = Options::MouseNothing; - if (event->modifiers() == options->commandAllModifier()) { - wasAction = true; - switch (event->button()) { - case Qt::LeftButton: - command = options->commandAll1(); - break; - case Qt::MiddleButton: - command = options->commandAll2(); - break; - case Qt::RightButton: - command = options->commandAll3(); - break; - default: - // nothing - break; - } - } else { - c->getMouseCommand(event->button(), &wasAction); - } - if (wasAction) { - passThrough = c->performMouseCommand(command, event->globalPos()); - } - } - if (passThrough) { - seat->pointerButtonPressed(nativeButton); - } + case QEvent::MouseButtonPress: + seat->pointerButtonPressed(nativeButton); break; - } case QEvent::MouseButtonRelease: seat->pointerButtonReleased(nativeButton); if (event->buttons() == Qt::NoButton) { @@ -564,26 +619,7 @@ public: auto seat = waylandServer()->seat(); seat->setTimestamp(event->timestamp()); const Qt::Orientation orientation = event->angleDelta().x() == 0 ? Qt::Vertical : Qt::Horizontal; - - // check for modifier - bool passThrough = true; - if (AbstractClient *c = dynamic_cast(input()->pointer()->window().data())) { - bool wasAction = false; - Options::MouseCommand command = Options::MouseNothing; - if (orientation == Qt::Vertical && event->modifiers() == options->commandAllModifier()) { - wasAction = true; - command = options->operationWindowMouseWheel(event->angleDelta().y()); - } else { - command = c->getWheelCommand(Qt::Vertical, &wasAction); - } - if (wasAction) { - passThrough = c->performMouseCommand(command, event->globalPos()); - } - } - - if (passThrough) { - seat->pointerAxis(orientation, orientation == Qt::Horizontal ? event->angleDelta().x() : event->angleDelta().y()); - } + seat->pointerAxis(orientation, orientation == Qt::Horizontal ? event->angleDelta().x() : event->angleDelta().y()); return true; } bool keyEvent(QKeyEvent *event) override { @@ -613,17 +649,6 @@ public: seat->setTimestamp(time); if (!seat->isTouchSequence()) { input()->touch()->update(pos); - if (AbstractClient *c = dynamic_cast(input()->touch()->window().data())) { - // perform same handling as if it were a left click - bool wasAction = false; - const Options::MouseCommand command = c->getMouseCommand(Qt::LeftButton, &wasAction); - if (wasAction) { - // if no replay we filter out this touch point - if (!c->performMouseCommand(command, pos.toPoint())) { - return true; - } - } - } } input()->touch()->insertId(id, seat->touchDown(pos)); return true; @@ -799,6 +824,7 @@ void InputRedirection::setupInputFilters() installInputEventFilter(new InternalWindowEventFilter); installInputEventFilter(new DecorationEventFilter); if (waylandServer()) { + installInputEventFilter(new WindowActionInputFilter); installInputEventFilter(new ForwardInputFilter); } }