- 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).
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.
Switching from a workspace with the bar shown to a fullscreen one slid
the bar away while the workspace peek slid in from hidden, so the pill
dipped and came back. A peek now starts from the part's current
position, so a shown pill stays still for the peek and then leaves.
The tray, which peeks don't show, slides away on its own.
Tested on DP-2 (2 -> 3 and back), frame by frame.
edge::spacer: a full-width, empty, click-through Background layer as tall
as the pills reach (TOP_GAP + COMPACT_H = 44 px) with Zone::Reserve.
Hyprland keeps tiled and maximised windows below it and lets fullscreen
windows cover it, so space is reserved exactly where the bar stays.
Verified: reserved 0 44 0 0 on all monitors, a tiled window moved from
y=636 to 680, a fullscreen one still covers 1920x1080, idle 0 frames.
- tray.rs: the shell serves org.kde.StatusNotifierWatcher (only when no other
watcher runs) and is its host; icons from the theme or from IconPixmap
(png.rs, a stdlib png writer); left/middle/right click and scroll; dbusmenu
menus drawn in the island's look; tray IPC verbs for testing
- edge.rs: the bar hides only on monitors showing a fullscreen window, driven
by Hyprland's event socket; peeks of the workspaces (with the disc sliding)
and the island (song change, new player), with a pop on the island
- prompt.rs: Ethernet details popup (addresses, gateway, DNS, MAC copyable)
- map.rs: 1100x560 maps, every other node a ring further in
- tools/fake_tray.py: a fake tray app, by bus name or by path
- prompt.rs: popup for Wi-Fi passwords, Bluetooth PINs/passkeys/codes, saved
passwords (Copy through wl-copy on stdin) and failure reasons; joins through
iwctl, pairs through a bluetoothctl session; only popups with a field take
the keyboard (an exclusive grab let stray keystrokes close failure popups)
- menus: the panel is the only shape; the menu window fades its content in
once the panel has taken the menu's size
- maps: clicking the bubble searches again (iwctl scan, bluetoothctl scan)
with rings running out from the click
- Ethernet tile and pill icon from sysfs; link speed badges (Ethernet speed,
Wi-Fi RxBitrate from iwd diagnostics, at most once a minute)
- edge.rs: bar hidden until the pointer rests on the top edge; nothing is
read or drawn while hidden
- IPC: control wifi join|password|search, bluetooth pair|connect|search,
prompt answer|cancel, status prompt=