Commit Graph

6 Commits (d6cb0909ae674619a5ada8925b470a9b6dd28ea4)

Author SHA1 Message Date
Amir Alexander Abdelbaki 72e0fa8edc fix(hyprdrive,hyprlua): keep the last tab clear of the floating close button
.sb-tabbar now reserves 64px on the right, the same way .sb-header already
does for the title: the ✕ is a Gtk.Overlay child, so it claims no layout
space and the tab row grew straight under it once the row got wide enough
(the "General Settings" pill was overlapping the button's circle).

Also documents, next to `config vicinae` in hyprdrive's updater.conf, that
the cosmonaut.toml this deploys to ~/.config/vicinae/ is inert — vicinae only
reads named themes from ~/.local/share/vicinae/themes/, and silently falls
back to its default grey theme when the file isn't there. That is exactly
what happened on this machine: the theme was added after hyprdrive.sh last
ran, so the launcher had been rendering the stock grey palette.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 18:41:56 +02:00
Amir Alexander Abdelbaki f500dd550e feat(hyprdrive,hyprlua): vertical mixer meters with the live peak column inside the fill
The per-channel volume meters are now vertical faders (Gtk.Scale, inverted so
loud is up) instead of horizontal sliders, and the live peak indicator moved
out of its own bar above the card into the meter itself: a narrow violet
column Cairo-drawn inside the trough, so one glance reads both "what the
volume is set to" (the fill) and "what is actually reaching the mix" (the
column inside it).

  - ui/peakbar.py is a DrawingArea rather than a Gtk.LevelBar: it has to grow
    bottom-to-top over the same span as the scale's highlight, minus the
    half-slider inset, and it sits in a Gtk.Overlay with can_target=False so
    the scale underneath still gets every click and drag.
  - ui/meter.py draws the value as its own label and drops the 100% mark;
    either one would push the trough off-centre under the overlaid column.
    The channel label is always appended (empty for mono) so a lone meter and
    a split L/R pair keep the same trough height inside the card's stack.
  - ui/card_base.py fans one peak monitor out to every meter of the card —
    parec reports one mixed level per target, not a per-channel one.
  - The trough's empty portion is transparent now (an idle meter and a silent
    monitor both read as "nothing here"), and supersonic-booster's fill gets
    the suite's emitted-magenta glow. Both stylesheets re-assert the
    transparent background at class specificity: the CyberQueer theme's
    `* { background-color: #1a1a1a }` was otherwise painting a dark stripe
    straight through the fill where the peak column sits.

hyprlua's audio-panel is regenerated via regen-audio-panel.sh; its plain
stylesheet stays flat and glow-free by design, with @accent as the fill.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 18:22:52 +02:00
Amir Alexander Abdelbaki 55d443ecdb feat(hyprdrive,hyprlua): add a Cards tab, move profile switching off device cards
Adds a fifth mixer tab, Cards: one row per pactl card (onboard audio, USB
headsets, HDMI, Bluetooth) with just its profile dropdown (Analog Stereo
Duplex, Pro Audio, Off, etc.).

Profile is a card-level setting, not a per-device one — a single card can
back a device in both Output and Input Devices at once, and switching its
profile can make either side appear or disappear entirely. It used to live
on individual DeviceCards in both tabs, which was confusing (same card,
edited from two places) and is exactly what pavucontrol avoids by giving
profiles their own "Configuration" tab. Pulled it out of DeviceCard/
OutputTab/InputTab (which also drops their now-unneeded list_cards() fetch)
and into a new ui/profile_card.py + ui/cards_tab.py.

hyprlua's audio-panel picks this up via regen-audio-panel.sh, unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TkkH9eiCBfpWysUXAD9bDG
2026-07-29 16:55:29 +02:00
Amir Alexander Abdelbaki ed43cd2ac7 feat(hyprdrive,hyprlua): mirror output-device dropdown with input-device on Applications tab
Each app card in the mixer panel's Applications tab now also shows an Input
dropdown next to Output, letting you re-route that app's own microphone
stream (pactl move-source-output) the same way Output already re-routes its
playback stream. Matches an app's sink-input to its source-output via
application.process.binary (falling back to name) — the same client tags
both when an app plays and records, e.g. Discord. Apps with no matching
recording stream get the dropdown disabled rather than hidden, so card
layout stays consistent across the row.

hyprlua's audio-panel picks this up via regen-audio-panel.sh, unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TkkH9eiCBfpWysUXAD9bDG
2026-07-29 16:42:07 +02:00
Amir Alexander Abdelbaki 516adeb5ae fix(hyprdrive,hyprlua): anchor the audio mixer panel top-right and shrink it
Layer-shell surfaces can only anchor to a screen edge with a margin, not to
another process's widget, so this can't truly follow the invoking volume
button — but every bar variant in this repo (station-bar, eww/eww-touch/
eww-nobattery) keeps its volume control in the top-right zone, so anchoring
there approximates "under the control that opened it" well enough. Also
shrunk the panel (900px -> 460px, smaller cards/meters/tab height) so it
reads as a compact popover instead of a full-width mixer.

hyprlua's audio-panel is regenerated via regen-audio-panel.sh; its
hand-maintained plain theme seed (audio-panel-theme/style.css) got the same
sizing tweaks by hand since the regen script doesn't touch it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TkkH9eiCBfpWysUXAD9bDG
2026-07-29 16:04:41 +02:00
Amir Alexander Abdelbaki bda4640b54 feat(hyprdrive,hyprlua): add supersonic-booster/audio-panel PipeWire mixer panel
A new layer-shell mixer panel with four tabs (Applications / Input Devices /
Output Devices / General Settings): per-app and per-device volume meters with
an independent left/right toggle, mute, live parec-based amplitude bars (so a
silent stream is visually distinct from a quiet one), output-device routing,
card profile switching (pro-audio vs stereo duplex etc.), and default-device
pickers. Backed by pactl -f json + pactl subscribe over pipewire-pulse
(verified against this box's real pactl; wpctl was dropped for lacking
per-channel volume and profile verbs).

hyprdrive gets the hologram-styled original (supersonic-booster); hyprlua's
plain-themed audio-panel is generated by a new
desktopenvs/hyprlua/scripts/regen-audio-panel.sh, extending the existing
regen-beacon.sh derivation pattern rather than hand-duplicating the app.

Wired into both DEs: Super+Shift+S keybind, autostart, config-updater,
apply-theme.sh, and the respective bars (station-bar's volume badge now opens
the panel; eww/eww-touch/eww-nobattery's volume slider does too, replacing
the old pavucontrol launch).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TkkH9eiCBfpWysUXAD9bDG
2026-07-29 15:41:57 +02:00