Commit 0b9e6a4a authored by Martin Flöser's avatar Martin Flöser

Fix start move through drag distance on window decoration

We need to call handleMoveResize on the mouse move with button down.

Auto tests adjusted to include all possible directions.
parent 7777f0c5
......@@ -1379,9 +1379,10 @@ void AbstractClient::layoutDecorationRects(QRect &left, QRect &top, QRect &right
borderRight(), r.height() - top.height() - bottom.height());
}
void AbstractClient::processDecorationMove()
void AbstractClient::processDecorationMove(const QPoint &localPos, const QPoint &globalPos)
{
if (isMoveResizePointerButtonDown()) {
handleMoveResize(localPos.x(), localPos.y(), globalPos.x(), globalPos.y());
return;
}
// TODO: handle modifiers
......
......@@ -523,7 +523,7 @@ public:
bool decorationHasAlpha() const;
void triggerDecorationRepaint();
virtual void layoutDecorationRects(QRect &left, QRect &top, QRect &right, QRect &bottom) const;
void processDecorationMove();
void processDecorationMove(const QPoint &localPos, const QPoint &globalPos);
bool processDecorationButtonPress(QMouseEvent *event, bool ignoreMenu = false);
void processDecorationButtonRelease(QMouseEvent *event);
......
......@@ -58,6 +58,7 @@ private Q_SLOTS:
void testAxis();
void testDoubleClick();
void testHover();
void testPressToMove_data();
void testPressToMove();
private:
......@@ -325,46 +326,63 @@ void DecorationInputTest::testHover()
QCOMPARE(c->cursor(), Qt::ArrowCursor);
}
void DecorationInputTest::testPressToMove_data()
{
QTest::addColumn<QPoint>("offset");
QTest::addColumn<QPoint>("offset2");
QTest::addColumn<QPoint>("offset3");
QTest::newRow("To right") << QPoint(10, 0) << QPoint(20, 0) << QPoint(30, 0);
QTest::newRow("To left") << QPoint(-10, 0) << QPoint(-20, 0) << QPoint(-30, 0);
QTest::newRow("To bottom") << QPoint(0, 10) << QPoint(0, 20) << QPoint(0, 30);
QTest::newRow("To top") << QPoint(0, -10) << QPoint(0, -20) << QPoint(0, -30);
}
void DecorationInputTest::testPressToMove()
{
AbstractClient *c = showWindow();
QVERIFY(c);
QVERIFY(c->isDecorated());
QVERIFY(!c->noBorder());
c->move(screens()->geometry(0).center() - QPoint(c->width()/2, c->height()/2));
QSignalSpy startMoveResizedSpy(c, &AbstractClient::clientStartUserMovedResized);
QVERIFY(startMoveResizedSpy.isValid());
QSignalSpy clientFinishUserMovedResizedSpy(c, &AbstractClient::clientFinishUserMovedResized);
QVERIFY(clientFinishUserMovedResizedSpy.isValid());
quint32 timestamp = 1;
MOTION(QPoint(c->geometry().center().x(), c->clientPos().y() / 2));
MOTION(QPoint(c->geometry().center().x(), c->y() + c->clientPos().y() / 2));
QCOMPARE(c->cursor(), Qt::ArrowCursor);
PRESS;
QVERIFY(!c->isMove());
MOTION(QPoint(c->geometry().center().x() + 10, c->clientPos().y() / 2));
const int oldX = c->x();
QTRY_VERIFY(c->isMove());
QFETCH(QPoint, offset);
MOTION(QPoint(c->geometry().center().x(), c->y() + c->clientPos().y() / 2) + offset);
const QPoint oldPos = c->pos();
QVERIFY(c->isMove());
QCOMPARE(startMoveResizedSpy.count(), 1);
RELEASE;
QTRY_VERIFY(!c->isMove());
QCOMPARE(clientFinishUserMovedResizedSpy.count(), 1);
QEXPECT_FAIL("", "Just trigger move doesn't move the window", Continue);
QCOMPARE(c->x(), oldX + 10);
QCOMPARE(c->pos(), oldPos + offset);
// again
PRESS;
QVERIFY(!c->isMove());
MOTION(QPoint(c->geometry().center().x() + 20, c->clientPos().y() / 2));
QTRY_VERIFY(c->isMove());
QFETCH(QPoint, offset2);
MOTION(QPoint(c->geometry().center().x(), c->y() + c->clientPos().y() / 2) + offset2);
QVERIFY(c->isMove());
QCOMPARE(startMoveResizedSpy.count(), 2);
MOTION(QPoint(c->geometry().center().x() + 30, c->clientPos().y() / 2));
QFETCH(QPoint, offset3);
MOTION(QPoint(c->geometry().center().x(), c->y() + c->clientPos().y() / 2) + offset3);
RELEASE;
QTRY_VERIFY(!c->isMove());
QCOMPARE(clientFinishUserMovedResizedSpy.count(), 2);
QCOMPARE(c->x(), oldX + 20);
// TODO: the offset should also be included
QCOMPARE(c->pos(), oldPos + offset2 + offset3);
}
}
......
......@@ -432,7 +432,7 @@ public:
}
QHoverEvent e(QEvent::HoverMove, p, p);
QCoreApplication::instance()->sendEvent(decoration->decoration(), &e);
decoration->client()->processDecorationMove();
decoration->client()->processDecorationMove(p.toPoint(), event->globalPos());
return true;
}
case QEvent::MouseButtonPress:
......
......@@ -396,7 +396,7 @@ void PointerInputRedirection::updateDecoration(Toplevel *t)
const QPointF p = m_pos - t->pos();
QHoverEvent event(QEvent::HoverMove, p, p);
QCoreApplication::instance()->sendEvent(m_decoration->decoration(), &event);
m_decoration->client()->processDecorationMove();
m_decoration->client()->processDecorationMove(p.toPoint(), m_pos.toPoint());
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment