Compare commits
3 commits
ff005acc60
...
974613d811
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
974613d811 | ||
|
|
0eeaa6a04e | ||
|
|
f6219ce3c2 |
7 changed files with 22 additions and 22 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -138,12 +138,14 @@ PanelWindow {
|
|||
}
|
||||
}
|
||||
M.BarGroup {
|
||||
Layout.fillWidth: true
|
||||
clip: true
|
||||
M.WindowTitle {
|
||||
visible: M.Modules.windowTitle.enable
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
|
||||
// ---- right ----
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ ShellRoot {
|
|||
screen: scope.modelData
|
||||
}
|
||||
|
||||
Overview {
|
||||
BackgroundOverlay {
|
||||
screen: scope.modelData
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue