Linux device manager for Logitech devices
Go to file
Ken Sanislo 3e88c73645
base: fix sw_id at 0x0B instead of rotating 0x2..0xF (#3218)
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.
2026-05-14 15:08:56 -04:00
.github doc: instructions on running solaar show in 1.1.18 2025-12-21 18:01:53 -05:00
bin Remove Python 2 specific path handling 2025-01-01 10:18:44 -05:00
docs docs: document haptic capability 2026-04-18 16:31:17 -04:00
lib base: fix sw_id at 0x0B instead of rotating 0x2..0xF (#3218) 2026-05-14 15:08:56 -04:00
po po: updating a few German strings (#3212) 2026-05-12 09:49:29 -04:00
rules.d docs: document change to use uinput only 2026-03-08 20:58:43 -04:00
rules.d-uinput Apply uaccess rules on all actions other than remove 2025-09-08 10:11:52 -04:00
share PerKey palette: replace hashed unset swatch with palette-off icon 2026-05-12 12:51:36 -04:00
tests base: fix sw_id at 0x0B instead of rotating 0x2..0xF (#3218) 2026-05-14 15:08:56 -04:00
tools Add installation guide for Solaar on RHEL 10 (#3158) 2026-03-08 20:54:31 -04:00
.coveragerc Test coverage: Fix keysyms to be visible (#9) 2024-10-11 07:42:38 -04:00
.git-blame-ignore-revs git-blame-ignore-revs: add pre-commit bulk change 2020-07-07 16:10:37 +01:00
.gitignore Ignore macOS junk files and pipenv config 2025-01-02 17:18:39 -05:00
.pre-commit-config.yaml dist: modify pre-commit args to make ruff change files 2024-02-21 16:06:22 -05:00
.python-version dist: update pre-commit versions and python version 2022-11-23 14:20:56 -05:00
CHANGELOG.md release 1.1.19 2026-01-08 12:32:44 -05:00
COPYRIGHT clarify license status; fix debian packaging copyight notice 2019-12-24 18:53:43 +00:00
LICENSE.txt Simplify name of license file 2024-03-02 18:15:56 -05:00
MANIFEST.in Simplify name of license file 2024-03-02 18:15:56 -05:00
Makefile tools: add python3-devel to install-dnf in Makefile 2025-12-20 12:31:17 -05:00
README.md docs: make known issues more prominent 2025-10-23 08:16:05 -04:00
RELEASE.md Rename changelog.md to all capitals 2024-03-02 18:15:56 -05:00
RHEL.md Improve RHEL installation guide and add automated install example (#3162) 2026-03-10 07:43:25 -04:00
Release_Notes.md release: drop testing of Python before 3.13 2025-12-12 04:55:14 -05:00
mkdocs.yml docs: update files shown in documentation 2025-10-23 09:28:52 -04:00
pyproject.toml ruff: Force single line imports 2024-03-13 15:41:21 -04:00
release.sh misc: Use PATH instead of hardcoded absolute paths (#3014) 2025-11-04 03:28:10 +09:00
setup.py Add per-key RGB color painter and replace MAP_CHOICE color validator 2026-05-10 17:52:55 -04:00

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

codecov License: GPL v2

 

 

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:

Solaar is available from some other repositories but may be several versions behind the current version: