From 2d5c66b79c24764e9820b8a34c0767127e5e3881 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Thu, 29 Aug 2024 09:37:41 +0200 Subject: [PATCH] client: Flush painting on subsurfaces When native widgets are nested in Qt, they act like independent windows with a shared backing store. The toplevel window gets multiple flush events with an argument for the window sub-content. In wayland we need a unique backing store, so this code copies the relevant contents into a new buffer and attaches it to the subsurface. Task-number: QTBUG-128029 Pick-to: 6.8 Change-Id: I865cb271d694d8190a444eb5a98378cd6a30634d Reviewed-by: David Redondo --- .../platforms/wayland/qwaylandshmbackingstore.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp index d77c548a009..2ef33bc2777 100644 --- a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp @@ -208,16 +208,23 @@ void QWaylandShmBackingStore::endPaint() void QWaylandShmBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) { + Q_UNUSED(offset) // Invoked when the window is of type RasterSurface or when the window is // RasterGLSurface and there are no child widgets requiring OpenGL composition. // For the case of RasterGLSurface + having to compose, the composeAndFlush() is // called instead. The default implementation from QPlatformBackingStore is sufficient // however so no need to reimplement that. - - - Q_UNUSED(window); - Q_UNUSED(offset); + if (window != this->window()) { + auto waylandWindow = static_cast(window->handle()); + auto newBuffer = new QWaylandShmBuffer(mDisplay, window->size(), mBackBuffer->image()->format(), mBackBuffer->scale()); + newBuffer->setDeleteOnRelease(true); + QRect sourceRect(window->position(), window->size()); + QPainter painter(newBuffer->image()); + painter.drawImage(QPoint(0, 0), *mBackBuffer->image(), sourceRect); + waylandWindow->safeCommit(newBuffer, region); + return; + } if (mPainting) { mPendingRegion |= region;