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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
# waybar-theme-udt
A waybar bar for DP-3, themed by [unified-desktop-theme][udt] and drawn with
icons from the desktop's own icon theme rather than font glyphs.
[udt]: ../unified-desktop-theme
## Goal
Three things at once:
- **No font glyphs.** Every module that shows a symbol shows a real icon from
`Material-Black-Plum-Suru`, the theme GTK already uses. Icons keep their own
colours, because that is what every other application on this desktop shows.
- **Colours from udt.** Pill backgrounds, text and states resolve from
`palette/roles-<scheme>.conf`, so switching scheme recolours this bar with
everything else.
- **Pill clusters with transitions.** The grouped-capsule layout of `idea1.png`
with the hover and state transitions of `idea2.png`.
The current bar on DP-1 is untouched. This one installs alongside it and is
pointed at DP-3.
## Layout
┌ left ──────────────────────────────┐ ┌ center ┐ ┌ right ─────────────────────┐
[◆] [📅 Wed 15/09] [🕑 14:32] [1..8] [●●] [ open apps ] [🔊 62%] [tray] [⏻] [🇮🇹]
launcher date time workspaces vm taskbar volume tray present lang
Each bracket is one pill. Neighbouring pills in a cluster share a background
and weld together with asymmetric corner radii; clusters are separated by
transparent gaps, so the bar reads as groups rather than a continuous strip.
### Modules
| Position | Module | Icon source | Notes |
| --- | --- | --- | --- |
| left | `custom/launcher` | `slackware.svg`, shipped here | Accent background, the one always-coloured pill. Opens the quickshell drawer. |
| left | `clock#date` | `x-office-calendar` | Icon then text. Calendar tooltip kept. |
| left | `clock#time` | `clock` | Icon then text. |
| left | `hyprland/workspaces` | eight themed icons, via CSS | See below. |
| left | `custom/vmdot` | coloured dots | Dots keep their shape; colours move to roles. |
| center | `wlr/taskbar` | `icon-theme` config key | Per-window application icons. |
| right | `group/wireplumber` | `image` module | Drawer group kept as it is today. |
| right | `tray` | application-provided | |
| right | `idle_inhibitor` | `image` module | Presentation mode. |
| right | `image#lang` | `flag-it.svg` / `flag-gb.svg`, shipped here | An `image` module: `hyprland/language` styles as `#language` only, with no per-language class, so a flag cannot be selected in CSS. |
Dropped from the current bar: `custom/breaktimer`, `custom/mail`,
`custom/privacy_dots` stays only if you want it on this bar too (it is
currently listed; say if it should follow the others out). No battery, no
temperature, no cpu, no memory, no backlight: this is a desktop.
Clock is the one module that stays text. An icon cannot say 14:32; the icon
sits before the text, which is what makes it match the rest.
### Workspace icons
| WS | Icon | Was |
| --- | --- | --- |
| 1 | `web-browser` | browser glyph |
| 2 | `utilities-terminal` | terminal glyph |
| 3 | `text-editor` | code glyph |
| 4 | `network-server` | matches the quickshell drawer's VM tile (`U+F233`, Font Awesome `server`) |
| 5 | `document-edit` | pen on a document: the alternate text editor lives here |
| 6 | `applications-graphics` | graphics glyph |
| 7 | `internet-chat` | chat glyph |
| 8 | `input-gaming` | joypad: games and media players |
All eight resolve in `Material-Black-Plum-Suru` today.
## How icons reach the bar
Three mechanisms, because waybar offers three and no single one covers
everything. This is the part worth reading before changing anything.
**1. Native `icon-theme` (taskbar, tray).** `wlr/taskbar` takes `icon-theme`
and `icon-size` outright. Today it asks for `Papirus`, **which is not
installed**, so GTK has been silently falling back. Pointing it at
`Material-Black-Plum-Suru` is a bug fix, not a preference.
**2. The `image` module (volume, presentation mode).** `image` runs `exec` and
expects `$path\n$tooltip` on stdout, so a small script maps state to an icon
name, resolves it through the GTK icon theme, and prints the path. One `image`
module is one icon, so a five-state volume indicator is one module plus one
script, not five modules.
**3. CSS `background-image` (workspaces).** Workspace buttons come from a
single `hyprland/workspaces` module and `format-icons` takes text, not paths.
Faking the strip with eight `custom` modules would lose click-to-switch and
the active/urgent states, so instead the real module keeps its behaviour, its
labels are emptied, and each button gets an icon through
`#workspaces button:nth-child(n) { background-image: url(...) }`.
The consequence, stated plainly: **the eight workspace icon paths live in the
stylesheet, not in the config.** Changing a workspace icon means editing CSS.
### Why the icons cannot follow the accent
2466 of the 5169 panel icons in `Material-Black-Plum-Suru` carry a hardcoded
`oomox` gradient (`#a08fbf` to `#5a33a3`) and seven further named gradients
each. They are not monochrome and not recolourable by CSS `color`. So icons
show their own colours and do not track the scheme, which is the intended
behaviour here: they match every other application on the desktop.
The two icons this repo ships are the exception. `slackware.svg` (from
Simple Icons) and the two flags are single-path monochrome, so `slackware.svg`
is tinted with the udt accent by a one-line `fill` substitution at install
time. The flags keep their national colours.
## Repository layout
Modular, one file per module, mirroring the current setup:
config.jsonc entry point, `include`s every module file
modules/
clock.jsonc clock#date and clock#time
hyprland/
workspaces.jsonc
language.jsonc
custom/
launcher.jsonc
vmdot.jsonc
extras/
taskbar.jsonc
tray.jsonc
wireplumber.jsonc
image/
idle_inhibitor.jsonc presentation mode, via `image`
styles/
style.css entry point, imports the rest in order
theme.css GENERATED by udt-palette, gitignored
fonts.css
global.css #waybar, tooltip, button base rules
pills.css the cluster geometry and transitions
modules.css per-module rules, including workspace icons
icons/
slackware.svg carries @ACCENT@, substituted on install
flag-it.svg
flag-gb.svg
bin/
wb-icon state to icon path, for the `image` modules
vms_dots.sh moved here from ~/bin, symlinked back
privacy_dots.sh moved here from ~/bin, symlinked back
install.sh
LICENSE
README.md
Wildcard `include` is broken in waybar 0.14, so `config.jsonc` lists every
module file explicitly. That is a waybar limitation, not a choice.
## Palette integration
This repo is a **consumer** of udt: it holds the bar, udt holds the colours.
`styles/theme.css` is generated by `udt-palette` and gitignored, exactly like
every other generated file in that repo. Generating it needs two changes on
the udt side:
**A new `[waybar]` role block.** The current one names `temperature`,
`memory`, `cpu`, `backlight` and `battery`, none of which exist on this bar.
The new roles are `launcher`, `workspaces`, `vmdots`, `taskbar`, `volume`,
`tray`, `present`, `lang`, `date`, `time`, plus the existing `main_*`,
`hover_*` and `outline`.
**Added to all nine `roles-*.conf`.** `udt-palette --selftest` enforces that
every scheme defines the same role set, so a role added to one file and not
the rest fails the check. That is the check doing its job.
Dot colours come from the existing `[state]` roles: `success` for a running
VM, `warning` for paused, `critical` for crashed, `info` for saved, and
`fg_faint` for shut off. Both dot scripts currently hardcode `#30D158`,
`#FFD60A`, `#FF9F0A`, `#9B32FA` and `#6E6E73`; they will read a generated
colour block instead.
## Install
`install.sh` follows udt's conventions: symlink what this repo owns
canonically, copy what another application owns, guard every reload.
- Module and style files are **symlinked** into `~/.config/waybar-udt/`, so the
repo cannot drift from what is installed.
- `icons/slackware.svg` is **generated** into place with `@ACCENT@` substituted,
the same way udt generates `launcher.rasi`.
- `bin/vms_dots.sh` and `bin/privacy_dots.sh` are symlinked to `~/bin/`,
replacing the copies that live there now. **The originals are backed up
first**: they are the only copy and are not currently in any repository.
- The bar is **not** started and `~/.config/waybar` is **not** touched. Running
it is one command, printed at the end, so DP-1's bar keeps working until you
choose otherwise.
Reload is `killall -SIGUSR2 waybar`, and `reload_style_on_change` is already on.
## Verification
Per udt's own rule, visual claims are measured, not reasoned about:
grim -o DP-3 /tmp/shot.png
`wb-icon` gets one runnable self-check: every icon name the bar asks for must
resolve in the icon theme, so a missing icon fails loudly at install time
rather than rendering as a blank pill.
## Open questions
1. `custom/privacy_dots` is in the keep list but was not in the ten modules you
named. On this bar or not?
2. Licence: GPLv2-only unless you say otherwise.
|