Commit Graph

65 Commits

Author SHA1 Message Date
Ken Sanislo ba0b45df22
device: Support per-slot unpair on Lightspeed receivers (CLI + GUI) (#3183)
* 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>
2026-04-17 09:34:58 -04:00
Peter F. Patel-Schneider 705279097f cli: allow to change LED settings 2025-12-21 18:03:53 -05:00
Peter F. Patel-Schneider e999b12246 receiver: add info about new lightspeed receiver 2025-12-17 15:52:17 -05:00
MattHag 1a3f4dab36 Speedup lookup of known receivers
Refactor get_receiver_info. Replacing data structure of known receivers
to avoid for loop, when an efficient dictionary lookup is possible.

Related #2273
2025-01-01 11:33:07 -05:00
MattHag 8d0672ac3c base_usb: Add external interface
Clean up, type hint and tests base_usb and related modules.
2024-10-11 07:42:38 -04:00
MattHag 2442299539 base: Simplify receiver info retrieval
- Remove comments with unused receivers
- Simplify receiver hardcoded info
2024-10-08 14:35:16 -04:00
MattHag 7f5e156fa1 Introduce constant for Logitech vendor ID
The Vendor ID for Logitech is 0x46D = 1133.
2024-06-03 08:37:02 -04:00
MattHag e316ed1bc2 Remove unnecessary receiver info 'hid_driver'
The same constant is used everywhere.
2024-06-03 08:37:02 -04:00
MattHag be83dac209
hid: Convert definition of HID registers to enum
* Refactor HID Register definitions

Use enums for distinct type hints, easy discovery of registers.
Make constants uppercase and benefit from enum auto-completion.

Related #2273

* Improve type hints: Registers
2024-06-02 10:34:00 -04:00
MistificaT0r 4225fce8d7
po: update Russion translation and have all strings translated
* update Russian translation

* Fixed translation display in GUI

* fix checks / Fixed translation display in GUI
2024-04-21 11:36:39 -04:00
Peter F. Patel-Schneider 51ef2a7fe2 device: add missing receiver type for Lightspeed receivers 2024-03-03 15:14:20 -05:00
Matthias Hagmann 7ef3059b69 clean up: Remove editor specific marks
Related #2273
2024-02-29 10:10:46 -05:00
Matthias Hagmann eb937fcc3a Manually fix linter issues
Related #2295
2024-02-20 15:41:10 -05:00
Matthias Hagmann 7774569971 Apply ruff format
Run ruff auto formatting using:
ruff format .

Related #2295
2024-02-20 15:41:10 -05:00
Peter F. Patel-Schneider 31d795fcb8 device: improve imports in logitech_receiver
device: move some imports to top of modules

device: break up imports loop with device descriptors

device: break up imports loop by moving a function from notifications.py to setting_templates.py

device: break import loop between device.py and diversion.py by using device to access method
2024-02-18 06:21:35 -05:00
Peter F. Patel-Schneider 4a0a47e4f7 receiver: clarify status of C542 receiver 2022-11-14 16:51:38 -05:00
Peter F. Patel-Schneider 51ec36fef4 receiver: rationalize receiver information structure 2022-10-13 16:14:30 -04:00
Peter F. Patel-Schneider afada652e8 receiver: add Dell receiver C535 2022-10-13 16:14:30 -04:00
Peter F. Patel-Schneider a1aa584b7e receiver: use only product records to determine whether receivers can unpair 2022-09-15 10:30:54 -04:00
Peter F. Patel-Schneider a4afffe6c3 device: support C542 receiver for M190 mice 2022-03-19 17:42:59 -04:00
Peter F. Patel-Schneider a034a0ea10 device: broaden range of bluetooth devices 2022-03-17 20:47:58 -04:00
Stephen Kitt 4505524006 share: Add modalias information for supported USB hardware 2021-12-18 12:35:44 -05:00
Peter F. Patel-Schneider be2f0b809c receiver: sort receiver list and document status of receiver 0xC542 2021-11-30 13:55:50 -05:00
Peter F. Patel-Schneider 886df1daaf receiver: add support for Bolt receiver (no pairing yet) 2021-11-11 10:48:12 -05:00
Hugo Osvaldo Barrera 22bf4fafff Drop unnecessary __future__ imports
These are all active by default on all recent Python versions.
2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera b96d16672b Drop obsolete encoding declaration
This was only parsed in Python 2.
Python 3 only supports UTF-8 for source files, and that's what it uses.
2021-10-30 16:49:41 -04:00
Jocelyn Thode 10d6a98ca1 device: add support for the PRO X Wireless mouse 2021-10-28 12:49:20 -04:00
Peter F. Patel-Schneider 1d73217ad2 receiver: mark Nano receiver C52F as not unpairing 2021-09-25 13:47:47 -04:00
Peter F. Patel-Schneider a1874c572b i18n: mark more strings as translatable 2021-08-06 13:41:22 -04:00
Robert Birkelbach d172d27408 Support logitech g pro x superlight
The title speaks for itself: Add support for the g pro x superlight.
2021-06-08 12:09:30 -04:00
Peter F. Patel-Schneider 1d18e4d8f7 receiver: receiver c52e does not unpair 2021-04-09 07:24:11 -04:00
Peter F. Patel-Schneider b19006104f device: support unknown USB-connected and Bluetooth devices 2020-10-12 08:05:13 -04:00
Peter F. Patel-Schneider fdb1b43373 device: add USB information for G700s 2020-10-01 17:45:49 -04:00
Peter F. Patel-Schneider 3b6a4ed0ed receiver: put USB and BT identifiers in descriptors.py 2020-09-29 11:26:34 -04:00
Peter F. Patel-Schneider df8b6b488c receiver: add USB information for MX Vertical when wired 2020-09-23 18:03:47 -04:00
Peter F. Patel-Schneider 58823763ea ui: handle wired devices 2020-09-23 18:03:47 -04:00
Peter F. Patel-Schneider ebfd26b3d0 receiver: add USB information for G502 Hero when wired 2020-09-23 18:03:47 -04:00
Alex Cherkayev 7a82b93aaf udev: add function to get wpid from udev
base: make workaround flag name more generic
descriptors: fix wpid's for 27Mhz devices
device: Improve wpid and kind processing for 27Mhz devices
notifications: Improve wpid generation for 27Mhz devices
docs: fix wpid's for EX100
2020-09-07 11:43:25 -04:00
effective-light 374388daf0 udev: add new rules for the wired devices and have the udev rules apply to paired peripherals 2020-08-25 06:47:07 -04:00
effective-light 00ea128775 Prevent the precommit hooks from complaining 2020-08-25 06:47:07 -04:00
effective-light b98033d558 base: add a number of relevant device ids and print them when the "show" command is executed 2020-08-25 06:47:07 -04:00
Kudlaty b3cc4361e8 receiver: add lightspeed receiver c541 2020-08-12 14:35:05 -04:00
Peter F. Patel-Schneider 15b1965582 receiver: add lightspeed receiver c545 2020-08-09 11:21:28 -04:00
Alex Cherkayev e436b1bd1d receiver: add support for EX100 keyboard/mouse and receiver (046d:c517)
docs: add EX100 keyboard/mouse combo
device: add EX100 keyboard and mouse
hidpp10: fix notification parsing, add device features flags, fix documentation links
notifications: fix wpid processing for 27 MHz protocol
cli: add display of device features flags for HID++ 1.0 devices
2020-07-20 11:55:59 -04:00
Filipe Laíns 627185079f flake8: initial fix
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns 72a8d311bc yapf: change code style to yapf
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Peter F. Patel-Schneider 6c77aa3b61 receiver: add c53d as a Lightspeed receiver 2020-05-25 20:51:17 -04:00
Peter F. Patel-Schneider 2189d4a35b receiver: add new macro for old receivers and use it to set max devices to 6 for C517 2020-04-20 15:26:37 +01:00
Peter F. Patel-Schneider a49b7938e0 receiver: Receiver C517 can have two paired devices 2020-03-16 16:04:16 +00:00
Peter F. Patel-Schneider a9acdbe47a receiver: add c537 nano receiver 2020-03-06 18:00:37 -05:00