show notification in fullscreen
Lint & Format (JS/TS) / lint-format (pull_request) Successful in 10s
Python / lint-format (pull_request) Successful in 18s
Python / test (pull_request) Successful in 27s
Lint & Format (Rust) / lint-format (pull_request) Successful in 1m11s

This commit is contained in:
2026-06-17 18:44:50 +02:00
parent 5fb137699f
commit a98a7944b9
9 changed files with 78 additions and 22 deletions
+1
View File
@@ -209,6 +209,7 @@ Singleton {
return {
logo: general.logo,
wallpaperPath: general.wallpaperPath,
showOverFullscreen: general.showOverFullscreen,
desktopIcons: general.desktopIcons,
dateFormat: general.dateFormat,
color: {
+1
View File
@@ -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 {
+2 -1
View File
@@ -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;
}
+3 -1
View File
@@ -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
}
+53 -17
View File
@@ -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
}
}
+10
View File
@@ -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
}
}
}
+4 -2
View File
@@ -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
+2 -1
View File
@@ -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;
+2
View File
@@ -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: {