diff options
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/kernel/qwidget_qpa.cpp | 11 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore.cpp | 27 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa.cpp | 17 |
3 files changed, 19 insertions, 36 deletions
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index 3d23b04ddf..0f55646958 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -440,9 +440,9 @@ static inline QRect positionTopLevelWindow(QRect geometry, const QScreen *screen void QWidgetPrivate::show_sys() { Q_Q(QWidget); - q->setAttribute(Qt::WA_Mapped); if (q->testAttribute(Qt::WA_DontShowOnScreen)) { invalidateBuffer(q->rect()); + q->setAttribute(Qt::WA_Mapped); return; } @@ -483,8 +483,8 @@ void QWidgetPrivate::show_sys() void QWidgetPrivate::hide_sys() { Q_Q(QWidget); - q->setAttribute(Qt::WA_Mapped, false); deactivateWidgetCleanup(); + if (!q->isWindow()) { QWidget *p = q->parentWidget(); if (p &&p->isVisible()) { @@ -492,7 +492,12 @@ void QWidgetPrivate::hide_sys() } return; } - if (QWindow *window = q->windowHandle()) { + + invalidateBuffer(q->rect()); + + if (q->testAttribute(Qt::WA_DontShowOnScreen)) { + q->setAttribute(Qt::WA_Mapped, false); + } else if (QWindow *window = q->windowHandle()) { window->setVisible(false); } } diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index b331356e66..2e9f072a0f 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -914,29 +914,7 @@ void QWidgetPrivate::scrollRect(const QRect &rect, int dx, int dy) static inline bool discardSyncRequest(QWidget *tlw, QTLWExtra *tlwExtra) { - if (!tlw || !tlwExtra) - return true; - -#ifdef Q_WS_X11 - // Delay the sync until we get an Expose event from X11 (initial show). - // Qt::WA_Mapped is set to true, but the actual mapping has not yet occurred. - // However, we must repaint immediately regardless of the state if someone calls repaint(). - if (tlwExtra->waitingForMapNotify && !tlwExtra->inRepaint) - return true; -#endif - - if (!tlw->testAttribute(Qt::WA_Mapped)) - return true; - - if (!tlw->isVisible() -#ifndef Q_WS_X11 - // If we're minimized on X11, WA_Mapped will be false and we - // will return in the case above. Some window managers on X11 - // sends us the PropertyNotify to change the minimized state - // *AFTER* we've received the expose event, which is baaad. - || tlw->isMinimized() -#endif - ) + if (!tlw || !tlwExtra || !tlw->testAttribute(Qt::WA_Mapped) || !tlw->isVisible()) return true; return false; @@ -1345,6 +1323,9 @@ void QWidgetPrivate::repaint_sys(const QRegion &rgn) return; Q_Q(QWidget); + if (discardSyncRequest(q, maybeTopData())) + return; + if (q->testAttribute(Qt::WA_StaticContents)) { if (!extra) createExtra(); diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index f58dddb70f..498908f4db 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -137,15 +137,6 @@ bool QWidgetWindow::event(QEvent *event) handleDragEvent(event); break; - case QEvent::Map: - m_widget->setAttribute(Qt::WA_Mapped); - m_widget->d_func()->syncBackingStore(); - return true; - - case QEvent::Unmap: - m_widget->setAttribute(Qt::WA_Mapped, false); - return true; - case QEvent::Expose: handleExposeEvent(static_cast<QExposeEvent *>(event)); return true; @@ -432,7 +423,13 @@ void QWidgetWindow::handleDragEvent(QEvent *event) void QWidgetWindow::handleExposeEvent(QExposeEvent *event) { - m_widget->d_func()->syncBackingStore(event->region()); + if (isExposed()) { + m_widget->setAttribute(Qt::WA_Mapped); + if (!event->region().isNull()) + m_widget->d_func()->syncBackingStore(event->region()); + } else { + m_widget->setAttribute(Qt::WA_Mapped, false); + } } void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event) |