44 lines
2.1 KiB
Markdown
44 lines
2.1 KiB
Markdown
# 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:<name>` 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.
|