diff options
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r-- | src/client/qwaylandwindow.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index 76f9e9f7a..130dbab36 100644 --- a/src/client/qwaylandwindow.cpp +++ b/src/client/qwaylandwindow.cpp @@ -362,6 +362,9 @@ void QWaylandWindow::setGeometry(const QRect &rect) if (mShellSurface) mShellSurface->setWindowGeometry(windowContentGeometry()); + + if (isOpaque() && mMask.isEmpty()) + setOpaqueArea(rect); } void QWaylandWindow::resizeFromApplyConfigure(const QSize &sizeWithMargins, const QPoint &offset) @@ -461,10 +464,16 @@ void QWaylandWindow::setMask(const QRegion &mask) if (mMask.isEmpty()) { mSurface->set_input_region(nullptr); + + if (isOpaque()) + setOpaqueArea(QRect(QPoint(0, 0), geometry().size())); } else { struct ::wl_region *region = mDisplay->createRegion(mMask); mSurface->set_input_region(region); wl_region_destroy(region); + + if (isOpaque()) + setOpaqueArea(mMask); } mSurface->commit(); @@ -1223,6 +1232,23 @@ bool QtWaylandClient::QWaylandWindow::startSystemMove() return false; } +bool QWaylandWindow::isOpaque() const +{ + return window()->requestedFormat().alphaBufferSize() <= 0; +} + +void QWaylandWindow::setOpaqueArea(const QRegion &opaqueArea) +{ + if (opaqueArea == mOpaqueArea || !mSurface) + return; + + mOpaqueArea = opaqueArea; + + struct ::wl_region *region = mDisplay->createRegion(opaqueArea); + mSurface->set_opaque_region(region); + wl_region_destroy(region); +} + } QT_END_NAMESPACE |