feat(waybar): right-click volume opens a floating pwvucontrol mixer
All checks were successful
Check / eval (push) Successful in 2m55s

Right-clicking the Waybar volume module now opens pwvucontrol (per-app
mixer); left-click still mutes. Adds:

- on-click-right in waybar.nix + all four whole-swap jsoncs (parity)
- hyprland.nix: the config's first windowrule block — float + center the
  mixer (pwvucontrol, with pavucontrol as a fallback class); normal-
  priority list so a downstream windowrule concatenates
- pwvucontrol in the template home.packages

pwvucontrol is PipeWire-native + GTK4/libadwaita, so it themes via the
portal color-scheme like Amberol. app-id verified from the built package.
This settles the windowrule pattern/placement; item 41 is now just
broadening the float set. Right-click→float→center is a V3 session check.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 22:31:00 +01:00
parent 239c3c4551
commit 28a28e05d3
10 changed files with 53 additions and 24 deletions

View File

@@ -257,32 +257,16 @@ summer-day/summer-night) — all deliberately set `scrollbar { width:0 }`
today, each needs a per-theme handle width/colour. Payoff is V3-only today, each needs a per-theme handle width/colour. Payoff is V3-only
(rendering), so it wants a themed session, not a headless edit. (rendering), so it wants a themed session, not a headless edit.
### 35. Right-click volume → audio control app
(Raised by Bernardo, 2026-07-07 — item 5.) Right-click the Waybar
`pulseaudio` module to open a mixer in a floating window. Wire
`on-click-right` in `waybar.nix` AND the whole-swap jsoncs (parity rule);
add a Hyprland `windowrulev2 = float` for the mixer. Ship the mixer in
the template's `home.packages`.
_Scoped 2026-07-07 (held for item 41):_ the on-click-right wiring is
trivial, but the float rule needs the windowrule infrastructure that
**does not exist yet** — there are currently **zero** `windowrule`s in
the whole config, and item 41 is where that set gets designed list-first
(Bernardo's call). So this is gated on 41, not independently shippable
without inverting his 41→35 plan. **Mixer recommendation:** `pwvucontrol`
(PipeWire-native, GTK4/libadwaita → themes via the portal color-scheme
like Amberol; the distro is already wpctl/PipeWire). app-id for the float
rule: `com.saivert.pwvucontrol`. (`pavucontrol` is the GTK3 fallback.)
### 41. Floating-window audit ### 41. Floating-window audit
(Raised by Bernardo, 2026-07-07 — item 11.) Decide which windows should (Raised by Bernardo, 2026-07-07 — item 11.) Decide which windows should
open floating by default (config dialogs, mixer, file-chooser portals, open floating by default (config dialogs, file-chooser portals,
calculators, etc.) and add the `windowrulev2 = float` rules in calculators, etc.) and add the `windowrule` float rules in
`hyprland.nix`. Enables items 35/36b. Produce the list first, then the `hyprland.nix`. Enables item 36b. Produce the list first, then the rules.
rules. _Note 2026-07-07:_ the **first** `windowrule` block now exists (added by
_Note 2026-07-07:_ this establishes the **first** windowrule block in the item 35 — the mixer floats + centers), so the pattern + placement are
config (none exist today) — so it also owns the decision of where the set. 41 is now purely "broaden the set" — audit the template app suite,
rules live and their format. Once the pattern's set, 35's mixer float and pick the dialog/utility classes, append rules. Still list-first
36b fall out of it. (Bernardo's taste on what should float), so it wants his review.

View File

@@ -236,6 +236,11 @@ QA machine), the **T14s** (webcam case).
unchanged (the bar still reserves its space). Accepted trade-off unchanged (the bar still reserves its space). Accepted trade-off
of `layer: bottom`: a floating window dragged over the top strip of `layer: bottom`: a floating window dragged over the top strip
can now overlap the bar — confirm that's the only regression. can now overlap the bar — confirm that's the only regression.
- [ ] **Right-click volume → floating mixer** (iteration #62, item 35) —
after `home-update` + relogin: right-click the Waybar volume module
opens pwvucontrol as a floating, centered window (not tiled);
left-click still mutes. Verify across a whole-swap theme too
(summer/boreal/executive-slate) since the jsoncs got the same wiring.
- [ ] **Window focus on arrows** (iteration #61) — after `home-update` + - [ ] **Window focus on arrows** (iteration #61) — after `home-update` +
relogin: SUPER+←/→/↑/↓ move focus between tiled windows; SUPER+H/J/K/L relogin: SUPER+←/→/↑/↓ move focus between tiled windows; SUPER+H/J/K/L
no longer move focus; SUPER+? cheatsheet shows the arrow glyphs. no longer move focus; SUPER+? cheatsheet shows the arrow glyphs.

View File

@@ -17,6 +17,25 @@ Template:
--- ---
## 2026-07-07 — Right-click volume → floating mixer (iteration #62, item 35)
- **Task:** BACKLOG item 35 — right-click the Waybar volume module to
open a mixer in a floating window. (Bernardo re-launched /loop after I'd
flagged it as gated on 41 — read as "handle it," so I did 35 fully and
re-scoped 41 to just broadening the float set.)
- **Chose pwvucontrol** (PipeWire-native, GTK4/libadwaita → themes via the
portal like Amberol; distro is already wpctl/PipeWire). Verified app-id
`com.saivert.pwvucontrol` from the built package.
- **Changes:** (1) `waybar.nix` pulseaudio `on-click-right = "pwvucontrol"`
+ parity into all four whole-swap jsoncs (summer-day/night, boreal,
executive-slate). (2) `hyprland.nix` — the config's **first** `windowrule`
block: `float` + `center` for the mixer classes (pwvucontrol + pavucontrol
fallback), normal-priority list so downstream concatenates. (3)
`pwvucontrol` added to the template `home.packages`.
- **Verified:** V0 green; `nix eval` of the homeConfiguration confirms the
windowrule regex renders with correct single-backslash escaping
(`class:^(com\.saivert\.pwvucontrol|…)$`). The right-click→float→center
interaction is a V3 session check (queued). Item 41 now = broaden the set.
## 2026-07-07 — Window focus: vim keys → arrows (iteration #61, direct request) ## 2026-07-07 — Window focus: vim keys → arrows (iteration #61, direct request)
- **Task:** Bernardo — switch window navigation from vim-style - **Task:** Bernardo — switch window navigation from vim-style
SUPER+H/J/K/L to SUPER+arrow keys. SUPER+H/J/K/L to SUPER+arrow keys.

View File

@@ -438,6 +438,18 @@ in
background_color = rgb c.base; background_color = rgb c.base;
}; };
# Window rules. This is the config's first float rule; item 41 will
# broaden the set (dialogs, portals, …) once that audit lands. For
# now: the audio mixer opened by right-clicking the Waybar volume
# module (item 35) floats + centers instead of tiling. Matches
# pwvucontrol (the template's mixer) and pavucontrol if swapped in.
# Normal-priority list like `bind`/`exec-once` below, so a downstream
# `windowrule = [...]` concatenates rather than replaces.
windowrule = [
"float, class:^(com\\.saivert\\.pwvucontrol|org\\.pulseaudio\\.pavucontrol|pavucontrol)$"
"center, class:^(com\\.saivert\\.pwvucontrol|org\\.pulseaudio\\.pavucontrol|pavucontrol)$"
];
# Rendered from ./keybinds.nix (the cheatsheet reads the same list), # Rendered from ./keybinds.nix (the cheatsheet reads the same list),
# plus the generated per-workspace binds. Like exec-once above this # plus the generated per-workspace binds. Like exec-once above this
# stays a normal-priority list, so a downstream `bind = [...]` # stays a normal-priority list, so a downstream `bind = [...]`

View File

@@ -172,6 +172,10 @@ let
format-muted = "󰝟"; format-muted = "󰝟";
format-icons.default = [ "󰕿" "󰖀" "󰕾" ]; format-icons.default = [ "󰕿" "󰖀" "󰕾" ];
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
# Right-click → the full mixer (per-app volumes) in a floating window
# (item 35). pwvucontrol ships in the template suite; the Hyprland
# windowrule floats it. Keep in sync with the whole-swap jsoncs.
on-click-right = "pwvucontrol";
}; };
# Idle inhibitor (caffeine): click 󰾪 → 󰅶 to hold the screen awake — # Idle inhibitor (caffeine): click 󰾪 → 󰅶 to hold the screen awake —

View File

@@ -81,6 +81,7 @@
inkscape # vector graphics inkscape # vector graphics
mpv # media player mpv # media player
amberol # music player (local library; streaming → spotify below) amberol # music player (local library; streaming → spotify below)
pwvucontrol # PipeWire volume mixer (right-click the Waybar volume)
# ── More apps — uncomment to add ───────────────────────────────── # ── More apps — uncomment to add ─────────────────────────────────
# Web browsers # Web browsers

View File

@@ -116,6 +116,7 @@
] ]
}, },
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "{desc} | {volume}%" "tooltip-format": "{desc} | {volume}%"
}, },
"battery": { "battery": {

View File

@@ -104,6 +104,7 @@
] ]
}, },
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "{desc} | {volume}%" "tooltip-format": "{desc} | {volume}%"
}, },
"custom/powerprofile": { "custom/powerprofile": {

View File

@@ -51,6 +51,7 @@
"default": ["", "", ""] "default": ["", "", ""]
}, },
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "Playing at {volume}%" "tooltip-format": "Playing at {volume}%"
}, },

View File

@@ -52,6 +52,7 @@
"default": ["", "", ""] "default": ["", "", ""]
}, },
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "pwvucontrol",
"tooltip-format": "{desc} | {volume}%" "tooltip-format": "{desc} | {volume}%"
}, },