summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-09-07 13:42:02 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-11 12:09:47 +0200
commitf957370206fb88b40c354f2ca57ecfd315e3ac29 (patch)
tree6615aafd06caf8b1b96f4333cb180d3d4b1f76d6
parentaab15782e21bf0aaea7f2211278e9aa9fc78c6d7 (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.cpp18
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp12
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);