* Add CLI --slot unpair for Lightspeed receivers Adds Receiver.force_unpair_slot(), a low-level method that writes the RECEIVER_PAIRING unpair register (action 0x03) for a given slot regardless of cache state, bypassing may_unpair and re_pairs gates. Intended for clearing stale pairings on Lightspeed receivers where Solaar cannot read the slot's pairing info or the device is no longer reachable on RF. Extends the `solaar unpair` CLI with three new flags: --receiver <name> select which receiver to target --slot <N> target a specific slot number directly --dry-run print what would happen without issuing the write The --slot path is gated to Lightspeed receivers only (by receiver_kind) so Unifying/Bolt/Nano behavior is unchanged. It populates the cache first and prints the current slot contents so the user can confirm what is about to be cleared, but does not refuse based on active/offline state — the explicit --slot N is treated as sufficient intent. Verified end-to-end on a C547 dual-slot Lightspeed receiver: stale slot cleared, RECEIVER_INFO sub-registers 0x21/0x31 went to None, connection count register dropped from 2 to 1, running solaar daemon picked up the change in real time via the existing DJ pairing notification hook. Covered by 5 unit tests against a mocked Receiver: empty slot, stale sentinel, active device invalidation, register write failure, closed handle. * Enable GUI unpair for Lightspeed receivers Flip _lightspeed_receiver() to may_unpair: True so the GUI unpair button becomes sensitive for Lightspeed-paired devices, and route the GUI unpair action through _unpair_device(n, force=True) so the unpair register write actually fires instead of short-circuiting to cache invalidation. The previous GUI path called `del receiver[n]`, which dispatches to Receiver.__delitem__ → _unpair_device(n, force=False). On receivers with re_pairs=True (Lightspeed, Nano) that hits the cache-invalidation branch at receiver.py:391 and never writes the unpair register — a "fake unpair" that would have left the slot bound on the hardware even after the button was enabled. With force=True, the GUI now issues RECEIVER_PAIRING action 0x03 for the selected slot, matching the CLI unpair path (cli/unpair.py:39) which has always used force=True. Lightspeed and Unifying unpair behavior are now symmetric: the button is enabled, the confirmation dialog is shown, and the register write is performed. The pair/add flow is untouched: it still uses set_lock(device=0) which lets the receiver firmware pick an empty slot, re_pairs remains True so the listener's silent-replace branch continues to handle re-pair into an occupied devnumber. Verified on dual-slot C547 hardware that pairing into an empty slot preserves the occupant of the other slot. Stale pairings where Solaar can't enumerate the slot (no cached device row to right-click) still require the --slot CLI from the preceding commit — that path is orthogonal to this GUI enablement. * Apply suggestion from @pfps Lightspeed receivers don't appear to re-pair. --------- Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com> |
||
|---|---|---|
| .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