diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2024-01-25 14:58:39 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2024-02-01 19:25:42 +0000 |
commit | 6cb497c1570ee427460962b2c0abe3b6dd8c4ae6 (patch) | |
tree | 323e585808a3d411dfa63e30f48e64ff4b1636a3 | |
parent | d44629d677ed2aae6d32ab10cb69cfdffa385639 (diff) |
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.5 6.6 6.7
Change-Id: I5c0747da10f0275b77f56be32690d796fa48cdb4
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r-- | src/gui/kernel/qpaintdevicewindow.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qpaintdevicewindow_p.h | 2 | ||||
-rw-r--r-- | 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 bc7ac89b03..9e8c6ae5a8 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 2fdac02e0a..85c11cbf91 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 7888db6777..f292344ca1 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 |