From 0bb8353a33ec6eaea36a26a0cc412ec7ab0a07b4 Mon Sep 17 00:00:00 2001 From: purian23 Date: Mon, 6 Jul 2026 23:52:57 -0400 Subject: [PATCH] refactor(blurSync): reimplement blur sync in popouts & modals --- .../Modals/Common/DankModalStandalone.qml | 22 ++++++++++++++---- .../DankLauncherV2ModalStandalone.qml | 23 +++++++++++++++---- quickshell/Widgets/DankPopoutStandalone.qml | 13 ++++++----- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/quickshell/Modals/Common/DankModalStandalone.qml b/quickshell/Modals/Common/DankModalStandalone.qml index f0cb217ff..a46a611c5 100644 --- a/quickshell/Modals/Common/DankModalStandalone.qml +++ b/quickshell/Modals/Common/DankModalStandalone.qml @@ -62,6 +62,11 @@ Item { property bool animationsEnabled: true + function _kickBlurCommit() { + if (typeof contentWindow.update === "function") + contentWindow.update(); + } + function open() { closeTimer.stop(); isClosing = false; @@ -201,6 +206,12 @@ Item { } })(), dpr) + onAlignedXChanged: _kickBlurCommit() + onAlignedYChanged: _kickBlurCommit() + onAlignedWidthChanged: _kickBlurCommit() + onAlignedHeightChanged: _kickBlurCommit() + onShouldBeVisibleChanged: _kickBlurCommit() + PanelWindow { id: clickCatcher visible: false @@ -244,11 +255,13 @@ Item { WindowBlur { targetWindow: contentWindow readonly property real s: Math.min(1, modalContainer.scaleValue) + readonly property real op: Math.max(0, Math.min(1, (morph.openProgress - 0.06) * 2)) + readonly property real visibleScale: s * op // Blur tracks the surface's scaled rect, matching the connected backend. - blurX: modalContainer.x + modalContainer.width * (1 - s) * 0.5 + Theme.snap(modalContainer.animX, root.dpr) - blurY: modalContainer.y + modalContainer.height * (1 - s) * 0.5 + Theme.snap(modalContainer.animY, root.dpr) - blurWidth: root.shouldBeVisible ? modalContainer.width * s : 0 - blurHeight: root.shouldBeVisible ? modalContainer.height * s : 0 + blurX: modalContainer.x + modalContainer.width * (1 - visibleScale) * 0.5 + Theme.snap(modalContainer.animX, root.dpr) + blurY: modalContainer.y + modalContainer.height * (1 - visibleScale) * 0.5 + Theme.snap(modalContainer.animY, root.dpr) + blurWidth: root.shouldBeVisible ? modalContainer.width * visibleScale : 0 + blurHeight: root.shouldBeVisible ? modalContainer.height * visibleScale : 0 blurRadius: root.cornerRadius } @@ -338,6 +351,7 @@ Item { QtObject { id: morph property real openProgress: root.shouldBeVisible ? 1 : 0 + onOpenProgressChanged: root._kickBlurCommit() Behavior on openProgress { enabled: root.animationsEnabled DankAnim { diff --git a/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalStandalone.qml b/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalStandalone.qml index 89ccb4bd7..6ba742aae 100644 --- a/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalStandalone.qml +++ b/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalStandalone.qml @@ -82,6 +82,12 @@ Item { readonly property real windowWidth: alignedWidth + contentX + shadowPad readonly property real windowHeight: alignedHeight + contentY + shadowPad + onAlignedXChanged: _kickBlurCommit() + onAlignedYChanged: _kickBlurCommit() + onAlignedWidthChanged: _kickBlurCommit() + onAlignedHeightChanged: _kickBlurCommit() + onContentVisibleChanged: _kickBlurCommit() + readonly property color backgroundColor: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) readonly property bool useBackgroundDarken: !FrameTransitionState.effectiveFrameEnabled && SettingsData.modalDarkenBackground readonly property bool useSingleWindow: CompositorService.isHyprland || useBackgroundDarken @@ -113,6 +119,11 @@ Item { signal dialogClosed + function _kickBlurCommit() { + if (typeof launcherWindow.update === "function") + launcherWindow.update(); + } + function _ensureContentLoadedAndInitialize(query, mode) { _pendingQuery = query || ""; _pendingMode = mode || ""; @@ -366,11 +377,13 @@ Item { WindowBlur { targetWindow: launcherWindow readonly property real s: Math.min(1, modalContainer.publishedScale) + readonly property real op: Math.max(0, Math.min(1, (modalContainer.opacity - 0.06) * 2)) + readonly property real visibleScale: s * op // Blur tracks the surface's scaled rect - blurX: modalContainer.x + modalContainer.width * (1 - s) * 0.5 - blurY: modalContainer.y + modalContainer.height * (1 - s) * 0.5 - blurWidth: contentVisible ? modalContainer.width * s : 0 - blurHeight: contentVisible ? modalContainer.height * s : 0 + blurX: modalContainer.x + modalContainer.width * (1 - visibleScale) * 0.5 + blurY: modalContainer.y + modalContainer.height * (1 - visibleScale) * 0.5 + blurWidth: contentVisible ? modalContainer.width * visibleScale : 0 + blurHeight: contentVisible ? modalContainer.height * visibleScale : 0 blurRadius: root.cornerRadius } @@ -460,6 +473,8 @@ Item { opacity: contentVisible ? 1 : 0 scale: contentVisible ? 1 : 0.96 transformOrigin: Item.Center + onOpacityChanged: root._kickBlurCommit() + onPublishedScaleChanged: root._kickBlurCommit() Behavior on opacity { NumberAnimation { diff --git a/quickshell/Widgets/DankPopoutStandalone.qml b/quickshell/Widgets/DankPopoutStandalone.qml index 914520e25..644645e5a 100644 --- a/quickshell/Widgets/DankPopoutStandalone.qml +++ b/quickshell/Widgets/DankPopoutStandalone.qml @@ -620,13 +620,15 @@ Item { id: popoutBlur targetWindow: contentWindow readonly property real s: Math.min(1, contentContainer.scaleValue) + readonly property real op: Math.max(0, Math.min(1, (morph.openProgress - 0.08) * 1.6)) + readonly property real visibleScale: s * op readonly property bool revealClipActive: root.fluidStandaloneActive // Blur tracks the surface's scaled rect, matching the connected backend - blurX: revealClipActive ? contentContainer.x : contentContainer.x + contentContainer.width * (1 - s) * 0.5 + Theme.snap(contentContainer.animX, root.dpr) - blurY: revealClipActive ? contentContainer.y : contentContainer.y + contentContainer.height * (1 - s) * 0.5 + Theme.snap(contentContainer.animY, root.dpr) - blurWidth: root.shouldBeVisible ? (revealClipActive ? contentContainer.width : contentContainer.width * s) : 0 - blurHeight: root.shouldBeVisible ? (revealClipActive ? contentContainer.height : contentContainer.height * s) : 0 + blurX: revealClipActive ? contentContainer.x : contentContainer.x + contentContainer.width * (1 - visibleScale) * 0.5 + Theme.snap(contentContainer.animX, root.dpr) + blurY: revealClipActive ? contentContainer.y : contentContainer.y + contentContainer.height * (1 - visibleScale) * 0.5 + Theme.snap(contentContainer.animY, root.dpr) + blurWidth: root.shouldBeVisible ? (revealClipActive ? contentContainer.width : contentContainer.width * visibleScale) : 0 + blurHeight: root.shouldBeVisible ? (revealClipActive ? contentContainer.height : contentContainer.height * visibleScale) : 0 blurRadius: Theme.cornerRadius clipEnabled: revealClipActive clipX: contentContainer.x + contentContainer.revealX @@ -742,8 +744,7 @@ Item { QtObject { id: morph property real openProgress: 0 - onOpenProgressChanged: if (root.fluidStandaloneActive) - root._kickBlurCommit() + onOpenProgressChanged: root._kickBlurCommit() Behavior on openProgress { enabled: root.animationsEnabled NumberAnimation {