From a48508cd766b056d3cb5b6502cf269a8293bb5a5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 30 Oct 2012 10:21:36 +0200 Subject: Send leave to most recently entered window when modal dialog is shown. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a modal dialog was shown as a response to button click, the button retained its hover highlight, because it didn't get leave event. Fixed by tracking the most recently entered window and sending a leave to it when modal dialog is shown that blocks it. Also modified tst_QGuiApplication::modalWindow() autotest to check for enters and leaves. Task-number: QTBUG-27644 Change-Id: I387647e18a762a39d523e3df31221b9583a39f9d Reviewed-by: Samuel Rødal --- .../kernel/qguiapplication/tst_qguiapplication.cpp | 69 ++++++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) (limited to 'tests/auto') diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp index cc291f72fa..a7c38d6664 100644 --- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp +++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp @@ -336,12 +336,11 @@ class BlockableWindow : public QWindow Q_OBJECT public: int blocked; + int leaves; + int enters; inline BlockableWindow() - : QWindow() - { - blocked = false; - } + : QWindow(), blocked(false), enters(0), leaves(0) {} bool event(QEvent *e) { @@ -352,11 +351,23 @@ public: case QEvent::WindowUnblocked: --blocked; break; + case QEvent::Leave: + leaves++; + break; + case QEvent::Enter: + enters++; + break; default: break; } return QWindow::event(e); } + + void resetCounts() + { + leaves = 0; + enters = 0; + } }; void tst_QGuiApplication::modalWindow() @@ -391,6 +402,12 @@ void tst_QGuiApplication::modalWindow() QCOMPARE(windowModalWindow2->blocked, 0); QCOMPARE(applicationModalWindow1->blocked, 0); + // enter mouse in window1 + QWindowSystemInterface::handleEnterEvent(window1); + QGuiApplication::processEvents(); + QCOMPARE(window1->enters, 1); + QCOMPARE(window1->leaves, 0); + // show applicationModalWindow1, everything is blocked applicationModalWindow1->show(); QCOMPARE(app.modalWindow(), applicationModalWindow1); @@ -400,6 +417,24 @@ void tst_QGuiApplication::modalWindow() QCOMPARE(windowModalWindow2->blocked, 1); QCOMPARE(applicationModalWindow1->blocked, 0); + // opening modal causes leave for previously entered window, but not others + QGuiApplication::processEvents(); + QCOMPARE(window1->enters, 1); + QCOMPARE(window1->leaves, 1); + QCOMPARE(window2->enters, 0); + QCOMPARE(window2->leaves, 0); + QCOMPARE(applicationModalWindow1->enters, 0); + QCOMPARE(applicationModalWindow1->leaves, 0); + window1->resetCounts(); + + // Try entering/leaving blocked window2 - no events should reach it + QWindowSystemInterface::handleEnterEvent(window2); + QGuiApplication::processEvents(); + QWindowSystemInterface::handleLeaveEvent(window2); + QGuiApplication::processEvents(); + QCOMPARE(window2->enters, 0); + QCOMPARE(window2->leaves, 0); + // everything is unblocked when applicationModalWindow1 is hidden applicationModalWindow1->hide(); QCOMPARE(app.modalWindow(), static_cast(0)); @@ -409,6 +444,12 @@ void tst_QGuiApplication::modalWindow() QCOMPARE(windowModalWindow2->blocked, 0); QCOMPARE(applicationModalWindow1->blocked, 0); + // Enter window2 - should not be blocked + QWindowSystemInterface::handleEnterEvent(window2); + QGuiApplication::processEvents(); + QCOMPARE(window2->enters, 1); + QCOMPARE(window2->leaves, 0); + // show the windowModalWindow1, only window1 is blocked windowModalWindow1->show(); QCOMPARE(app.modalWindow(), windowModalWindow1); @@ -418,6 +459,15 @@ void tst_QGuiApplication::modalWindow() QCOMPARE(windowModalWindow2->blocked, 0); QCOMPARE(applicationModalWindow1->blocked, 0); + // opening window modal window doesn't cause leave for unblocked window + QGuiApplication::processEvents(); + QCOMPARE(window1->enters, 0); + QCOMPARE(window1->leaves, 0); + QCOMPARE(window2->enters, 1); + QCOMPARE(window2->leaves, 0); + QCOMPARE(windowModalWindow1->enters, 0); + QCOMPARE(windowModalWindow1->leaves, 0); + // show the windowModalWindow2, windowModalWindow1 is blocked as well windowModalWindow2->show(); QCOMPARE(app.modalWindow(), windowModalWindow2); @@ -472,6 +522,17 @@ void tst_QGuiApplication::modalWindow() QCOMPARE(windowModalWindow2->blocked, 1); QCOMPARE(applicationModalWindow1->blocked, 0); + // window2 gets finally the leave + QGuiApplication::processEvents(); + QCOMPARE(window1->enters, 0); + QCOMPARE(window1->leaves, 0); + QCOMPARE(window2->enters, 1); + QCOMPARE(window2->leaves, 1); + QCOMPARE(windowModalWindow1->enters, 0); + QCOMPARE(windowModalWindow1->leaves, 0); + QCOMPARE(applicationModalWindow1->enters, 0); + QCOMPARE(applicationModalWindow1->leaves, 0); + // hide applicationModalWindow1, windowModalWindow1 and window1 are blocked applicationModalWindow1->hide(); QCOMPARE(app.modalWindow(), windowModalWindow2); -- cgit v1.2.3