Five fixes from analysis of the latest user log:
A. HeadsetMicMute.build() now matches device.product_id as the hex
string ("0B18", "0B19") rather than ints. product_id is set as a
str by hidapi_impl.f"{pid:04X}", so the int comparison was always
False and the suppression never fired. The G522 was still being
asked to write mic-mute on each connect and erroring out 0x0A.
B. RGB-effects probe sub-device feature dump tolerates "unknown:HHHH"
string features. _format_feature now detects that shape explicitly
(and renders 0xHHHH from the suffix) instead of letting int(feat)
raise ValueError mid-iteration and abort the whole table dump.
C. HeadsetActiveEQPreset.write replaces the bare `_value = None` cache
invalidation with a synchronous read(cached=False) so _value is a
real dict before returning. Prevents a UI band-click crash with
'NoneType' object is not subscriptable when a user clicks an EQ
band before the panel re-reads after a preset switch.
D. New probe_advanced_eq_slots() iterates every advertised slot via
getCustomEQ at build time, logs which respond, and caches a list
of (slot, name, bands) on device._advanced_eq_working_slots. The
HeadsetActiveEQPreset selector builds choices only from working
slots and returns None from build() if ≤1 slot responds — G522's
firmware advertises 16 slots but only honors slot 0, so the user
no longer sees a 16-option dropdown they can't actually use.
HeadsetAdvancedEQ.build now reuses the same probe (cached) rather
than the old probe_all_presets path. The legacy alias is kept in
the hidpp20 facade for any external callers still on it.
E. (capture only — no parse change yet) get_advanced_eq_params and
get_advanced_eq_defaults now log raw=<hex> on success too. The
two functions decode the same slot to wildly different bands on
G522 (likely a different header size between getCustomEQ's reply
and getEQDefaults's reply); raw bytes will let us pin down the
exact framing difference and adjust the parser in a follow-up.
Fix path will land alongside docs/features.md notes documenting
the per-call format variation, since other 0x020D headsets may
diverge differently from G522.
|
||
|---|---|---|
| .github | ||
| bin | ||
| docs | ||
| lib | ||
| po | ||
| rules.d | ||
| rules.d-uinput | ||
| share | ||
| tests | ||
| tools | ||
| .coveragerc | ||
| .git-blame-ignore-revs | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .python-version | ||
| CHANGELOG.md | ||
| COPYRIGHT | ||
| LICENSE.txt | ||
| MANIFEST.in | ||
| Makefile | ||
| README.md | ||
| RELEASE.md | ||
| RHEL.md | ||
| Release_Notes.md | ||
| mkdocs.yml | ||
| pyproject.toml | ||
| release.sh | ||
| setup.py | ||
README.md
Solaar
Solaar is a Linux manager for many Logitech keyboards, mice, and other devices that connect wirelessly to a Unifying, Bolt, Lightspeed or Nano receiver as well as many Logitech devices that connect via a USB cable or Bluetooth. Solaar is not a device driver and responds only to special messages from devices that are otherwise ignored by the Linux input system.
More Information - Usage - Capabilities - Rules - Manual Installation - Known Issues
Solaar supports:
- pairing/unpairing of devices with receivers
- configuring device settings
- custom button configuration
- running rules in response to special messages from devices
For more information see the main Solaar documentation page. -
Installation Packages
Up-to-date prebuilt packages are available for some Linux distros (e.g., Fedora) in their standard repositories. If a recent version of Solaar is not available from the standard repositories for your distribution, you can try one of these packages:
- Arch solaar package in the extra repository
- Ubuntu/Kubuntu package in Solaar stable ppa
- NixOS Flake package in Svenum/Solaar-Flake
Solaar is available from some other repositories but may be several versions behind the current version:
- a Debian package, courtesy of Stephen Kitt
- a Ubuntu package is available from universe repository
- a Gentoo package, courtesy of Carlos Silva and Tim Harder
- a Mageia package, courtesy of David Geiger