Solaar's old rotating sw_id (cycling 0x2..0xF on every request) eats HID++ replies addressed to other userspace clients sharing the same device, because reply matching is feature + function + sw_id only and Solaar eventually claims every value in the range. Cooperative use with OpenRGB, LGSTrayEx, etc. is impossible by construction. Pick one value and hold it. Other tools can pick a different one and filter Solaar's traffic out of their reply stream cleanly. 0x07 OpenRGB 0x0A LGSTrayEx 0x0D Logitech G HUB (host-side) 0x0F Logitech firmware (sub-device self-enumeration on wired) 0x0B is unallocated among the above and keeps the high bit set so replies stay trivially distinguishable from notifications (sw_id=0). Audit of why nothing breaks: - Reply matcher in request() still works — Solaar's request loop is synchronous per device, so (feat, func, fixed_sw_id) is enough to identify the in-flight request's reply. The rotation never bought uniqueness across processes; it only avoided self-collision across successive synchronous requests, which doesn't exist as a problem. - Ping reply identification uses a separate random mark byte (getrandbits(8) appended to the request data, checked at byte 4 of the reply). That randomization is unchanged. - Stale-reply protection comes from _read_input_buffer draining the device handle before every new write. A delayed reply from a prior timed-out request gets routed to the notification hook, not mistaken for the current request's reply — independent of whether sw_id rotates. - The "separate results and notifications" claim in the old docstring was misleading: true notifications carry sw_id=0 per the HID++ spec. What actually keeps replies distinguishable is the high bit being set, which 0x0B preserves. - Centurion bridge in device.py uses the same sw_id-as-correlation- token pattern with the same synchronous-per-device flow; fixed sw_id works identically. |
||
|---|---|---|
| .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