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>
This commit is contained in:
parent
aab15782e2
commit
f957370206
@ -2934,6 +2934,16 @@ bool QApplicationPrivate::shouldQuit()
|
|||||||
return QGuiApplicationPrivate::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
|
/*! \reimp
|
||||||
*/
|
*/
|
||||||
bool QApplication::notify(QObject *receiver, QEvent *e)
|
bool QApplication::notify(QObject *receiver, QEvent *e)
|
||||||
@ -3006,9 +3016,13 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
|
|||||||
}
|
}
|
||||||
#endif // QT_NO_GESTURES
|
#endif // QT_NO_GESTURES
|
||||||
|
|
||||||
// User input and window activation makes tooltips sleep
|
|
||||||
switch (e->type()) {
|
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::ActivationChange:
|
||||||
case QEvent::KeyPress:
|
case QEvent::KeyPress:
|
||||||
case QEvent::KeyRelease:
|
case QEvent::KeyRelease:
|
||||||
|
@ -5305,6 +5305,7 @@ void tst_QWidget::setCursor()
|
|||||||
QWidget child(&window);
|
QWidget child(&window);
|
||||||
|
|
||||||
window.show();
|
window.show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
||||||
window.setCursor(Qt::WaitCursor);
|
window.setCursor(Qt::WaitCursor);
|
||||||
QVERIFY(window.testAttribute(Qt::WA_SetCursor));
|
QVERIFY(window.testAttribute(Qt::WA_SetCursor));
|
||||||
QVERIFY(!child.testAttribute(Qt::WA_SetCursor));
|
QVERIFY(!child.testAttribute(Qt::WA_SetCursor));
|
||||||
@ -5375,6 +5376,15 @@ void tst_QWidget::setCursor()
|
|||||||
void tst_QWidget::setToolTip()
|
void tst_QWidget::setToolTip()
|
||||||
{
|
{
|
||||||
QWidget widget;
|
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);
|
EventSpy spy(&widget, QEvent::ToolTipChange);
|
||||||
QCOMPARE(spy.count(), 0);
|
QCOMPARE(spy.count(), 0);
|
||||||
|
|
||||||
@ -5390,6 +5400,8 @@ void tst_QWidget::setToolTip()
|
|||||||
#ifndef Q_OS_WINCE_WM
|
#ifndef Q_OS_WINCE_WM
|
||||||
for (int pass = 0; pass < 2; ++pass) {
|
for (int pass = 0; pass < 2; ++pass) {
|
||||||
QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup));
|
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);
|
popup->resize(150, 50);
|
||||||
QFrame *frame = new QFrame(popup.data());
|
QFrame *frame = new QFrame(popup.data());
|
||||||
frame->setGeometry(0, 0, 50, 50);
|
frame->setGeometry(0, 0, 50, 50);
|
||||||
|
Loading…
Reference in New Issue
Block a user