Compare commits

..

3 commits

Author SHA1 Message Date
Damocles
974613d811 nix fmt 2026-04-12 22:48:04 +02:00
Damocles
0eeaa6a04e window title: grow to content, spacer takes remaining space 2026-04-12 22:47:33 +02:00
Damocles
f6219ce3c2 rename Overview to BackgroundOverlay everywhere 2026-04-12 22:45:08 +02:00
7 changed files with 22 additions and 22 deletions

View file

@ -18,7 +18,7 @@ exactly when you should be most suspicious.
- Per-module accent colors that change based on state, with animated transitions. Battery blinks when critical and sends desktop notifications, because the robot cares about your hardware more than you do
- Audio visualizer on album art via cava — because the robot watched too many r/unixporn posts and couldn't help itself
- Screen corner rounding — tiny overlay windows with quarter-circle masks, click-transparent, configurable via `screenRadius`. The gradient top border curves to match, because the robot has opinions about pixel alignment
- Overview widgets — clock and date rendered on the background layer, visible in the gaps between workspace rows when niri's overview is active. Always there, never in the way
- Background overlay — clock and date rendered on the background layer, visible behind windows and in niri overview gaps. Always there, never in the way
- Weather via wttrbar with configurable arguments and rich HTML tooltips
- Power menu with lock, suspend, logout, reboot, shutdown
- Event-driven updates for network, bluetooth, and power profiles via dbus-monitor/nmcli monitor — no more 5-second polling lag
@ -83,6 +83,11 @@ programs.nova-shell.modules = {
# modules with extra config
backlight.step = 2; # brightness adjustment %
weather.args = [ "--nerd" "--location" "Berlin" ]; # wttrbar arguments
temperature.warm = 55; # °C threshold for warm color
temperature.hot = 75; # °C threshold for hot color
battery.warning = 30; # % for warning notification
battery.critical = 10; # % for critical blink + notification
cpu.interval = 2000; # polling interval in ms
};
```
@ -130,7 +135,7 @@ Full list of theme keys and their defaults:
| `barSpacing` | `12` | Gap between modules (px) |
| `moduleSpacing` | `4` | Icon-to-label gap within a module (px) |
| `radius` | `4` | Corner radius for flyouts and menus (px) |
| `screenRadius` | `20` | Screen corner rounding, 0 to disable (px) |
| `screenRadius` | `15` | Screen corner rounding, 0 to disable (px) |
### Systemd service

View file

@ -12,7 +12,7 @@ PanelWindow {
WlrLayershell.layer: WlrLayer.Background
WlrLayershell.exclusiveZone: -1
WlrLayershell.namespace: "nova-overview"
WlrLayershell.namespace: "nova-background-overlay"
mask: Region {}
anchors.top: true

View file

@ -138,12 +138,14 @@ PanelWindow {
}
}
M.BarGroup {
Layout.fillWidth: true
clip: true
M.WindowTitle {
visible: M.Modules.windowTitle.enable
}
}
Item {
Layout.fillWidth: true
}
}
// ---- right ----

View file

@ -11,16 +11,12 @@ Item {
// Auto-compute border color from top gradient position (base0C base09)
readonly property real _posFrac: {
const scr = QsWindow.window?.screen;
if (!scr) return 0.5;
if (!scr)
return 0.5;
const gx = mapToGlobal(width / 2, 0).x - scr.x;
return Math.max(0, Math.min(1, gx / scr.width));
}
property color borderColor: Qt.rgba(
M.Theme.base0C.r + (M.Theme.base09.r - M.Theme.base0C.r) * _posFrac,
M.Theme.base0C.g + (M.Theme.base09.g - M.Theme.base0C.g) * _posFrac,
M.Theme.base0C.b + (M.Theme.base09.b - M.Theme.base0C.b) * _posFrac,
1
)
property color borderColor: Qt.rgba(M.Theme.base0C.r + (M.Theme.base09.r - M.Theme.base0C.r) * _posFrac, M.Theme.base0C.g + (M.Theme.base09.g - M.Theme.base0C.g) * _posFrac, M.Theme.base0C.b + (M.Theme.base09.b - M.Theme.base0C.b) * _posFrac, 1)
visible: row.visibleChildren.length > 0

View file

@ -39,14 +39,7 @@ M.BarSection {
Process {
id: cavaProc
running: root.playing
command: ["sh", "-c",
"cfg=$(mktemp /tmp/nova-cava-XXXXXX.conf);" +
"cat > \"$cfg\" << 'CAVAEOF'\n" +
"[general]\nbars=16\nframerate=30\n[output]\nmethod=raw\nraw_target=/dev/stdout\ndata_format=ascii\nascii_max_range=100\n" +
"CAVAEOF\n" +
"trap 'rm -f \"$cfg\"' EXIT;" +
"exec cava -p \"$cfg\""
]
command: ["sh", "-c", "cfg=$(mktemp /tmp/nova-cava-XXXXXX.conf);" + "cat > \"$cfg\" << 'CAVAEOF'\n" + "[general]\nbars=16\nframerate=30\n[output]\nmethod=raw\nraw_target=/dev/stdout\ndata_format=ascii\nascii_max_range=100\n" + "CAVAEOF\n" + "trap 'rm -f \"$cfg\"' EXIT;" + "exec cava -p \"$cfg\""]
stdout: SplitParser {
splitMarker: "\n"
onRead: line => {
@ -250,7 +243,11 @@ M.BarSection {
color: M.Theme.base0E
radius: 1
Behavior on height { NumberAnimation { duration: 50 } }
Behavior on height {
NumberAnimation {
duration: 50
}
}
}
}
}

View file

@ -33,4 +33,4 @@ IdleInhibitor 1.0 IdleInhibitor.qml
Notifications 1.0 Notifications.qml
Power 1.0 Power.qml
Privacy 1.0 Privacy.qml
Overview 1.0 Overview.qml
BackgroundOverlay 1.0 BackgroundOverlay.qml

View file

@ -19,7 +19,7 @@ ShellRoot {
screen: scope.modelData
}
Overview {
BackgroundOverlay {
screen: scope.modelData
}