1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-15 07:35:20 -04:00
Files
DankMaterialShell/quickshell/Widgets/WindowBlur.qml
T
purian23 8d94117a69 Cleanup
2026-06-12 10:56:16 -04:00

117 lines
3.0 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.Common
import qs.Services
Item {
id: root
visible: false
required property var targetWindow
property bool blurEnabled: Theme.connectedSurfaceBlurEnabled
property real blurX: 0
property real blurY: 0
property real blurWidth: 0
property real blurHeight: 0
property real blurRadius: 0
property bool clipEnabled: false
property real clipX: blurX
property real clipY: blurY
property real clipWidth: blurWidth
property real clipHeight: blurHeight
readonly property bool _active: blurEnabled && BlurService.enabled && !!targetWindow
Region {
id: blurRegion
x: root.blurX
y: root.blurY
width: root.blurWidth
height: root.blurHeight
radius: root.blurRadius
Region {
intersection: Intersection.Intersect
x: root.clipEnabled ? root.clipX : root.blurX
y: root.clipEnabled ? root.clipY : root.blurY
width: root.clipEnabled ? root.clipWidth : root.blurWidth
height: root.clipEnabled ? root.clipHeight : root.blurHeight
}
}
function _apply() {
if (!targetWindow)
return;
targetWindow.BackgroundEffect.blurRegion = _active ? blurRegion : null;
}
function _clear() {
if (targetWindow)
targetWindow.BackgroundEffect.blurRegion = null;
}
// Re-publish blur region after wl_surface remaps (e.g. screen change).
function kick() {
if (!targetWindow)
return;
targetWindow.BackgroundEffect.blurRegion = null;
targetWindow.BackgroundEffect.blurRegion = _active ? blurRegion : null;
}
function _scheduleLifecycleKick() {
lifecycleKickAction.restart();
}
function _runLifecycleKick() {
if (!targetWindow)
return;
if (targetWindow.visible)
kick();
else
_apply();
}
on_ActiveChanged: {
if (_active)
_scheduleLifecycleKick();
else
_clear();
}
onTargetWindowChanged: {
lifecycleKickAction.cancel();
_apply();
}
DeferredAction {
id: lifecycleKickAction
onTriggered: root._runLifecycleKick()
}
Connections {
target: root.targetWindow ?? null
ignoreUnknownSignals: true
function onVisibleChanged() {
if (root.targetWindow && root.targetWindow.visible)
root._scheduleLifecycleKick();
else
root._clear();
}
function onResourcesLost() {
lifecycleKickAction.cancel();
root._clear();
}
function onWindowConnected() {
root._scheduleLifecycleKick();
}
}
Component.onCompleted: _scheduleLifecycleKick()
Component.onDestruction: {
lifecycleKickAction.cancel();
if (targetWindow)
targetWindow.BackgroundEffect.blurRegion = null;
}
}