mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
71 lines
2.5 KiB
QML
71 lines
2.5 KiB
QML
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 MainScreen.
|
|
*/
|
|
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 ? Math.ceil(Settings.data.bar.marginHorizontal * Style.marginXL) : 0
|
|
readonly property real barMarginV: barFloating ? Math.ceil(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);
|
|
}
|
|
}
|