A read was a lock, a hash of the path and a conversion (a colour parsed from its text),
160 to 570 ns in the unoptimised shell, a few hundred a frame with a card open. Now an
atomic load and a copy while nothing changed. Every write to the settings goes through
change(), which bumps the generation the caches compare against
- A workspace Hyprland makes for a switch (createworkspacev2) grows into the row
over the slide instead of appearing at full size; the window keeps the full
room meanwhile.
- Every config.toml save restarted the colour Animation, and Animation::new
runs its clock even from a colour to itself, so every window redrew for 0.4 s
per save. The colours now only fade when they change.
- The file watch could read config.toml halfway through the shell's own save
and reset settings to their defaults. Saves and rereads share one lock, the
file is written to a new file and renamed over, and the shell's own saves
are skipped by the watch.
- A song change or new player only pops the island when the focused window
isn't that player's app (parse::same_app, tested).
appearance.surface.design picks the look (chips in the config window); each
design's opacity, rim and light are settings. surface::shell now draws the
island, idle pill, workspace and tray pills, tray menu, control centre and
popup, so a design applies everywhere. On see-through glass faces fade with
.opacity(). Shell text settings can list their allowed words (chips).
All tunable values (sizes, timings, text sizes, colours, polls, equalizer
presets and bands, hotspot, extra output) are settings declared once in
config.rs, read from ~/.config/amane/config.toml, applied live on save.
shell.conf's four values move over on first start.
settings.rs: a normal window (control centre gear, or ipc config) with a
page per part, a page per Hyprland category, search and reset per row.
hypr.rs: Hyprland's options from hyprctl descriptions/getoption, applied
with hl.config and kept in ~/.config/hypr/amane.lua.