summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2014-09-24 12:14:03 +0200
committerFriedemann Kleint <Friedemann.Kleint@digia.com>2014-09-24 23:07:15 +0200
commit4b03b18548200db0ad65415c7df7a7665a9ec3d8 (patch)
treec44d136cef00d65b36a778832b416e94e4643916
parentd41d4a0a358c98cbe56838b9fbb0ac422d43b15e (diff)
Generate Show/Hide events for widgets when minimized state changes.
Fixes a regression against Qt 4, where Show/Hide events were received when the minimized state changed. It is restricted to QWidget so as not to introduce additional events to QWindow (which already has signal visibilityChanged()) and cause unexpected side effects in QQuickWindow. Task-number: QTBUG-41312 Change-Id: Ib165a5daf7a7e5d8231ef8a94b70e8a2a3253057 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
-rw-r--r--src/widgets/kernel/qwidget.cpp16
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp24
2 files changed, 39 insertions, 1 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 66511b8d5b..423bb33cc2 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -8893,7 +8893,6 @@ bool QWidget::event(QEvent *event)
case QEvent::ModifiedChange:
case QEvent::MouseTrackingChange:
case QEvent::ParentChange:
- case QEvent::WindowStateChange:
case QEvent::LocaleChange:
case QEvent::MacSizeChange:
case QEvent::ContentsRectChange:
@@ -8902,6 +8901,21 @@ bool QWidget::event(QEvent *event)
changeEvent(event);
break;
+ case QEvent::WindowStateChange: {
+ const bool wasMinimized = static_cast<const QWindowStateChangeEvent *>(event)->oldState() & Qt::WindowMinimized;
+ if (wasMinimized != isMinimized()) {
+ if (wasMinimized) {
+ QShowEvent showEvent;
+ QCoreApplication::sendEvent(const_cast<QWidget *>(this), &showEvent);
+ } else {
+ QHideEvent hideEvent;
+ QCoreApplication::sendEvent(const_cast<QWidget *>(this), &hideEvent);
+ }
+ }
+ changeEvent(event);
+ }
+ break;
+
case QEvent::WindowActivate:
case QEvent::WindowDeactivate: {
if (isVisible() && !palette().isEqual(QPalette::Active, QPalette::Inactive))
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 0de006a041..34bb4cfdf6 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -272,6 +272,7 @@ private slots:
void showHideEvent_data();
void showHideEvent();
+ void showHideEventWhileMinimize();
void lostUpdatesOnHide();
@@ -4087,6 +4088,29 @@ void tst_QWidget::showHideEvent()
QCOMPARE(widget.numberOfHideEvents, expectedHideEvents);
}
+void tst_QWidget::showHideEventWhileMinimize()
+{
+ const QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
+ if (!pi->hasCapability(QPlatformIntegration::MultipleWindows)
+ || !pi->hasCapability(QPlatformIntegration::NonFullScreenWindows)
+ || !pi->hasCapability(QPlatformIntegration::WindowManagement)) {
+ QSKIP("This test requires window management capabilities");
+ }
+ // QTBUG-41312, hide, show events should be received during minimized.
+ ShowHideEventWidget widget;
+ widget.setWindowTitle(__FUNCTION__);
+ widget.resize(m_testWidgetSize);
+ centerOnScreen(&widget);
+ widget.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&widget));
+ const int showEventsBeforeMinimize = widget.numberOfShowEvents;
+ const int hideEventsBeforeMinimize = widget.numberOfHideEvents;
+ widget.showMinimized();
+ QTRY_COMPARE(widget.numberOfHideEvents, hideEventsBeforeMinimize + 1);
+ widget.showNormal();
+ QTRY_COMPARE(widget.numberOfShowEvents, showEventsBeforeMinimize + 1);
+}
+
void tst_QWidget::update()
{
QTest::qWait(10); // Wait for the initStuff to do it's stuff.