From fb8854489e6097be3cb896b0213cb758dc21c854 Mon Sep 17 00:00:00 2001 From: rope Date: Wed, 27 May 2026 15:38:01 +0100 Subject: [PATCH] quickshell: single-surface bar+dropdowns for uniform blur Make bar full-screen with exclusiveZone 30 and render dropdowns as Items inside it instead of separate PanelWindows. One surface means one uniform blur. Input mask ensures clicks pass through transparent areas. Co-Authored-By: Claude Opus 4.6 --- settings/hyprland.nix | 50 ++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/settings/hyprland.nix b/settings/hyprland.nix index d88a034..14c05a9 100644 --- a/settings/hyprland.nix +++ b/settings/hyprland.nix @@ -537,7 +537,7 @@ in readonly property color base0B: "#${c.base0B}" readonly property color base0C: "#${c.base0C}" readonly property color base0D: "#${c.base0D}" - readonly property color barBg: "#E6${c.base00}" + readonly property color barBg: "#B3${c.base00}" readonly property color toastBg: "#E6${c.base00}" } ''; @@ -626,13 +626,28 @@ in top: true left: true right: true + bottom: true } - implicitHeight: 30 + exclusiveZone: 30 color: "transparent" + mask: Region { + item: barBgRect + Region { + x: activeDropdown ? activeDropdown.x : 0 + y: activeDropdown ? activeDropdown.y : 0 + width: activeDropdown && activeDropdown.visible ? activeDropdown.width : 0 + height: activeDropdown && activeDropdown.visible ? activeDropdown.height : 0 + } + } + Rectangle { - anchors.fill: parent + id: barBgRect + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: 30 color: Theme.barBg } @@ -667,7 +682,7 @@ in Row { anchors.left: parent.left anchors.leftMargin: 6 - anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenter: barBgRect.verticalCenter spacing: 0 Repeater { @@ -706,7 +721,8 @@ in // Center — clock Text { id: clockText - anchors.centerIn: parent + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: barBgRect.verticalCenter property date now: new Date() text: now.toLocaleTimeString(Qt.locale(), "HH:mm") color: Theme.base05 @@ -738,7 +754,7 @@ in Row { anchors.right: parent.right anchors.rightMargin: 8 - anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenter: barBgRect.verticalCenter spacing: 10 // Volume @@ -1167,7 +1183,7 @@ in } // Reusable dropdown component - component BarDropdown: PanelWindow { + component BarDropdown: Item { id: dropdown property bool open: false property bool closing: false @@ -1190,24 +1206,14 @@ in if (visible && !closing) _autoClose.restart(); } - screen: bar.screen - WlrLayershell.namespace: "quickshell-bar" - WlrLayershell.layer: WlrLayer.Overlay - exclusionMode: ExclusionMode.Ignore - anchors { - top: true - left: !alignRight - right: alignRight - } - margins.top: bar.implicitHeight - margins.left: alignRight ? 0 : Math.min( - bar.width - implicitWidth, + x: alignRight ? bar.width - width : Math.min( + bar.width - width, Math.max(0, dropdownX - (fullWidth + 16) / 2) ) + y: 30 visible: false - color: "transparent" - implicitWidth: fullWidth + (alignRight ? 8 : 16) - implicitHeight: fullHeight + 4 + (alignRight ? 8 : 0) + width: fullWidth + (alignRight ? 8 : 16) + height: fullHeight + 4 + (alignRight ? 8 : 0) onVisibleChanged: { if (visible) {