From f957370206fb88b40c354f2ca57ecfd315e3ac29 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 7 Sep 2012 13:42:02 +0200 Subject: [PATCH] Close popups when switching applications on Windows. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Qt Doc Bot Reviewed-by: Jørgen Lind --- src/widgets/kernel/qapplication.cpp | 18 ++++++++++++++++-- .../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 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);