diff --git a/src/scene/surfaceitem_wayland.cpp b/src/scene/surfaceitem_wayland.cpp index a4d012f774..4a307565c0 100644 --- a/src/scene/surfaceitem_wayland.cpp +++ b/src/scene/surfaceitem_wayland.cpp @@ -252,15 +252,30 @@ SurfaceItemXwayland::SurfaceItemXwayland(X11Window *window, Item *parent) : SurfaceItemWayland(window->surface(), parent) , m_window(window) { + connect(window, &X11Window::shapeChanged, this, &SurfaceItemXwayland::discardQuads); +} + +QList SurfaceItemXwayland::shape() const +{ + QList shape = m_window->shapeRegion(); + for (QRectF &shapePart : shape) { + shapePart = shapePart.intersected(rect()); + } + return shape; } QRegion SurfaceItemXwayland::opaque() const { + QRegion shapeRegion; + for (const QRectF &shapePart : shape()) { + shapeRegion += shapePart.toRect(); + } if (!m_window->hasAlpha()) { - return rect().toRect(); + return shapeRegion; } else { - return m_window->opaqueRegion() & rect().toRect(); + return m_window->opaqueRegion() & shapeRegion; } + return QRegion(); } #endif } // namespace KWin diff --git a/src/scene/surfaceitem_wayland.h b/src/scene/surfaceitem_wayland.h index 991cd168c3..f769284172 100644 --- a/src/scene/surfaceitem_wayland.h +++ b/src/scene/surfaceitem_wayland.h @@ -95,6 +95,7 @@ public: explicit SurfaceItemXwayland(X11Window *window, Item *parent = nullptr); QRegion opaque() const override; + QList shape() const override; private: X11Window *m_window;