diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-09-07 13:42:02 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-11 12:09:47 +0200 |
commit | f957370206fb88b40c354f2ca57ecfd315e3ac29 (patch) | |
tree | 6615aafd06caf8b1b96f4333cb180d3d4b1f76d6 | |
parent | aab15782e21bf0aaea7f2211278e9aa9fc78c6d7 (diff) |
Close popups when switching applications on Windows.
Bring back code from 4.8 (Note that ALT-TAB is not received
as key event).
Task-number: QTBUG-27146
Change-Id: I6dd2e9c88fdc4c89d26dfaa8ab47deb2be451f25
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 18 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 12 |
2 files changed, 28 insertions, 2 deletions
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 7e672f4725..fe95f58c0b 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2934,6 +2934,16 @@ bool QApplicationPrivate::shouldQuit() return QGuiApplicationPrivate::shouldQuit(); } +static inline void closeAllPopups() +{ + // Close all popups: In case some popup refuses to close, + // we give up after 1024 attempts (to avoid an infinite loop). + int maxiter = 1024; + QWidget *popup; + while ((popup = QApplication::activePopupWidget()) && maxiter--) + popup->close(); +} + /*! \reimp */ bool QApplication::notify(QObject *receiver, QEvent *e) @@ -3006,9 +3016,13 @@ bool QApplication::notify(QObject *receiver, QEvent *e) } #endif // QT_NO_GESTURES - // User input and window activation makes tooltips sleep switch (e->type()) { - case QEvent::Wheel: + case QEvent::ApplicationDeactivate: + // Close all popups (triggers when switching applications + // by pressing ALT-TAB on Windows, which is not receive as key event. + closeAllPopups(); + break; + case QEvent::Wheel: // User input and window activation makes tooltips sleep case QEvent::ActivationChange: case QEvent::KeyPress: case QEvent::KeyRelease: diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index d41bd856a3..0d3f06fc29 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -5305,6 +5305,7 @@ void tst_QWidget::setCursor() QWidget child(&window); window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); window.setCursor(Qt::WaitCursor); QVERIFY(window.testAttribute(Qt::WA_SetCursor)); QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); @@ -5375,6 +5376,15 @@ void tst_QWidget::setCursor() void tst_QWidget::setToolTip() { QWidget widget; + widget.resize(200, 200); + // Showing the widget is not required for the tooltip event count test + // to work. It should just prevent the application from becoming inactive + // which would cause it to close all popups, interfering with the test + // in the loop below. + widget.setObjectName(QLatin1String("tst_qwidget setToolTip")); + widget.setWindowTitle(widget.objectName()); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); EventSpy spy(&widget, QEvent::ToolTipChange); QCOMPARE(spy.count(), 0); @@ -5390,6 +5400,8 @@ void tst_QWidget::setToolTip() #ifndef Q_OS_WINCE_WM for (int pass = 0; pass < 2; ++pass) { QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup)); + popup->setObjectName(QString::fromLatin1("tst_qwidget setToolTip #%1").arg(pass)); + popup->setWindowTitle(popup->objectName()); popup->resize(150, 50); QFrame *frame = new QFrame(popup.data()); frame->setGeometry(0, 0, 50, 50); |