# Changelog All notable changes to this project are documented in this file. ## [Unreleased] ### Added - **`active_window_volume`** knob action — controls the volume of whatever application currently has window focus. No `target` is needed; the focused window is resolved dynamically on every turn. - **`mute_active_window`** button action — toggles mute for whatever application currently has window focus. - **`mute_group`** button action — toggles mute for multiple applications at once (`targets = ["app1", "app2"]`), syncing every matched stream to the same mute state so repeated presses can't leave the group half-muted. - **`binary:` needle syntax** for `app_volume`/`group_volume`/ `app`-matching button targets. Some applications (generic Electron apps that don't set their own PipeWire identity, e.g. Feishin) report the same `application.name` as an unrelated app and are only distinguishable by `application.process.binary`. A `binary:`-prefixed needle matches that field exactly instead of substring-matching name-or-binary, avoiding cross-talk between knobs/groups that would otherwise both match the generic name. - New dependency: `kdotool` (AUR), required for focused-window detection under KWin/Wayland. ### Changed - `PulseController.set_app_volume()` / `get_app_volume_norm()` now share a single `stream_matches()` helper (in `audio.py`) instead of duplicating the name/binary substring check inline, and skip the MPRIS/`playerctl` lookup for `binary:`-prefixed needles (no meaningful player name in that case). - `reapply_app_volumes()`'s periodic PA-correction loop uses the same `stream_matches()` helper, fixing a bug where two knobs/groups whose needles both matched a generic app name (e.g. "chromium" matching both the real browser and a bare-Electron app reporting as "Chromium") would fight over that stream's volume every ~1s. - Web UI's TOML serializer (`ui/server.py`) now writes `targets = [...]` for `mute_group` buttons, mirroring how knobs already serialize `group_volume`. ## [2.2.2] - previous release See git history prior to this file's introduction.