Wrapping the whole page in a ScrolledWindow meant the sliders themselves could
scroll out of view, which was the wrong shape entirely. The page is plain
stacked cards now, spaced like the home view, and nothing scrolls unless more
than four applications are playing - only that list gets a scroller.
The 'unplugged' marker was appended to the device name and ellipsis ate it on
long names; it is a right-aligned tag now.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
.rowbtn is shared by the audio device rows and the back button, so raising its
font size enlarged the whole audio list. The speaker/mic buttons beside a
slider now use their own .volbtn class; .rowbtn is back to 14px.
The window also now shrinks to each view's natural size instead of keeping the
tallest view's height.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
pactl set-default-sink/source is a no-op under PipeWire - WirePlumber owns
the default and only honours wpctl, which takes node ids from a different
namespace than pactl's indices. The panel now resolves ids from wpctl status
and verifies the default actually moved instead of reporting success blindly.
A device whose ports are all 'not available' cannot become the default at all;
those are greyed and labelled (unplugged) rather than silently failing.
Speaker and mic glyphs on the home sliders 14px -> 19px.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
- the audio page's master rows now match the home page: an icon, a bar and a
percentage, no 'Output'/'Microphone' captions
- GtkStack was vhomogeneous, so every view was padded to the tallest one and
the scrolled list clipped while empty space sat below it. Views size
themselves now, and the scrollers propagate natural height up to a cap.
- power and action row glyphs 15px -> 20px
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
- GtkBox set_border_width shrinks the widget's own background, so the card was
inset 30px while its contents sat flush against the card edge. Padding is css
now: 12px transparent gutter outside, 20px inside. Measured on a virtual
display rather than guessed.
- the panel grabs the seat on map, like rofi, so it keeps keyboard and pointer
focus wherever the cursor is; the grab is released on close
- every control shows its key in the bottom-right: n b v d p w for the tiles,
a c s t for the row beneath, l o z r q for power, m/i to mute, arrows for
volume
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
The panel styled itself at PRIORITY_APPLICATION (600) while
~/.config/gtk-3.0/gtk.css loads at PRIORITY_USER (800) and styles plain
'button'. The user sheet won, so tile backgrounds never applied - but the
more specific '.tile.active .tile-icon { color: #0f0d17 }' did, which is why
icons rendered black on dark tiles. The panel now loads at USER + 1.
- global blur made every translucent window fuzzy, not just the panel: removed
- picom no longer re-rounds the panel; it clipped at 12px over an 18px css
radius and chewed the corners
- active tiles are a tint plus an accent border rather than a solid accent fill
- 10px transparent gutter outside the card, 20px padding inside
- the particles tile was using a television glyph; now an atom
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
- audio view: output/input device switching, master volume + mic, and
per-application streams with their own sliders (pactl sink-inputs)
- icons rendered black because GTK used the desktop font (Noto Sans), which
has no Nerd Font glyphs; Pango's per-glyph fallback then ignored the css
colour. Icon classes now name the font explicitly.
- bspwm drew a focus border around the panel that fought the css rounded
corners: border=off on the rule
- picom now blurs translucent surfaces, so the panel reads as glass rather
than showing the text behind it
- padding and spacing throughout: frame 20px, section margins, card padding
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt
rofi spawns a process per menu, so every volume nudge and every step back
destroyed and recreated the window. That is the flicker, and no tuning fixes
it. The panel is now one GTK window: a GtkStack for views, real GtkScale
sliders wired to wpctl, status on a timer, and a pidfile so super+x toggles
it shut. Escape steps back inside the same window.
Also: picom no longer fades or animates rofi, ::selection is not valid GTK
css, and the network/bluetooth lists no longer print their payload column.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cn3dHfbgNYdbZvzb1b3GQt