Linux device manager for Logitech devices
Go to file
Ken Sanislo d8422d78d1 Add per-key RGB color painter and replace MAP_CHOICE color validator
Replace the per-key dropdown UI (MapChoiceControl) with a Cairo-rendered
keyboard canvas where users can paint colors directly onto keys.

Editor (lib/solaar/ui/perkey/):
  - Cairo DrawingArea renders cells from a Layout dataclass; bound cells
    take their painted color, unset cells show a diagonal hash whose base
    color matches the device's rgb_zone_* setting.
  - Tools: brush, drag-rectangle, flood-fill (4-adjacent, Paint-style),
    and a directional gradient (line A->B projected across the matrix
    with cells past the endpoints clamped to the endpoint colors).
  - GradientSwatch is the single source of truth for the gradient's two
    colors; the canvas reads from it on each gradient stroke.
  - Palette: GTK ColorButton plus an unset toggle that paints the
    "no change" sentinel (-1).
  - PerKeyEditorDialog auto-sizes from the canvas's size_request, so a
    104-key keyboard opens wide and a 8-LED mouse opens compact.
  - Editor consumes only a narrow PerKeyColorSink protocol; never imports
    from lib/logitech_receiver, preserving the FE/BE seam.
  - Per-device palette state (active + previous color) persists via the
    existing persister under a _palette: prefixed key.

Layouts:
  - ANSI 104-key full-size and TKL keyboard layouts.
  - G502 X family mouse layout (zones 1-8 -> labels A-H).
  - Generic registry: register_layout(feature, matcher, layout). A
    _name_contains() helper builds case-insensitive substring matchers
    against device codename / name. Unknown devices fall back to a flat
    strip of all reported zones.

Validator (open value space):
  - New Range dataclass and MapRangeValidator extending Validator
    directly (kind=MAP_CHOICE for dispatch compatibility). Replaces the
    ChoicesMapValidator on PerKeyLighting -- the named-color universe
    (COLORSPLUS) was rejecting any picker color outside its ~20 entries.
    Other MAP_CHOICE settings are untouched.

Integration:
  - Setting base gains an editor_class string attribute. config_panel's
    _create_sbox resolves it via importlib before the kind dispatch, so
    PerKeyLighting routes to the new editor without a new Kind value.
  - CLI gains a hex/dec parser for open-value MAP_CHOICE settings:
      solaar config <dev> per-key-lighting A 0xFF00FF
  - Diversion rule editor skips Range-valued MAP_CHOICE settings'
    value-selector instead of crashing on the open value space.
  - pycairo declared in install_requires; transitively present on most
    systems but now explicit for pip-from-source installs.

Tests in test_setting_templates.py updated for the new validator.
2026-05-10 17:52:55 -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 Add per-key RGB color painter and replace MAP_CHOICE color validator 2026-05-10 17:52:55 -04:00
po Update sv.po 2026-04-22 00:45:08 -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 release 1.1.19 2026-01-08 12:32:44 -05:00
tests Add per-key RGB color painter and replace MAP_CHOICE color validator 2026-05-10 17:52:55 -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: