From 65edc5937148261259eeb601d6b0dbc893d6648e Mon Sep 17 00:00:00 2001 From: ItsLemmy Date: Mon, 3 Nov 2025 21:18:13 -0500 Subject: [PATCH] Project structure adjustments --- .../LinearSpectrum.qml | 0 .../MirroredSpectrum.qml | 0 .../{Audio => AudioSpectrum}/WaveSpectrum.qml | 0 Modules/Bar/Extras/BarExclusionZone.qml | 74 +++++++++++++++++++ Modules/Bar/Widgets/AudioVisualizer.qml | 2 +- Modules/Bar/Widgets/MediaMini.qml | 2 +- Modules/ControlCenter/Cards/MediaCard.qml | 2 +- Modules/LockScreen/LockScreen.qml | 2 +- 8 files changed, 78 insertions(+), 4 deletions(-) rename Modules/{Audio => AudioSpectrum}/LinearSpectrum.qml (100%) rename Modules/{Audio => AudioSpectrum}/MirroredSpectrum.qml (100%) rename Modules/{Audio => AudioSpectrum}/WaveSpectrum.qml (100%) create mode 100644 Modules/Bar/Extras/BarExclusionZone.qml diff --git a/Modules/Audio/LinearSpectrum.qml b/Modules/AudioSpectrum/LinearSpectrum.qml similarity index 100% rename from Modules/Audio/LinearSpectrum.qml rename to Modules/AudioSpectrum/LinearSpectrum.qml diff --git a/Modules/Audio/MirroredSpectrum.qml b/Modules/AudioSpectrum/MirroredSpectrum.qml similarity index 100% rename from Modules/Audio/MirroredSpectrum.qml rename to Modules/AudioSpectrum/MirroredSpectrum.qml diff --git a/Modules/Audio/WaveSpectrum.qml b/Modules/AudioSpectrum/WaveSpectrum.qml similarity index 100% rename from Modules/Audio/WaveSpectrum.qml rename to Modules/AudioSpectrum/WaveSpectrum.qml diff --git a/Modules/Bar/Extras/BarExclusionZone.qml b/Modules/Bar/Extras/BarExclusionZone.qml new file mode 100644 index 00000000..a2448a92 --- /dev/null +++ b/Modules/Bar/Extras/BarExclusionZone.qml @@ -0,0 +1,74 @@ +import QtQuick +import Quickshell +import Quickshell.Wayland +import qs.Commons + + +/** + * BarExclusionZone - Invisible PanelWindow that reserves exclusive space for the bar + * + * This is a minimal window that works with the compositor to reserve space, + * while the actual bar UI is rendered in NFullScreenWindow. + */ +PanelWindow { + id: root + + property bool exclusive: Settings.data.bar.exclusive !== undefined ? Settings.data.bar.exclusive : false + + readonly property string barPosition: Settings.data.bar.position || "top" + readonly property bool barIsVertical: barPosition === "left" || barPosition === "right" + readonly property bool barFloating: Settings.data.bar.floating || false + readonly property real barMarginH: barFloating ? Settings.data.bar.marginHorizontal * Style.marginXL : 0 + readonly property real barMarginV: barFloating ? Settings.data.bar.marginVertical * Style.marginXL : 0 + + // Invisible - just reserves space + color: "transparent" + + mask: Region {} + + // Wayland layer shell configuration + WlrLayershell.layer: WlrLayer.Top + WlrLayershell.namespace: "noctalia-bar-exclusion-" + (screen?.name || "unknown") + WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore + + // Anchor based on bar position + anchors { + top: barPosition === "top" + bottom: barPosition === "bottom" + left: barPosition === "left" || barPosition === "top" || barPosition === "bottom" + right: barPosition === "right" || barPosition === "top" || barPosition === "bottom" + } + + // Size based on bar orientation + // When floating, only reserve space for the bar + margin on the anchored edge + implicitWidth: { + if (barIsVertical) { + // Vertical bar: reserve bar height + margin on the anchored edge only + if (barFloating) { + // For left bar, reserve left margin; for right bar, reserve right margin + return Style.barHeight + barMarginH + } + return Style.barHeight + } + return 0 // Auto-width when left/right anchors are true + } + + implicitHeight: { + if (!barIsVertical) { + // Horizontal bar: reserve bar height + margin on the anchored edge only + if (barFloating) { + // For top bar, reserve top margin; for bottom bar, reserve bottom margin + return Style.barHeight + barMarginV + } + return Style.barHeight + } + return 0 // Auto-height when top/bottom anchors are true + } + + Component.onCompleted: { + Logger.d("BarExclusionZone", "Created for screen:", screen?.name) + Logger.d("BarExclusionZone", " Position:", barPosition, "Exclusive:", exclusive, "Floating:", barFloating) + Logger.d("BarExclusionZone", " Anchors - top:", anchors.top, "bottom:", anchors.bottom, "left:", anchors.left, "right:", anchors.right) + Logger.d("BarExclusionZone", " Size:", width, "x", height, "implicitWidth:", implicitWidth, "implicitHeight:", implicitHeight) + } +} diff --git a/Modules/Bar/Widgets/AudioVisualizer.qml b/Modules/Bar/Widgets/AudioVisualizer.qml index efb4a31e..0eb3438b 100644 --- a/Modules/Bar/Widgets/AudioVisualizer.qml +++ b/Modules/Bar/Widgets/AudioVisualizer.qml @@ -1,7 +1,7 @@ import QtQuick import Quickshell import qs.Commons -import qs.Modules.Audio +import qs.Modules.AudioSpectrum import qs.Services import qs.Widgets diff --git a/Modules/Bar/Widgets/MediaMini.qml b/Modules/Bar/Widgets/MediaMini.qml index 3d044208..55f93443 100644 --- a/Modules/Bar/Widgets/MediaMini.qml +++ b/Modules/Bar/Widgets/MediaMini.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell -import qs.Modules.Audio +import qs.Modules.AudioSpectrum import qs.Commons import qs.Services import qs.Widgets diff --git a/Modules/ControlCenter/Cards/MediaCard.qml b/Modules/ControlCenter/Cards/MediaCard.qml index d8725fb2..24de6066 100644 --- a/Modules/ControlCenter/Cards/MediaCard.qml +++ b/Modules/ControlCenter/Cards/MediaCard.qml @@ -3,7 +3,7 @@ import QtQuick.Controls import QtQuick.Layouts import QtQuick.Effects import Quickshell -import qs.Modules.Audio +import qs.Modules.AudioSpectrum import qs.Commons import qs.Services import qs.Widgets diff --git a/Modules/LockScreen/LockScreen.qml b/Modules/LockScreen/LockScreen.qml index cd3a5393..a7087847 100644 --- a/Modules/LockScreen/LockScreen.qml +++ b/Modules/LockScreen/LockScreen.qml @@ -11,7 +11,7 @@ import Quickshell.Widgets import qs.Commons import qs.Services import qs.Widgets -import qs.Modules.Audio +import qs.Modules.AudioSpectrum import qs.Modules.Bar.Calendar Loader {