diff options
Diffstat (limited to 'src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp')
-rw-r--r-- | src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp b/src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp index b444d2b20..93161a3f7 100644 --- a/src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp +++ b/src/plugins/platforms/wayland_common/qwaylandshmbackingstore.cpp @@ -192,6 +192,9 @@ void QWaylandShmBackingStore::flush(QWindow *window, const QRegion ®ion, cons Q_UNUSED(offset); Q_ASSERT(waylandWindow()->windowType() == QWaylandWindow::Shm); + if (windowDecoration() && windowDecoration()->isDirty()) + updateDecorations(); + mFrontBuffer = mBackBuffer; if (mFrameCallback) { @@ -199,7 +202,7 @@ void QWaylandShmBackingStore::flush(QWindow *window, const QRegion ®ion, cons return; } - mFrameCallback = wl_surface_frame(waylandWindow()->wl_surface()); + mFrameCallback = waylandWindow()->frame(); wl_callback_add_listener(mFrameCallback,&frameCallbackListener,this); QMargins margins = windowDecorationMargins(); @@ -222,6 +225,7 @@ void QWaylandShmBackingStore::flush(QWindow *window, const QRegion ®ion, cons } } mFrontBufferIsDirty = false; + waylandWindow()->doResize(); } void QWaylandShmBackingStore::resize(const QSize &size, const QRegion &) @@ -245,8 +249,8 @@ void QWaylandShmBackingStore::resize(const QSize &size) mBackBuffer = new QWaylandShmBuffer(mDisplay, sizeWithMargins, format); - if (windowDecoration()) - windowDecoration()->paintDecoration(); + if (windowDecoration() && window()->isVisible()) + windowDecoration()->update(); } QImage *QWaylandShmBackingStore::entireSurface() const @@ -254,6 +258,36 @@ QImage *QWaylandShmBackingStore::entireSurface() const return mBackBuffer->image(); } +void QWaylandShmBackingStore::updateDecorations() +{ + QPainter decorationPainter(entireSurface()); + decorationPainter.setCompositionMode(QPainter::CompositionMode_Source); + QImage sourceImage = windowDecoration()->contentImage(); + QRect target; + //Top + target.setX(0); + target.setY(0); + target.setWidth(sourceImage.width()); + target.setHeight(windowDecorationMargins().top()); + decorationPainter.drawImage(target, sourceImage, target); + + //Left + target.setWidth(windowDecorationMargins().left()); + target.setHeight(sourceImage.height()); + decorationPainter.drawImage(target, sourceImage, target); + + //Right + target.setX(sourceImage.width() - windowDecorationMargins().right()); + decorationPainter.drawImage(target, sourceImage, target); + + //Bottom + target.setX(0); + target.setY(sourceImage.height() - windowDecorationMargins().bottom()); + target.setWidth(sourceImage.width()); + target.setHeight(windowDecorationMargins().bottom()); + decorationPainter.drawImage(target, sourceImage, target); +} + void QWaylandShmBackingStore::done(void *data, wl_callback *callback, uint32_t time) { Q_UNUSED(time); @@ -269,7 +303,8 @@ void QWaylandShmBackingStore::done(void *data, wl_callback *callback, uint32_t t delete window->attached(); } - window->attachOffset(self->mFrontBuffer); + if (window->attached() != self->mFrontBuffer) + window->attachOffset(self->mFrontBuffer); if (self->mFrontBufferIsDirty && !self->mPainting) { self->mFrontBufferIsDirty = false; @@ -284,3 +319,4 @@ const struct wl_callback_listener QWaylandShmBackingStore::frameCallbackListener }; QT_END_NAMESPACE + |