From 1e4d804e7f3fa7465811030e8da2bf10d544426a Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Wed, 28 Jan 2026 00:23:38 -0800 Subject: [PATCH] widgets/cliprect: use layer.effect on content item over property ShaderEffectSource as a property not parented to an item does not update its sourceItem's QQuickWindow when its own is changed. This lead to use after frees and broken effects when using ClippingRectangle. --- changelog/next.md | 1 + src/widgets/ClippingRectangle.qml | 23 ++++++++++------------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/changelog/next.md b/changelog/next.md index 30e998b..bccd780 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -43,6 +43,7 @@ set shell id. - Fixed asynchronous loaders not working after reload. - Fixed asynchronous loaders not working before window creation. - Fixed memory leak in IPC handlers. +- Fixed ClippingRectangle related crashes. ## Packaging Changes diff --git a/src/widgets/ClippingRectangle.qml b/src/widgets/ClippingRectangle.qml index 86fe601..3fc64d8 100644 --- a/src/widgets/ClippingRectangle.qml +++ b/src/widgets/ClippingRectangle.qml @@ -1,3 +1,5 @@ +pragma ComponentBehavior: Bound + import QtQuick ///! Rectangle capable of clipping content inside its border. @@ -24,7 +26,7 @@ Item { /// Defaults to true if any corner has a non-zero radius, otherwise false. property /*bool*/alias antialiasing: rectangle.antialiasing /// The background color of the rectangle, which goes under its content. - property /*color*/alias color: shader.backgroundColor + property color color: "white" /// See @@QtQuick.Rectangle.border. property clippingRectangleBorder border /// Radius of all corners. Defaults to 0. @@ -70,19 +72,14 @@ Item { anchors.fill: parent anchors.margins: root.contentInsideBorder ? root.border.width : 0 } - } - ShaderEffect { - id: shader - anchors.fill: root - fragmentShader: `qrc:/Quickshell/Widgets/shaders/cliprect${root.contentUnderBorder ? "-ub" : ""}.frag.qsb` - property Rectangle rect: rectangle - property color backgroundColor: "white" - property color borderColor: root.border.color - - property ShaderEffectSource content: ShaderEffectSource { - hideSource: true - sourceItem: contentItemContainer + layer.enabled: true + layer.samplerName: "content" + layer.effect: ShaderEffect { + fragmentShader: `qrc:/Quickshell/Widgets/shaders/cliprect${root.contentUnderBorder ? "-ub" : ""}.frag.qsb` + property Rectangle rect: rectangle + property color backgroundColor: root.color + property color borderColor: root.border.color } } }