diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2012-11-09 15:57:07 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-15 11:59:34 +0100 |
commit | b8be2e67eae075e6c6108318e73c7ad4eddcebf8 (patch) | |
tree | 5ad0f199c7b56934d5b4ee7e21340990f6a421b6 /tests/auto/widgets/kernel/qwidget | |
parent | a6135c55b99e92a7d06f828e0ec0a4a35f89c47f (diff) |
Change to enter/leave policy while grabbing.
Sending enter and leave events to other windows than the grabbing
window is not logical. The policy should be that only the grabbing
window receives enter and leave events.
Changed the documentation accordingly and provided the necessary
changes to Windows implementation.
Also removed explicit leave event generation for widgets when
popup is opened as that is now redundant.
tst_QWidget::underMouse() test was changed to behave according to
new logic.
Task-number: QTBUG-27871
Change-Id: I127fb8685b4a4206d1a319f42cba491ec02bc8ca
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'tests/auto/widgets/kernel/qwidget')
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 95 |
1 files changed, 21 insertions, 74 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 548b5ccf6a..a84709a6dd 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -9665,6 +9665,11 @@ void tst_QWidget::underMouse() QVERIFY(popupWindow); QVERIFY(QApplication::activePopupWidget() == &popupWidget); + // Send an artificial leave event for window, as it won't get generated automatically + // due to cursor not actually being over the window. + QWindowSystemInterface::handleLeaveEvent(window); + QApplication::processEvents(); + // If there is an active popup, undermouse should not be reported (QTBUG-27478), // but opening a popup causes leave for widgets under mouse. QVERIFY(!topLevelWidget.underMouse()); @@ -9682,13 +9687,8 @@ void tst_QWidget::underMouse() topLevelWidget.resetCounts(); childWidget2.resetCounts(); - // Note about commented out compares below: - // Widgets are not receiving enter/leave events properly when there is a popup up, - // so all enter and leave counts are not correct yet. - // Fix this test when QTBUG-27800 is fixed (i.e. uncomment commented out compares). - - // Moving around while popup active should not change undermouse either, - // but should send enter and leave events for widgets + // Moving around while popup active should not change undermouse or cause + // enter and leave events for widgets. QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(child2PointB))); QVERIFY(!topLevelWidget.underMouse()); QVERIFY(!childWidget1.underMouse()); @@ -9696,14 +9696,12 @@ void tst_QWidget::underMouse() QVERIFY(!popupWidget.underMouse()); QCOMPARE(popupWidget.enters, 0); QCOMPARE(popupWidget.leaves, 0); - //QCOMPARE(topLevelWidget.enters, 1); // QTBUG-27800 + QCOMPARE(topLevelWidget.enters, 0); QCOMPARE(topLevelWidget.leaves, 0); QCOMPARE(childWidget1.enters, 0); QCOMPARE(childWidget1.leaves, 0); - //QCOMPARE(childWidget2.enters, 1); // QTBUG-27800 + QCOMPARE(childWidget2.enters, 0); QCOMPARE(childWidget2.leaves, 0); - topLevelWidget.resetCounts(); - childWidget2.resetCounts(); QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(inWindowPoint))); QVERIFY(!topLevelWidget.underMouse()); @@ -9717,27 +9715,9 @@ void tst_QWidget::underMouse() QCOMPARE(childWidget1.enters, 0); QCOMPARE(childWidget1.leaves, 0); QCOMPARE(childWidget2.enters, 0); - //QCOMPARE(childWidget2.leaves, 1); // QTBUG-27800 - childWidget2.resetCounts(); - - QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(child1Point))); - QVERIFY(!topLevelWidget.underMouse()); - QVERIFY(!childWidget1.underMouse()); - QVERIFY(!childWidget2.underMouse()); - QVERIFY(!popupWidget.underMouse()); - QCOMPARE(popupWidget.enters, 0); - QCOMPARE(popupWidget.leaves, 0); - QCOMPARE(topLevelWidget.enters, 0); - QCOMPARE(topLevelWidget.leaves, 0); - //QCOMPARE(childWidget1.enters, 1); // QTBUG-27800 - QCOMPARE(childWidget1.leaves, 0); - QCOMPARE(childWidget2.enters, 0); QCOMPARE(childWidget2.leaves, 0); - childWidget1.resetCounts(); - // Mouse moves off-application, should cause leaves for currently entered widgets - QWindowSystemInterface::handleLeaveEvent(window); - QApplication::processEvents(); + QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(child1Point))); QVERIFY(!topLevelWidget.underMouse()); QVERIFY(!childWidget1.underMouse()); QVERIFY(!childWidget2.underMouse()); @@ -9745,52 +9725,20 @@ void tst_QWidget::underMouse() QCOMPARE(popupWidget.enters, 0); QCOMPARE(popupWidget.leaves, 0); QCOMPARE(topLevelWidget.enters, 0); - QCOMPARE(topLevelWidget.leaves, 1); - QCOMPARE(childWidget1.enters, 0); - //QCOMPARE(childWidget1.leaves, 1); // QTBUG-27800 - QCOMPARE(childWidget2.enters, 0); - QCOMPARE(childWidget2.leaves, 0); - topLevelWidget.resetCounts(); - childWidget1.resetCounts(); - - // Mouse enters back in, should cause enter to topLevelWidget - QWindowSystemInterface::handleEnterEvent(window, inWindowPoint, window->mapToGlobal(inWindowPoint)); - QApplication::processEvents(); - QVERIFY(!topLevelWidget.underMouse()); - QVERIFY(!childWidget1.underMouse()); - QVERIFY(!childWidget2.underMouse()); - QVERIFY(!popupWidget.underMouse()); - QCOMPARE(popupWidget.enters, 0); - QCOMPARE(popupWidget.leaves, 0); - QCOMPARE(topLevelWidget.enters, 1); QCOMPARE(topLevelWidget.leaves, 0); QCOMPARE(childWidget1.enters, 0); QCOMPARE(childWidget1.leaves, 0); QCOMPARE(childWidget2.enters, 0); QCOMPARE(childWidget2.leaves, 0); - topLevelWidget.resetCounts(); - // Mouse moves to child widget, should cause enter to child - QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(child2PointB))); - QVERIFY(!topLevelWidget.underMouse()); - QVERIFY(!childWidget1.underMouse()); - QVERIFY(!childWidget2.underMouse()); - QVERIFY(!popupWidget.underMouse()); - QCOMPARE(popupWidget.enters, 0); - QCOMPARE(popupWidget.leaves, 0); - QCOMPARE(topLevelWidget.enters, 0); - QCOMPARE(topLevelWidget.leaves, 0); - QCOMPARE(childWidget1.enters, 0); - QCOMPARE(childWidget1.leaves, 0); - //QCOMPARE(childWidget2.enters, 1); // QTBUG-27800 - QCOMPARE(childWidget2.leaves, 0); - childWidget2.resetCounts(); + // Note: Mouse moving off-application while there is an active popup cannot be simulated + // without actually moving the cursor so it is not tested. - // Mouse enters popup, should cause enter to popup and leave to current widgets under mouse - QWindowSystemInterface::handleLeaveEvent(window); + // Mouse enters popup, should cause enter to popup. + // Once again, need to create artificial enter event. const QPoint popupCenter = popupWindow->geometry().center(); QWindowSystemInterface::handleEnterEvent(popupWindow, popupWindow->mapFromGlobal(popupCenter), popupCenter); - QApplication::processEvents(); + QTest::mouseMove(popupWindow, popupCenter); QVERIFY(!topLevelWidget.underMouse()); QVERIFY(!childWidget1.underMouse()); QVERIFY(!childWidget2.underMouse()); @@ -9798,14 +9746,12 @@ void tst_QWidget::underMouse() QCOMPARE(popupWidget.enters, 1); QCOMPARE(popupWidget.leaves, 0); QCOMPARE(topLevelWidget.enters, 0); - QCOMPARE(topLevelWidget.leaves, 1); + QCOMPARE(topLevelWidget.leaves, 0); QCOMPARE(childWidget1.enters, 0); QCOMPARE(childWidget1.leaves, 0); QCOMPARE(childWidget2.enters, 0); - //QCOMPARE(childWidget2.leaves, 1); // QTBUG-27800 + QCOMPARE(childWidget2.leaves, 0); popupWidget.resetCounts(); - topLevelWidget.resetCounts(); - childWidget2.resetCounts(); // Mouse moves around inside popup, no changes QTest::mouseMove(popupWindow, QPoint(5, 5)); @@ -9822,9 +9768,10 @@ void tst_QWidget::underMouse() QCOMPARE(childWidget2.enters, 0); QCOMPARE(childWidget2.leaves, 0); - // Mouse leaves popup and enters topLevelWidget, should cause enter to topLevelWidget and leave for popup + // Mouse leaves popup and enters topLevelWidget, should cause leave for popup + // but no enter to topLevelWidget. Again, artificial leave event needed. QWindowSystemInterface::handleLeaveEvent(popupWindow); - QWindowSystemInterface::handleEnterEvent(window, inWindowPoint, window->mapToGlobal(inWindowPoint)); + QTest::mouseMove(popupWindow, popupWindow->mapFromGlobal(window->mapToGlobal(inWindowPoint))); QApplication::processEvents(); QVERIFY(!topLevelWidget.underMouse()); QVERIFY(!childWidget1.underMouse()); @@ -9832,7 +9779,7 @@ void tst_QWidget::underMouse() QVERIFY(!popupWidget.underMouse()); QCOMPARE(popupWidget.enters, 0); QCOMPARE(popupWidget.leaves, 1); - QCOMPARE(topLevelWidget.enters, 1); + QCOMPARE(topLevelWidget.enters, 0); QCOMPARE(topLevelWidget.leaves, 0); QCOMPARE(childWidget1.enters, 0); QCOMPARE(childWidget1.leaves, 0); |