summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp2
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp4
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp4
-rw-r--r--tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp28
4 files changed, 37 insertions, 1 deletions
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index ae8a0b25b9..18045e3b09 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -506,9 +506,9 @@ void QWidgetPrivate::show_sys()
QWindow *window = q->windowHandle();
+ q->setAttribute(Qt::WA_Mapped);
if (q->testAttribute(Qt::WA_DontShowOnScreen)) {
invalidateBuffer(q->rect());
- q->setAttribute(Qt::WA_Mapped);
if (q->isWindow() && q->windowModality() != Qt::NonModal && window) {
// add our window to the modal window list
QGuiApplicationPrivate::showModalWindow(window);
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index e977ab3d6f..22e15e23fe 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -713,6 +713,10 @@ void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event
break;
}
+ // Note that widgetState == m_widget->data->window_state when triggered by QWidget::setWindowState().
+ if (!(widgetState & Qt::WindowMinimized))
+ m_widget->setAttribute(Qt::WA_Mapped);
+
// Sent event if the state changed (that is, it is not triggered by
// QWidget::setWindowState(), which also sends an event to the widget).
if (widgetState != int(m_widget->data->window_state)) {
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 03d6c1cdbd..7bb5fd4614 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -7192,6 +7192,10 @@ void tst_QWidget::hideOpaqueChildWhileHidden()
#if !defined(Q_OS_WINCE)
void tst_QWidget::updateWhileMinimized()
{
+#ifdef Q_OS_UNIX
+ if (qgetenv("XDG_CURRENT_DESKTOP").contains("Unity"))
+ QSKIP("This test fails on Unity."); // Minimized windows are not unmapped for some reason.
+#endif // Q_OS_UNIX
UpdateWidget widget;
// Filter out activation change and focus events to avoid update() calls in QWidget.
widget.updateOnActivationChangeAndFocusIn = false;
diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
index 1bbbfd610e..f5585c583a 100644
--- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
+++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
@@ -91,6 +91,8 @@ private slots:
void tst_showWithoutActivating();
void tst_paintEventOnSecondShow();
+ void obscuredNativeMapped();
+
#ifndef QT_NO_DRAGANDDROP
void tst_dnd();
#endif
@@ -368,6 +370,32 @@ void tst_QWidget_window::tst_paintEventOnSecondShow()
QTRY_VERIFY(w.paintEventReceived);
}
+// QTBUG-33520, a toplevel fully obscured by native children should still receive Qt::WA_Mapped
+void tst_QWidget_window::obscuredNativeMapped()
+{
+ enum { size = 200 };
+
+ QWidget topLevel;
+ topLevel.setWindowFlags(Qt::FramelessWindowHint);
+ QWidget *child = new QWidget(&topLevel);
+ child->resize(size, size);
+ topLevel.resize(size, size);
+ topLevel.move(QGuiApplication::primaryScreen()->availableGeometry().center() - QPoint(size /2 , size / 2));
+ child->winId();
+ topLevel.show();
+ QTRY_VERIFY(topLevel.testAttribute(Qt::WA_Mapped));
+#if defined(Q_OS_MAC)
+ QSKIP("This test fails on Mac."); // Minimized windows are not unmapped for some reason.
+#elif defined(Q_OS_UNIX)
+ if (qgetenv("XDG_CURRENT_DESKTOP").contains("Unity"))
+ QSKIP("This test fails on Unity."); // Minimized windows are not unmapped for some reason.
+#endif // Q_OS_UNIX
+ topLevel.setWindowState(Qt::WindowMinimized);
+ QTRY_VERIFY(!topLevel.testAttribute(Qt::WA_Mapped));
+ topLevel.setWindowState(Qt::WindowNoState);
+ QTRY_VERIFY(topLevel.testAttribute(Qt::WA_Mapped));
+}
+
#ifndef QT_NO_DRAGANDDROP
/* DnD test for QWidgetWindow (handleDrag*Event() functions).