summaryrefslogtreecommitdiffstats
path: root/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp')
-rw-r--r--tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp65
1 files changed, 63 insertions, 2 deletions
diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
index c0a0eb18f3..660539d706 100644
--- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
+++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
@@ -30,13 +30,19 @@
#include <QtTest/QtTest>
#include <qevent.h>
#include <qwindow.h>
+#include <QtGui/private/qpointingdevice_p.h>
+
+Q_LOGGING_CATEGORY(lcTests, "qt.gui.tests")
class MouseEventWidget : public QWindow
{
public:
- MouseEventWidget(QWindow *parent = 0) : QWindow(parent)
+ MouseEventWidget(QWindow *parent = nullptr) : QWindow(parent)
{
+ setGeometry(100, 100, 100, 100);
}
+ bool grabExclusive = false;
+ bool grabPassive = false;
bool mousePressEventRecieved;
bool mouseReleaseEventRecieved;
int mousePressButton;
@@ -45,15 +51,31 @@ public:
int mouseReleaseButton;
int mouseReleaseButtons;
int mouseReleaseModifiers;
+ ulong pressTimestamp;
protected:
void mousePressEvent(QMouseEvent *e) override
{
+ const auto &firstPoint = e->point(0);
+ if (e->type() == QEvent::MouseButtonPress) {
+ auto firstPoint = e->points().first();
+ QCOMPARE(e->exclusiveGrabber(firstPoint), nullptr);
+ QVERIFY(e->passiveGrabbers(firstPoint).isEmpty());
+ QCOMPARE(firstPoint.timeHeld(), 0);
+ QCOMPARE(firstPoint.pressTimestamp(), e->timestamp());
+ pressTimestamp = e->timestamp();
+ }
QWindow::mousePressEvent(e);
mousePressButton = e->button();
mousePressButtons = e->buttons();
mousePressModifiers = e->modifiers();
mousePressEventRecieved = true;
e->accept();
+ // It's not normal for QWindow to be the grabber, but that's easier to test
+ // without needing to create child ojects.
+ if (grabExclusive)
+ e->setExclusiveGrabber(firstPoint, this);
+ if (grabPassive)
+ e->addPassiveGrabber(firstPoint, this);
}
void mouseReleaseEvent(QMouseEvent *e) override
{
@@ -80,6 +102,8 @@ private slots:
void checkMousePressEvent();
void checkMouseReleaseEvent_data();
void checkMouseReleaseEvent();
+ void grabbers_data();
+ void grabbers();
private:
MouseEventWidget* testMouseWidget;
@@ -87,7 +111,7 @@ private:
void tst_QMouseEvent::initTestCase()
{
- testMouseWidget = new MouseEventWidget(0);
+ testMouseWidget = new MouseEventWidget;
testMouseWidget->show();
}
@@ -218,5 +242,42 @@ void tst_QMouseEvent::checkMouseReleaseEvent()
QCOMPARE(testMouseWidget->mouseReleaseModifiers, modifiers);
}
+void tst_QMouseEvent::grabbers_data()
+{
+ QTest::addColumn<bool>("grabExclusive");
+ QTest::addColumn<bool>("grabPassive");
+
+ QTest::newRow("no grab") << false << false;
+ QTest::newRow("exclusive") << true << false;
+ QTest::newRow("passive") << false << true;
+}
+
+void tst_QMouseEvent::grabbers()
+{
+ QFETCH(bool, grabExclusive);
+ QFETCH(bool, grabPassive);
+
+ testMouseWidget->grabExclusive = grabExclusive;
+ testMouseWidget->grabPassive = grabPassive;
+
+ QTest::mousePress(testMouseWidget, Qt::LeftButton, Qt::KeyboardModifiers(), {10, 10});
+
+ auto devPriv = QPointingDevicePrivate::get(QPointingDevice::primaryPointingDevice());
+ QCOMPARE(devPriv->activePoints.count(), 1);
+
+ // Ensure that grabbers are persistent between events, within the stored touchpoints
+ auto firstEPD = devPriv->pointById(0);
+ QCOMPARE(firstEPD->eventPoint.pressTimestamp(), testMouseWidget->pressTimestamp);
+ QCOMPARE(firstEPD->exclusiveGrabber, grabExclusive ? testMouseWidget : nullptr);
+ QCOMPARE(firstEPD->passiveGrabbers.count(), grabPassive ? 1 : 0);
+ if (grabPassive)
+ QCOMPARE(firstEPD->passiveGrabbers.first(), testMouseWidget);
+
+ // Ensure that grabbers are forgotten after release delivery
+ QTest::mouseRelease(testMouseWidget, Qt::LeftButton, Qt::KeyboardModifiers(), {10, 10});
+ QTRY_COMPARE(firstEPD->exclusiveGrabber, nullptr);
+ QCOMPARE(firstEPD->passiveGrabbers.count(), 0);
+}
+
QTEST_MAIN(tst_QMouseEvent)
#include "tst_qmouseevent.moc"