diff --git a/Config/Config.qml b/Config/Config.qml index d5c1abe..44d07da 100644 --- a/Config/Config.qml +++ b/Config/Config.qml @@ -209,6 +209,7 @@ Singleton { return { logo: general.logo, wallpaperPath: general.wallpaperPath, + showOverFullscreen: general.showOverFullscreen, desktopIcons: general.desktopIcons, dateFormat: general.dateFormat, color: { diff --git a/Config/General.qml b/Config/General.qml index deb374c..2223ad7 100644 --- a/Config/General.qml +++ b/Config/General.qml @@ -13,6 +13,7 @@ JsonObject { property Idle idle: Idle { } property string logo: "" + property bool showOverFullscreen: true property string wallpaperPath: Quickshell.env("HOME") + "/Pictures/Wallpapers" component Apps: JsonObject { diff --git a/Drawers/Interactions.qml b/Drawers/Interactions.qml index 0e9eb4d..62edf62 100644 --- a/Drawers/Interactions.qml +++ b/Drawers/Interactions.qml @@ -9,6 +9,7 @@ Item { id: root required property Item bar + required property real borderThickness property bool dashboardShortcutActive required property Drawing drawing required property DrawingInput input @@ -48,7 +49,7 @@ Item { } function withinPanelWidth(panel: Item, x: real, y: real): bool { - const panelX = panel.x; + const panelX = panel.x + root.borderThickness; return x >= panelX && x <= panelX + panel.width; } diff --git a/Drawers/Panels.qml b/Drawers/Panels.qml index f693b0f..7c980e9 100644 --- a/Drawers/Panels.qml +++ b/Drawers/Panels.qml @@ -20,6 +20,7 @@ Item { id: root required property Item bar + required property real borderThickness readonly property alias clipboard: clipboard readonly property alias dashboard: dashboard readonly property alias dashboardWrapper: dashboardWrapper @@ -43,7 +44,7 @@ Item { required property PersistentProperties visibilities anchors.fill: parent - anchors.margins: Config.barConfig.border + anchors.margins: borderThickness anchors.topMargin: bar.implicitHeight Item { @@ -99,6 +100,7 @@ Item { id: popouts anchors.top: parent.top + borderThickness: root.borderThickness screen: root.screen } diff --git a/Drawers/Windows.qml b/Drawers/Windows.qml index a0a0b06..3086beb 100644 --- a/Drawers/Windows.qml +++ b/Drawers/Windows.qml @@ -18,18 +18,47 @@ CustomWindow { id: root readonly property alias bar: bar - readonly property bool hasFullscreen: Hypr.monitorFor(screen)?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen === 2) + readonly property real borderLayoutThickness: hasFullscreen ? 0 : Config.barConfig.border + readonly property real borderRounding: Config.barConfig.rounding * (1 - fsTransitionProg) + readonly property real borderThickness: Config.barConfig.border * (1 - fsTransitionProg) + property real fsTransitionProg: hasFullscreen ? 1 : 0 + readonly property bool hasFullscreen: { + if (hasSpecialWorkspace) { + const specialName = monitor?.lastIpcObject.specialWorkspace?.name; + if (!specialName) + return false; + const specialWs = Hypr.workspaces.values.find(ws => ws.name === specialName); + return specialWs?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false; + } + return hasFullscreenOnNormalWs; + } + readonly property bool hasFullscreenOnNormalWs: monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false + readonly property bool hasSpecialWorkspace: (monitor?.lastIpcObject.specialWorkspace?.name.length ?? 0) > 0 readonly property alias interactionWrapper: interactions readonly property alias menuRegion: menuPopoutRegion + readonly property HyprlandMonitor monitor: Hypr.monitorFor(screen) property var root: Quickshell.shellDir + readonly property real sdfBorderOffset: 2 * fsTransitionProg + readonly property real shadowOpacity: 0.7 * (1 - fsTransitionProg) + property color surfaceColor: DynamicColors.tPalette.m3surface WlrLayershell.exclusionMode: ExclusionMode.Ignore - // WlrLayershell.keyboardFocus: visibilities.dock || visibilities.launcher || visibilities.sidebar || visibilities.dashboard || visibilities.settings || visibilities.resources ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None + WlrLayershell.keyboardFocus: visibilities.launcher || visibilities.settings ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None + WlrLayershell.layer: (fsTransitionProg > 0 && Config.general.showOverFullscreen) || (hasSpecialWorkspace && hasFullscreenOnNormalWs) ? WlrLayer.Overlay : WlrLayer.Top color: "transparent" contentItem.focus: true - mask: visibilities.isDrawing ? null : region + mask: visibilities.isDrawing ? null : (hasFullscreen ? emptyRegion : region) name: "Bar" + Behavior on fsTransitionProg { + Anim { + } + } + Behavior on surfaceColor { + CAnim { + } + } + contentItem.Keys.onEscapePressed: { if (Config.barConfig.autoHide) visibilities.bar = false; @@ -61,6 +90,15 @@ CustomWindow { intersection: Intersection.Subtract } + Region { + id: emptyRegion + + height: panels.notifications.height + width: panels.notifications.width + x: panels.notifications.x + root.borderThickness + y: panels.notifications.y + bar.implicitHeight + } + Region { id: region @@ -150,35 +188,30 @@ CustomWindow { Item { anchors.fill: parent layer.enabled: true - opacity: Appearance.transparency.enabled ? DynamicColors.transparency.base : 1 + opacity: root.surfaceColor.a layer.effect: MultiEffect { blurMax: 32 - shadowColor: Qt.alpha(DynamicColors.palette.m3shadow, 1) + shadowColor: Qt.alpha(DynamicColors.palette.m3shadow, Math.max(0, root.shadowOpacity)) shadowEnabled: true } BlobGroup { id: blobGroup - color: DynamicColors.palette.m3surface + color: root.surfaceColor smoothing: Config.barConfig.smoothing - - Behavior on color { - CAnim { - } - } } BlobInvertedRect { anchors.fill: parent anchors.margins: -50 - borderBottom: Config.barConfig.border - anchors.margins - borderLeft: Config.barConfig.border - anchors.margins - borderRight: Config.barConfig.border - anchors.margins - borderTop: bar.implicitHeight - anchors.margins + borderBottom: root.borderThickness - anchors.margins - root.sdfBorderOffset + borderLeft: root.borderThickness - anchors.margins - root.sdfBorderOffset + borderRight: root.borderThickness - anchors.margins - root.sdfBorderOffset + borderTop: bar.implicitHeight - anchors.margins - root.sdfBorderOffset group: blobGroup - radius: Config.barConfig.rounding + radius: root.borderRounding } PanelBg { @@ -351,6 +384,7 @@ CustomWindow { anchors.fill: parent bar: bar + borderThickness: root.borderLayoutThickness drawing: drawingLoader.item enabled: true input: inputLoader.item @@ -363,6 +397,7 @@ CustomWindow { id: panels bar: bar + borderThickness: root.borderThickness drawingItem: drawingLoader.item screen: root.screen visibilities: visibilities @@ -407,6 +442,7 @@ CustomWindow { anchors.left: parent.left anchors.right: parent.right + fullscreen: root.hasFullscreen popouts: panels.popouts popoutsWrapper: panels.popoutsWrapper screen: root.screen @@ -423,7 +459,7 @@ CustomWindow { implicitHeight: panel.height implicitWidth: panel.width radius: Appearance.rounding.smallest - x: panel.x + Config.barConfig.border + x: panel.x + root.borderThickness y: panel.y + bar.implicitHeight } } diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 9ac299b..a2dd682 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -18,6 +18,7 @@ RowLayout { required property Wrapper popouts required property ClipWrapper popoutsWrapper required property ShellScreen screen + required property bool fullscreen readonly property int vPadding: 6 required property PersistentProperties visibilities @@ -91,6 +92,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: HyprsunsetWidget { + visible: !root.fullscreen } } } @@ -109,6 +111,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: Workspaces { screen: root.screen + visible: !root.fullscreen } } } @@ -120,6 +123,7 @@ RowLayout { sourceComponent: TrayWidget { loader: root popouts: root.popouts + visible: !root.fullscreen } } } @@ -130,6 +134,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: Resources { visibilities: root.visibilities + visible: !root.fullscreen } } } @@ -139,6 +144,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: UpdatesWidget { + visible: !root.fullscreen } } } @@ -150,6 +156,7 @@ RowLayout { sourceComponent: NotifBell { popouts: root.popouts visibilities: root.visibilities + visible: !root.fullscreen } } } @@ -162,6 +169,7 @@ RowLayout { loader: root popouts: root.popouts visibilities: root.visibilities + visible: !root.fullscreen } } } @@ -172,6 +180,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: WindowTitle { bar: root + visible: !root.fullscreen } } } @@ -190,6 +199,7 @@ RowLayout { delegate: WrappedLoader { sourceComponent: MediaWidget { + visible: !root.fullscreen } } } diff --git a/Modules/Bar/BarLoader.qml b/Modules/Bar/BarLoader.qml index b5e0d75..3fd00e1 100644 --- a/Modules/Bar/BarLoader.qml +++ b/Modules/Bar/BarLoader.qml @@ -17,12 +17,13 @@ Item { readonly property int contentHeight: Config.barConfig.height + padding * 2 readonly property int exclusiveZone: Config.barConfig.autoHide ? Config.barConfig.border : contentHeight + required property bool fullscreen property bool isHovered readonly property int padding: Math.max(Appearance.padding.smaller, Config.barConfig.border) required property Wrapper popouts required property ClipWrapper popoutsWrapper required property ShellScreen screen - readonly property bool shouldBeVisible: (!Config.barConfig.autoHide || visibilities.bar || isHovered) + readonly property bool shouldBeVisible: !fullscreen && (!Config.barConfig.autoHide || visibilities.bar || isHovered) readonly property int vPadding: 6 required property PersistentProperties visibilities @@ -30,7 +31,7 @@ Item { content.item?.checkPopout(x); } - implicitHeight: Config.barConfig.border + implicitHeight: fullscreen ? 0 : Config.barConfig.border visible: height > Config.barConfig.border states: State { @@ -75,6 +76,7 @@ Item { anchors.right: parent.right sourceComponent: Bar { + fullscreen: root.fullscreen height: root.contentHeight popouts: root.popouts popoutsWrapper: root.popoutsWrapper diff --git a/Modules/ClipWrapper.qml b/Modules/ClipWrapper.qml index 904f27a..10fbd82 100644 --- a/Modules/ClipWrapper.qml +++ b/Modules/ClipWrapper.qml @@ -8,6 +8,7 @@ import qs.Config Item { id: root + required property real borderThickness readonly property alias content: content property real offsetScale: y > 0 || content.hasCurrent ? 0 : 1 required property ShellScreen screen @@ -17,7 +18,7 @@ Item { implicitWidth: content.implicitWidth visible: width > 0 && height > 0 x: { - const off = content.currentCenter - Config.barConfig.border - content.nonAnimWidth / 2; + const off = content.currentCenter - borderThickness - content.nonAnimWidth / 2; const diff = parent.width - Math.floor(off + content.nonAnimWidth); if (diff < 0) return off + diff; diff --git a/Modules/Notifications/Notification.qml b/Modules/Notifications/Notification.qml index 178b086..af7c88e 100644 --- a/Modules/Notifications/Notification.qml +++ b/Modules/Notifications/Notification.qml @@ -20,6 +20,7 @@ CustomRect { required property NotifServer.Notif modelData readonly property int nonAnimHeight: summary.implicitHeight + (root.expanded ? appName.height + body.height + actions.height + actions.anchors.topMargin : bodyPreview.height) + inner.anchors.margins * 2 + clip: true color: root.modelData.urgency === NotificationUrgency.Critical ? DynamicColors.palette.m3secondaryContainer : DynamicColors.tPalette.m3surfaceContainer implicitHeight: inner.implicitHeight implicitWidth: Config.notifs.sizes.width @@ -435,6 +436,7 @@ CustomRect { StateLayer { color: root.modelData.urgency === NotificationUrgency.Critical ? DynamicColors.palette.m3onSecondary : DynamicColors.palette.m3onSurface + enabled: root.expanded radius: Appearance.rounding.full onClicked: {