From 527b5f6ff4c72226e961c5183c88aaf6f41c5a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 25 Jan 2024 14:58:39 +0100 Subject: [PATCH] Don't rely on QRasterWindow::resizeEvent for marking window dirty The de-virtualization gotcha might result in client code not calling QRasterWindow::resizeEvent, which we use for dirty state management after e0eb2818face4ffb7dafd87464f355d4654b7be0. In practice this wasn't an issue, because QPaintDeviceWindow handles paint events by calling markWindowAsDirty first, but we should not rely on this. Instead plumb the resize event to QPaintDeviceWindowPrivate, which QRasterWindow implements and can override the behavior of. Pick-to: 6.6 6.5 Change-Id: I5c0747da10f0275b77f56be32690d796fa48cdb4 Reviewed-by: Volker Hilsheimer (cherry picked from commit 6cb497c1570ee427460962b2c0abe3b6dd8c4ae6) Reviewed-by: Qt Cherry-pick Bot --- src/gui/kernel/qpaintdevicewindow.cpp | 2 ++ src/gui/kernel/qpaintdevicewindow_p.h | 2 ++ src/gui/kernel/qrasterwindow.cpp | 10 +++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/gui/kernel/qpaintdevicewindow.cpp b/src/gui/kernel/qpaintdevicewindow.cpp index bc7ac89b035..9e8c6ae5a85 100644 --- a/src/gui/kernel/qpaintdevicewindow.cpp +++ b/src/gui/kernel/qpaintdevicewindow.cpp @@ -171,6 +171,8 @@ bool QPaintDeviceWindow::event(QEvent *event) auto region = QRect(QPoint(0, 0), size()); d->doFlush(region); // Will end up calling paintEvent return true; + } else if (event->type() == QEvent::Resize) { + d->handleResizeEvent(); } return QWindow::event(event); diff --git a/src/gui/kernel/qpaintdevicewindow_p.h b/src/gui/kernel/qpaintdevicewindow_p.h index 2fdac02e0ab..85c11cbf916 100644 --- a/src/gui/kernel/qpaintdevicewindow_p.h +++ b/src/gui/kernel/qpaintdevicewindow_p.h @@ -31,6 +31,8 @@ public: QPaintDeviceWindowPrivate(); ~QPaintDeviceWindowPrivate() override; + virtual void handleResizeEvent() {} + virtual void beginPaint(const QRegion ®ion) { Q_UNUSED(region); diff --git a/src/gui/kernel/qrasterwindow.cpp b/src/gui/kernel/qrasterwindow.cpp index 7888db67777..f292344ca1f 100644 --- a/src/gui/kernel/qrasterwindow.cpp +++ b/src/gui/kernel/qrasterwindow.cpp @@ -34,6 +34,13 @@ class QRasterWindowPrivate : public QPaintDeviceWindowPrivate { Q_DECLARE_PUBLIC(QRasterWindow) public: + void handleResizeEvent() override + { + Q_Q(QRasterWindow); + if (backingstore->size() != q->size()) + markWindowAsDirty(); + } + void beginPaint(const QRegion ®ion) override { Q_Q(QRasterWindow); @@ -103,9 +110,6 @@ QPaintDevice *QRasterWindow::redirected(QPoint *) const void QRasterWindow::resizeEvent(QResizeEvent *) { - Q_D(QRasterWindow); - if (d->backingstore->size() != size()) - d->markWindowAsDirty(); } QT_END_NAMESPACE