From 89ef2bfb470321ea43b3d8a7383dc2378e3280ec Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 15 Nov 2024 09:29:41 +0000 Subject: [PATCH] Revert "scene: Ignore xwayland window shape" This reverts commit 4bc74d6831253b545a65bf74d2714af3603f17cf. Wine still depends on XSHAPE to implement window clipping APIs in Windows applications. BUG: 493934 (cherry picked from commit a12d0723a9b4bc83fce56d459d8af3bc7653db9f) Co-authored-by: Vlad Zahorodnii --- src/scene/surfaceitem_wayland.cpp | 19 +++++++++++++++++-- src/scene/surfaceitem_wayland.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) 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;