summaryrefslogtreecommitdiff
path: root/README.md
blob: a683d2339c113c530c913d388e05f03bfdac45ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# niri-workspaces-rs

A fast, event-driven workspace indicator for [Waybar](https://github.com/Alexays/Waybar) and [niri](https://github.com/YaLTeR/niri).

<img width="2880" height="1800" alt="image" src="https://github.com/user-attachments/assets/5b1debef-c18d-4ae9-9a82-5655dd4fc913" />

## Features

- **Visual bars instead of numbers** — each window is rendered as a colored bar.
- **Event-driven daemon mode** — keeps a persistent niri socket connection and emits JSON updates only when workspace/window state changes.
- **App-aware coloring** — built-in colors for Chrome (red), Firefox, Discord/Vesktop, Spotify, Todoist, Gmail, and terminals.
- **Terminal app detection via `/proc`** — detects `jcode`, Claude, Codex, and Neovim/Vim running inside terminal windows.
- **Terminal support** — works with Alacritty, Kitty, Ghostty, Foot, and Footclient.
- **Focus semantics** — uses `█` for the focused window, `▌` for the active window on an unfocused workspace, and `|` for other windows.
- **tmux hinting** — uses `¦` for non-focused tmux windows.
- **Cleaner empty workspace handling** — unfocused empty workspaces are hidden; a focused empty workspace is shown as a dim `·`.
- **Named workspace support** — shows the custom workspace name when that workspace is focused; tooltips include only non-empty workspaces.
- **Safer terminal PID detection** — skips `/proc` descendant inference for shared terminal PIDs in cases that can otherwise cause false positives.

## Benchmarks

| Metric | Value |
|--------|-------|
| Memory | 2.5 MB RSS |
| CPU per update | ~1.1ms |
| 80 rapid switches | ~90ms total CPU |

### Comparison

| Approach | CPU per update |
|----------|---------------|
| Bash script | ~340ms |
| Rust + signal | ~12-14ms |
| Rust daemon | **~1.1ms** |

The daemon is **~10-12x faster** than the signal-based approach and **~300x faster** than the original bash script.

## Installation

```bash
cargo build --release
cp target/release/niri-workspaces ~/.config/waybar/
```

If Waybar is already running, restart Waybar or reload the module so the new binary is picked up.

## Waybar Configuration

```json
"custom/workspaces": {
    "exec": "~/.config/waybar/niri-workspaces",
    "return-type": "json",
    "format": "{}"
}
```

No `interval` or `signal` is needed — the daemon outputs JSON whenever relevant niri events occur.

## License

MIT