diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 18 |
1 files changed, 16 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: |