Compare commits

...

1742 Commits
0.7.2 ... 1.1.2

Author SHA1 Message Date
Peter F. Patel-Schneider
4100c83390 release 1.1.2 2022-03-26 11:52:06 -04:00
Peter F. Patel-Schneider
4e4ece278f settings: disable BACKLIGHT setting because it is causing errors 2022-03-26 11:52:06 -04:00
Rongrong
5c44885085 Update zh_CN translation (#1511) 2022-03-24 16:08:28 -04:00
Matthaiks
39214a4f38 po: update Polish translation 2022-03-20 07:19:54 -04:00
Peter F. Patel-Schneider
fbe25b4b11 release 1.1.2rc2 2022-03-19 21:25:03 -04:00
Peter F. Patel-Schneider
f935ff1d95 rules: reorder code in diversion.py 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
5e209dcfd9 rules: remove built-in testing rule for thumb wheel 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
3d82075773 rules: use relative scroll events for scrolling in uinput 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
b5c6cf8d63 doc: add information on rules under Wayland and uinput permissions 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
6bddebd89b rules: try uinput for simulating input if Xtest not available 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
b9c17474a4 rules: use uinput for simulating keyboard input 2022-03-19 21:09:45 -04:00
Peter F. Patel-Schneider
a4afffe6c3 device: support C542 receiver for M190 mice 2022-03-19 17:42:59 -04:00
Danfro
5b20a8a859 update German translation 2022-03-19 13:34:18 -04:00
Peter F. Patel-Schneider
7e6ceb988a settings: add missing choices for backlight setting 2022-03-17 20:47:58 -04:00
Peter F. Patel-Schneider
a034a0ea10 device: broaden range of bluetooth devices 2022-03-17 20:47:58 -04:00
Peter F. Patel-Schneider
6c02417037 ui: allow tray icon to scroll whenever at least two devices 2022-03-17 14:05:09 -04:00
Peter F. Patel-Schneider
d115ade2ea setting: add setting to divert gestures 2022-03-16 20:22:25 -04:00
Peter F. Patel-Schneider
681a06d8d7 ui: print backtrace when errors occur during writing settings 2022-03-16 20:22:25 -04:00
Vinícius
c53c77f427 ui: add support to Setting condition 2022-03-16 18:29:52 -04:00
Peter F. Patel-Schneider
e628298c0a cli: make solaar config changes also take effect in solaar ui if running 2022-03-16 09:20:12 -04:00
Peter F. Patel-Schneider
019997f75c settings: add setting to disable Onboard Profiles 2022-03-13 10:29:00 -04:00
Peter F. Patel-Schneider
d9abdb2ecd docs: document rule Setting: condition 2022-03-13 09:36:04 -04:00
Peter F. Patel-Schneider
484b097664 settings: handle PERSISTENT REMAPPABLE ACTION for M720 mouse 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
4c7f8c831b receiver: add and remove some HID Consumer Codes to conform with Linux usage 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
3e6c92de70 docs: update for PERSISTENT_REMAPPABLE_ACTION and class-based settings 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
d646e18543 settings: add setting for PERSISTENT_REMAPPABLE_ACTION 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
12ecef004e receiver: gather and show PERSISTENT_REMAPPABLE_ACTION information 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
1deb6c34e4 receiver: add PERSISTENT_REMAPPABLE_ACTION to KeysArray classes 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
3d87f418cf receiver: add USB consumer codes 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
e3788f3d1f receiver: add USB scan codes 2022-03-12 12:20:38 -05:00
Peter F. Patel-Schneider
4c683457f9 device: downgrade warning when devices don't echo requests for reprogrammable keys 2022-03-12 12:20:38 -05:00
Vinícius
588d7ae533 ui: add support to TestBytes 2022-03-10 21:04:28 -05:00
Vinícius
f327e3ad38 logitech_receiver: split Test condition 2022-03-10 21:04:28 -05:00
Danfro
54b79d9f13 update German translation (#1489)
* update some new German strings and improve a few existing strings

* add translated comment to example desktop file
2022-03-10 20:43:26 -05:00
Peter F. Patel-Schneider
6cdb2ea9eb settings: fix bug in speed-change setting 2022-03-09 15:29:43 -05:00
Peter F. Patel-Schneider
84bdc792b7 docs: augment rule documentation 2022-03-09 09:42:16 -05:00
Peter F. Patel-Schneider
17a7b0689e settings: add BACKLIGHT3 setting template 2022-03-09 09:13:24 -05:00
Peter F. Patel-Schneider
bc398a8720 device: add DFUCONTROL feature 2022-03-09 09:13:24 -05:00
Peter F. Patel-Schneider
df2a68c29e settings: add Backlight setting template 2022-03-09 09:13:24 -05:00
Peter F. Patel-Schneider
3c4efb4ad5 ui: ensure that settings are pushed to all devices when resuming 2022-03-09 09:12:10 -05:00
Peter F. Patel-Schneider
124414063b device: reformat descriptors.py 2022-03-08 17:48:41 -05:00
Peter F. Patel-Schneider
7239e3d050 device: support G502 SE Hero mouse 2022-03-08 17:48:41 -05:00
Peter F. Patel-Schneider
c430ff6ea8 doc: mention how to contribute in main documentation 2022-03-08 09:07:47 -05:00
Danfro
2ce5e2ba82 updated the translation with po-update.py and added the missing strings 2022-03-08 09:04:51 -05:00
Danfro
416080e8c4 update translators name 2022-03-08 09:04:51 -05:00
Danfro
f8bf49c1b2 update German translation 2022-03-08 09:04:51 -05:00
Peter F. Patel-Schneider
71ac905d76 device: determine device number from protocol for direct-connected devices; add G9 Laser Mouse 2022-03-02 22:58:25 -05:00
Peter F. Patel-Schneider
862fd9c110 device: cut off noops even earlier 2022-03-02 05:30:22 -05:00
Peter F. Patel-Schneider
94ff454ace rules: fix Key conditions in built-in rules 2022-03-01 08:05:13 -05:00
Lukas Michel
ce7dcf8326 add keysyms to the packages list 2022-03-01 06:27:35 -05:00
Peter F. Patel-Schneider
27752778ab ui: fix bug in add and delete button actions 2022-02-28 09:04:12 -05:00
Peter F. Patel-Schneider
1696733702 receiver: dispose of no-op notifications quickly 2022-02-27 11:59:54 -05:00
Peter F. Patel-Schneider
00176a1df8 rules: add rule condition for checking device settings 2022-02-27 08:24:05 -05:00
Peter F. Patel-Schneider
eedf4bfffb rules: use local file for conversion from key names to keysyms 2022-02-27 08:21:52 -05:00
Peter F. Patel-Schneider
1869f57f7f rules: get keyboard group and use to get correct keycode for keysym 2022-02-27 08:21:52 -05:00
Peter F. Patel-Schneider
4c43910ed7 rules: use GDK to get current keyboard modifiers 2022-02-27 08:21:52 -05:00
Peter F. Patel-Schneider
3e2be09cb5 rules: partial implementation of rules under Wayland 2022-02-27 08:21:52 -05:00
Peter F. Patel-Schneider
cb7845471c settings: add setting for MR-Key LED 2022-02-25 16:13:42 -05:00
Peter F. Patel-Schneider
faf905de9c settings: add setting for M-Key LEDs 2022-02-25 16:13:42 -05:00
Peter F. Patel-Schneider
856f40e789 rules: fix bug in unpacking M and MR key notification 2022-02-25 16:13:42 -05:00
Peter F. Patel-Schneider
c16b02e732 device: add G815 keyboard and MX518 mouse 2022-02-22 14:14:07 -05:00
Peter F. Patel-Schneider
a94d00e418 device: add new special keys 2022-02-21 08:37:16 -05:00
Peter F. Patel-Schneider
561e9cbfea settings: Agument tooltip messages for several settings 2022-02-21 08:29:48 -05:00
Peter F. Patel-Schneider
cf0a71913e rules: track M keys and MR keys for use in rules 2022-02-21 08:29:48 -05:00
Peter F. Patel-Schneider
19b32f7856 doc: be clear that KeyPress rule action is for a single chorded character 2022-02-16 21:14:52 -05:00
Peter F. Patel-Schneider
69046678ac ui: default editable to True in show method 2022-02-16 21:14:52 -05:00
Peter F. Patel-Schneider
e190ad39da cli: make sure device is on-line when searching for devices in solaar show 2022-02-16 11:08:39 -05:00
Dominik 'Rathann' Mierzejewski
346c643bcc lower PyYAML and psutil version requirements
RHEL8 and derivatives carry PyYAML 3.12 and psutil 5.4.3 built for the
default python 3.6 in the base OS repository. Consequently, solaar is
not installable without installing python38 or python39 stack (called
module in RHEL/Fedora) that carry newer versions of these two.

solaar seems to work fine with these older versions as
[confirmed](https://bodhi.fedoraproject.org/updates/FEDORA-EPEL-2022-f65a1a9d86)
by @mefuller .

Fixes #1418 .
2022-02-16 07:59:47 -05:00
Peter F. Patel-Schneider
7fad50a2f4 docs: don't use smooth scrolling as an example of what Solaar can do 2022-02-14 13:37:06 -05:00
Peter F. Patel-Schneider
c75aaea89d settings: don't check for mouse kind in dpi sliding setting 2022-02-14 13:37:06 -05:00
Peter F. Patel-Schneider
55be7a67c8 settings: get default DPI if current DPI is returned as 0 2022-02-14 13:37:06 -05:00
Peter F. Patel-Schneider
f938d3430e cli: nicer output of settings in solaar show and solaar config 2022-01-24 21:12:55 -05:00
Peter F. Patel-Schneider
fed9a26cb6 settings: fix bug in read method of action settings rw 2022-01-24 19:21:46 -05:00
Peter F. Patel-Schneider
13e4861043 settings: handle missing divert-setting in action RW 2022-01-24 14:03:17 -05:00
Peter F. Patel-Schneider
55a91f0ae4 device: add id property (unitId or serial) and don't use ? for unknown serial 2022-01-24 14:03:17 -05:00
Peter F. Patel-Schneider
7a9f9972a6 receiver: fix contains for NamedInts and eliminate use of has_element 2022-01-24 14:03:17 -05:00
Peter F. Patel-Schneider
f6b25a9685 rules: check for xtest and disable modifier checking if not available 2022-01-24 11:21:09 -05:00
Peter F. Patel-Schneider
56936a4d0a device: better gesture structure computation 2022-01-24 11:17:40 -05:00
Peter F. Patel-Schneider
7442c52c20 rules: defend against problems when determining focus program 2022-01-24 11:17:40 -05:00
Peter F. Patel-Schneider
26aa1ee15f device: lock querying all unqueried keys to prevent two threads from doing the same work 2022-01-24 11:17:40 -05:00
Peter F. Patel-Schneider
22b99ecce7 device: lock computation of gestures and settings to prevent two threads from doing the same work 2022-01-24 11:17:40 -05:00
Peter F. Patel-Schneider
a9c4950389 device: don't use class-shared structure for gesture indexes 2022-01-24 11:17:40 -05:00
Vinícius
25523315ab ui: fix tree row text when device contains options not in the full list 2022-01-24 11:12:04 -05:00
Vinícius
6f28a39a47 ui: fix choice field when device is connected 2022-01-24 11:12:04 -05:00
Vinícius
8be2ca110a ui: avoid conflicts when settings with the same name have different labels for the same number 2022-01-24 11:12:04 -05:00
Vinícius
2b26c9dc92 ui: do not accept numerical value typed by user 2022-01-24 11:12:04 -05:00
Vinícius
c3e88001e4 logitech_receiver: add has_element to NamedInts 2022-01-24 11:12:04 -05:00
Vinícius
49f2c6d8b9 ui: fix bug that made setting values not appear 2022-01-24 11:12:04 -05:00
Vinícius
bf8b861275 ui: don't show generic labels when specific ones are available for the same field 2022-01-24 11:12:04 -05:00
Vinícius
747d2e9c17 ui: show translated strings instead of internal names 2022-01-24 11:12:04 -05:00
Vinícius
d6c2b30760 ui: show keys supported by device even if they are not in the known universe 2022-01-24 11:12:04 -05:00
Vinícius
4d8b22f764 ui: replace typed text with key/value default display name 2022-01-24 11:12:04 -05:00
Vinícius
6dd980c541 ui: replace typed id with device display name 2022-01-24 11:12:04 -05:00
Vinícius
68e2b8ce6e ui: add support to choices_extra 2022-01-24 11:12:04 -05:00
Vinícius
fa0ecc6c2c ui: add blank field to toggle widgets 2022-01-24 11:12:04 -05:00
Vinícius
573cb6e985 ui: fix - typed text was not recognised as valid 2022-01-24 11:12:04 -05:00
Vinícius
7dd9609942 doc: remove outdated information about unsupported setting 2022-01-24 11:12:04 -05:00
Vinícius
2d2d3e3bc6 ui: make key and value fields case-insensitive 2022-01-24 11:12:04 -05:00
Vinícius
d80e34963b ui: make device field case-insensitive 2022-01-24 11:12:04 -05:00
Vinícius
0bce293017 ui: add support to multiple range in Set action 2022-01-24 11:12:04 -05:00
Vinícius
5c96d2d307 logitech_receiver: add support to multiple range in Set action 2022-01-24 11:12:04 -05:00
Vinícius
13dfac476b logitech_receiver: simplify param labels 2022-01-24 11:12:04 -05:00
Vinícius
f5831cbda7 ui: build item with all sub-items for multiple range settings 2022-01-24 11:12:04 -05:00
Vinícius
b9a23f133e ui: hide unsupported settings/keys/values 2022-01-24 11:12:04 -05:00
Vinícius
a4e30a7190 ui: treat '?' identifier as unavailable 2022-01-24 11:12:04 -05:00
Vinícius
aff80a7572 ui: fix error when key is set to None 2022-01-24 11:12:04 -05:00
Vinícius
9737a85c5a ui: fix errors when updating devices before widgets are filled 2022-01-24 11:12:04 -05:00
Vinícius
cc3ec6d987 ui: clear keys and values after changing setting 2022-01-24 11:12:04 -05:00
Vinícius
4c4f8de040 ui: change Set rule editor layout 2022-01-24 11:12:04 -05:00
Vinícius
438bb9e034 ui: show a different icon if the user types an unknown 8-character hex string 2022-01-24 11:12:04 -05:00
Vinícius
29cd1109b1 ui: don't trigger widget updates when updating devices 2022-01-24 11:12:04 -05:00
Vinícius
6022c37325 ui: add device selector to Set rule editor 2022-01-24 11:12:04 -05:00
Vinícius
3947a4a083 logitech_receiver: fix minimum DPI 2022-01-24 11:12:04 -05:00
Vinícius
2eb6864cfb ui: sort by number if all values are numeric 2022-01-24 11:12:04 -05:00
Vinícius
d2f44299f3 logitech_receiver: add range to AdjustableDpi 2022-01-24 11:12:04 -05:00
Vinícius
ec9f1a94ea logitech_receiver: rename old DPI setting 2022-01-24 11:12:04 -05:00
Vinícius
29ff5e5924 logitech_receiver: add UnsortedNamedInts 2022-01-24 11:12:04 -05:00
Vinícius
b36b070feb ui: make Set rule editor accept settings with the same name 2022-01-24 11:12:04 -05:00
Vinícius
ca36d2bd1a settings: add choices to Multiplatform and validator class to RegisterDpi 2022-01-24 11:12:04 -05:00
Vinícius
be4632f684 settings: fix type of choices 2022-01-24 11:12:04 -05:00
Vinícius
74fbec4209 settings: avoid circular import 2022-01-24 11:12:04 -05:00
Vinícius
8c32c2e63c ui: add new Set rules to rule editor (partial support) 2022-01-24 11:12:04 -05:00
Peter F. Patel-Schneider
1ace3ef4f4 ui: hide system tray icon when there are no devices to control 2022-01-22 09:57:28 -05:00
Peter F. Patel-Schneider
12779e7061 device: add G733 headset 2022-01-22 09:51:36 -05:00
Peter F. Patel-Schneider
df8e936769 ui: use greyscale solaar icon in tray when using symbolic icons 2022-01-22 09:50:14 -05:00
drupal-daffie
3a182c4988 Fixed typo (#1432)
Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
2022-01-22 09:48:39 -05:00
Vinícius
136c351209 cli: accept name as key in solaar config 2022-01-22 09:37:44 -05:00
Vinícius
b93b4f6bc3 cli: fix incorrect output of solaar config 2022-01-22 09:37:44 -05:00
Vinícius
2f702b7ca3 cli: fix bug in solaar config for multiple range settings 2022-01-22 09:37:44 -05:00
Vinícius
665b7b6194 logitech_receiver: fix bug that made solaar config not work 2022-01-22 09:37:44 -05:00
Peter F. Patel-Schneider
11fa025f1d settings: use classes for settings 2022-01-22 08:55:54 -05:00
Vinícius
de5878d34e settings: also accept "Toggle" to be consistent with CLI 2022-01-16 13:38:56 -05:00
Vinícius
08eb8a06e3 cli: also accept "~" to be consistent with the new Set action 2022-01-16 13:38:56 -05:00
Peter F. Patel-Schneider
a09af769d0 docs: document Set rule action 2022-01-13 18:59:06 -05:00
Peter F. Patel-Schneider
785675d469 ui: handle errors when writing to devices 2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
2e94add3e3 ui: use classes for all config widgets 2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
9e018fc5bf ui: use classes for several config widgets 2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
8a87b9b013 rules: add Solaar rules command to set settings
testing
2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
5b1125cd11 cli: refactor config.py to create set(...) function 2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
69b411fc27 ui: decrease amount of logging for each debug level 2022-01-13 18:23:12 -05:00
Peter F. Patel-Schneider
629afbd812 ui: use good battery icon down to 30% charge 2022-01-02 15:29:05 -05:00
Peter F. Patel-Schneider
f7a0422956 ui: don't stretch toggles 2021-12-29 09:56:53 -05:00
Peter F. Patel-Schneider
65e64c1346 settings: use key structure for key remapping setting 2021-12-29 09:52:59 -05:00
Peter F. Patel-Schneider
9315b3fcdb receiver: optimize ReprogrammableKey in hidpp20 2021-12-29 09:52:59 -05:00
Peter F. Patel-Schneider
cb14c2eec9 settings: keep track of settings that are absent from device 2021-12-29 06:12:05 -05:00
Peter F. Patel-Schneider
6d3d3e2086 device: add G512 keyboard and G402 mouse 2021-12-28 15:53:23 -05:00
Peter F. Patel-Schneider
85b4495443 device: reformat descriptors.py 2021-12-28 15:53:23 -05:00
Christian Tacke
49e9240be9 ui: Use GtkButton for the Lock Icon
Instead of GtkEventBox use GtkButton for the lock icons.

GtkEventBox does not have any visual feedback that it
actually can be pressed. As in: If you don't know that this
is an area for interaction it is not obvious.

Using Gtk.ReliefStyle.NONE on the GtkButton keeps the old
styling but still gives feedback when hovering over the
buttons.

Co-authored-by: Christian Tacke <8560110+ChristianTacke@users.noreply.github.com>
2021-12-28 12:27:03 -05:00
Peter F. Patel-Schneider
79606c530b receiver: use feature numbers for reprogrammable key versions 2021-12-26 11:21:48 -05:00
Peter F. Patel-Schneider
aa8d2fcac4 ui: don't use new_from_icon_set for tray menu icons as it is deprecated 2021-12-26 10:32:59 -05:00
Peter F. Patel-Schneider
1da6f124a0 docs: update comment about report rate and onboard profiles 2021-12-26 09:51:47 -05:00
Peter F. Patel-Schneider
723959ba1c release 1.1.1 2021-12-25 12:29:15 -05:00
Peter F. Patel-Schneider
fce2a29a50 release: change order of checks in release.sh 2021-12-25 12:29:15 -05:00
Christian Tacke
d9dbf53868 Keep left Tree at Minimal Size
When resizing the window or switching entries in the left
tree, the width of the tree changes and takes more space
than required.

Switch it over to only take the minimal amount of space and
do not extend when resizing the window.
2021-12-25 12:19:29 -05:00
Peter F. Patel-Schneider
2ee04d89fd rules: fix crash in process conditions under non-X11 2021-12-24 21:04:43 -05:00
Peter F. Patel-Schneider
8ab062363e cli: add version to output of solaar show 2021-12-23 14:44:05 -05:00
Peter F. Patel-Schneider
d5a6ef058a device: check for uninitialized protocol when pinging 2021-12-22 21:57:48 -05:00
Peter F. Patel-Schneider
b86af20f67 release 1.1.1rc2 2021-12-21 09:05:04 -05:00
Peter F. Patel-Schneider
174d0388ca ui: display percentage estimates from battery voltage 2021-12-20 11:30:29 -05:00
Peter F. Patel-Schneider
fa83e6ebb8 device: add descriptor for Logitech PRO X Wireless Gaming Headset 2021-12-20 09:17:07 -05:00
Peter F. Patel-Schneider
c005a94a0a release 1.1.1rc1 2021-12-20 08:55:24 -05:00
Muhammad Talal Anwar
d57af51316 Use markdown for changelog and release notes (#1368)
* Use markdown format for changelog and release notes

* Changelog: remove indent for bullet points

* Changelog: use headings for releases

* Release_Notes: use headings

* Release_Notes: use bullet points

Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
2021-12-20 08:44:51 -05:00
Peter F. Patel-Schneider
b7a1b81181 device: push settings when device requests software reconfiguration 2021-12-20 08:06:03 -05:00
Peter F. Patel-Schneider
3797c3926c settings: fix read for key/button diversion setting 2021-12-20 08:06:03 -05:00
Peter F. Patel-Schneider
95b3bdb402 share: add modalias information for supported Bluetoth hardware 2021-12-18 12:35:44 -05:00
Peter F. Patel-Schneider
560419693b share: add homepage and rating to metainfo 2021-12-18 12:35:44 -05:00
Stephen Kitt
4505524006 share: Add modalias information for supported USB hardware 2021-12-18 12:35:44 -05:00
Peter F. Patel-Schneider
c8ab8b4350 receiver: don't do on-screen notify for wireless device status notifications 2021-12-11 13:41:56 -05:00
Peter F. Patel-Schneider
292461c168 receiver: improve feature notification processing code 2021-12-11 13:41:56 -05:00
xptñ
253cfbacd5 po: update es.pp (#1371)
Fixed some spelling mistakes
2021-12-10 16:30:15 -05:00
Muhammad Talal Anwar
cfe67d4f30 docs: fix typo 2021-12-09 16:59:21 -05:00
Muhammad Talal Anwar
822bb79ac2 Changelog: fix typos 2021-12-09 16:59:21 -05:00
Unknown
306e6da7e9 settings : Smooth scroll for crown
* implemented a switch for swapping between smooth scrolling and ratchet for the crown
settings : Smooth scroll for crown
2021-12-06 12:22:01 -05:00
Peter F. Patel-Schneider
791f19269d settings: add write_prefix_bytes argument to Boolean Validator 2021-12-06 12:22:01 -05:00
OlesyaGerasimenko
8ad648b868 po: Update Russian translation (#1365) 2021-12-06 09:17:12 -05:00
Muhammad Talal Anwar
a45f11fa0c docs: fix table rendering on GitHub Pages
Without any space between the heading and the table, the rendering on GitHub Pages breaks.
2021-12-01 07:51:06 -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
7242f3792c device: add special keys for MX Keys for Business and MX Keys Mini 2021-11-29 19:15:41 -05:00
Peter F. Patel-Schneider
07e55c188a ui: don't include separator after receiver in tray menu 2021-11-29 19:15:41 -05:00
Peter F. Patel-Schneider
c515de9b09 ui: harmonize order of tray items and main window items 2021-11-29 19:15:41 -05:00
Peter F. Patel-Schneider
adae5a2e2b ui: add option to specify use of explict tray icon files and their size 2021-11-29 17:54:31 -05:00
Peter F. Patel-Schneider
f83c927a1e release 1.1.0 2021-11-26 12:20:06 -05:00
Peter F. Patel-Schneider
ca5fd7e5d6 release 1.1.0rc3 2021-11-23 11:52:26 -05:00
Peter F. Patel-Schneider
4c9d9e17d6 gui: fix bug when adding new receiver to tray menu 2021-11-22 11:32:25 -05:00
Peter F. Patel-Schneider
d6b685dd2c po: update headers on ja and nl translations 2021-11-22 11:32:25 -05:00
webolot
65bc7910e5 po: update spanish translation 2021-11-22 11:28:26 -05:00
webolot
c0a264bf81 po: update Catalan translation 2021-11-22 11:28:26 -05:00
Peter F. Patel-Schneider
6dbdd76db2 release 1.1.0rc2 2021-11-21 13:54:05 -05:00
Peter F. Patel-Schneider
025700f1be release 1.1.0rc1 2021-11-21 13:49:26 -05:00
Peter F. Patel-Schneider
d8cce70a0c release 1.1.0rc1 2021-11-21 13:43:42 -05:00
webolot
f16294e5aa added Catalan translation 2021-11-18 08:31:21 -05:00
Peter F. Patel-Schneider
0736dd3164 docs: better information on diverting keys, etc., to trigger rules 2021-11-17 20:16:10 -05:00
Peter F. Patel-Schneider
d80b2b1651 docs: better information on diverting keys, etc., to trigger rules 2021-11-17 17:00:42 -05:00
Francisco Robles Martín
ab76053fb3 docs: provide pointer to autostart desktop file
Signed-off-by: Francisco Robles Martín <f.robles.martin@pm.me>
2021-11-16 13:21:10 -05:00
Łukasz Woźniak
27cda8bf08 settings: add ability to toggle boolean values in solaar config
#1325
2021-11-15 08:50:45 -05:00
Łukasz Woźniak
d33b407ba8 rules: don't select windows with no PID when looking for focus window
\#1322
2021-11-15 08:45:31 -05:00
Peter F. Patel-Schneider
4e8fb93b31 device: catch errors when applying settings 2021-11-11 11:03:30 -05:00
Peter F. Patel-Schneider
5acc216e12 receiver: use Bolt unique ID as serial number 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
4bc3799e96 cli: print Bolt receiver registers in solaar probe 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
c32a6ca91c receiver: get device codename from Bolt receiver registers 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
9823e5ab8a receiver: Bolt connection does not show encryption status 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
603fbe96e0 ui: add pairing for Bolt receivers 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
0aa9f4a22c docs: documentation for Bolt pairing 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
885cefb5b6 cli: add pairing for Bolt receivers 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
886df1daaf receiver: add support for Bolt receiver (no pairing yet) 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
2c3578a776 receiver: move receiver pairing information code from device class to receiver class 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
a96caea5e4 receiver: move receiver codename code from device class to receiver class 2021-11-11 10:48:12 -05:00
Peter F. Patel-Schneider
0df6acd67a ui: better code for adding devices to tray menu 2021-11-09 09:08:16 -05:00
Hugo Osvaldo Barrera
a763be6839 Also drop legacy code from bin/solaar 2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
89d7490bf1 Remove redundant value
Opening read-only is the default.
2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
fdd6229179 Avoid unnecessary list allocation 2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
93c4ebe758 Remove obsolete unicode prefix 2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
6c4e0333d4 Drop legacy Python 2 super() syntax
This is a no-op on Python 3.
2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
cf28308a9f Simplify yield syntax 2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
df83fd655c Stop declaring object as superclass
This syntax was only required on Python 2 and has no effect on Python 3.
2021-10-30 16:49:41 -04:00
Hugo Osvaldo Barrera
d6ba8e0b29 Stop using aliased Exception
IOError is now OSError. The old name is merely a legacy compatibility
alias.
2021-10-30 16:49:41 -04: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
57f0ae2c99 docs: add documentation for the G915 TKL and PRO X Superlight 2021-10-28 12:49:20 -04:00
Jocelyn Thode
8a2d92834f device: add support for the G914 TKL Keyboard 2021-10-28 12:49:20 -04:00
Jocelyn Thode
10d6a98ca1 device: add support for the PRO X Wireless mouse 2021-10-28 12:49:20 -04:00
Jocelyn Thode
138fe4c756 ui: fix device not always castable as bool 2021-10-28 12:49:20 -04:00
Peter F. Patel-Schneider
c1ce3c2c5f listener: ignore many notifications that come to a device listener 2021-10-28 12:49:20 -04:00
Peter F. Patel-Schneider
7873f3e8d0 receiver: handle more device connection protocols 2021-10-28 12:49:20 -04:00
Peter F. Patel-Schneider
37d6cab569 docs: add main window showing double-connected devices 2021-10-28 09:09:24 -04:00
Peter F. Patel-Schneider
45ae63e58d docs: change emojis to text 2021-10-27 15:06:20 -04:00
Peter F. Patel-Schneider
bc2f482300 docs: change device documentation to show less information 2021-10-27 12:17:17 -04:00
Peter F. Patel-Schneider
5480321f49 device: add information for M500S 2021-10-23 23:16:48 -04:00
Peter F. Patel-Schneider
f1d896ded3 settings: use new setting method for MOUSE GESTURE setting 2021-10-22 15:51:55 -04:00
Peter F. Patel-Schneider
2ca0bd9ac3 settings: use new setting method for DPI SLIDING setting 2021-10-22 15:51:55 -04:00
Peter F. Patel-Schneider
14c1eac79c settings: add setting for DPI CHANGE button to switch Sensitivity 2021-10-22 15:51:55 -04:00
Peter F. Patel-Schneider
2de79141e4 i18n: update Spanish translation 2021-10-22 11:05:29 -04:00
Peter F. Patel-Schneider
c763886248 ui: use file names for tray icon to not end up with small icons 2021-10-11 20:45:01 -04:00
Peter F. Patel-Schneider
116adf9959 ui: better computation of tray index when adding devices 2021-10-11 20:42:36 -04:00
Peter F. Patel-Schneider
b3c3ad02c8 doc: more documentation on mouse gestures 2021-10-07 18:47:19 -04:00
Peter F. Patel-Schneider
a89a973419 docs: update implemented feature list 2021-10-03 10:49:01 -04:00
Peter F. Patel-Schneider
cea3b5d5a5 po: update Japanese translation 2021-10-02 09:11:07 -04:00
Matthaiks
81131b90e1 po: update Polish translation
* po: update Polish translation

* po: update Polish translation

Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
2021-10-01 14:48:39 -04:00
Matthaiks
795b6a35fd po: update Polish translation 2021-10-01 12:37:27 -04:00
Peter F. Patel-Schneider
44f5c9f93f i18n: update Quit and About translations 2021-10-01 12:35:33 -04:00
Peter F. Patel-Schneider
453be19356 ui: make about and quit buttons more translatable 2021-10-01 12:35:33 -04:00
Peter F. Patel-Schneider
0fbeebf121 release 1.0.7 2021-10-01 07:06:28 -04:00
Peter F. Patel-Schneider
79565cb31e i18n: update po files 2021-10-01 07:06:28 -04:00
Peter F. Patel-Schneider
9fca203372 release 1.0.7rc3 2021-09-25 13:54:45 -04:00
Peter F. Patel-Schneider
64d48a19a7 docs: upgrade pairing/unpairing documentation 2021-09-25 13:47:47 -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
585a3b901a receiver: lock on actual handle, not just on handle number 2021-09-24 21:55:15 -04:00
Peter F. Patel-Schneider
0d9fe48b0c listener: handle fake Nano connection notifications 2021-09-24 21:55:15 -04:00
Peter F. Patel-Schneider
a9adc06b7a ui: correctly determine setting box in change_click method 2021-09-24 10:17:59 -04:00
Ryunosuke Toda
64062a456f Update Japanese translation 2021-09-23 16:03:49 -04:00
Peter F. Patel-Schneider
27f6d6c76b settings: don't use time_ns so as not to require Python 3.7 2021-09-23 13:13:18 -04:00
Peter F. Patel-Schneider
e82457f284 release 1.0.7rc2 2021-09-14 15:50:34 -04:00
Peter F. Patel-Schneider
6d56dd538e release 1.0.7rc1 2021-09-14 15:44:36 -04:00
Peter F. Patel-Schneider
5488593caa doc: update installation instructions to mention Python versions 2021-09-14 11:51:48 -04:00
Peter F. Patel-Schneider
338a2687d3 device: don't signal status change when battery changes from None to None 2021-09-14 11:51:48 -04:00
Peter F. Patel-Schneider
83f79c55f1 doc: add paragraph on old versions to index.md 2021-09-06 16:38:37 -04:00
toda-ryunosuke
2daef846e3 Add Japanese translation 2021-09-04 18:25:36 -04:00
Peter F. Patel-Schneider
c5ef207961 device: use first word of name for code name if friendly name not available 2021-08-31 19:05:57 -04:00
Peter F. Patel-Schneider
c02a1b820b device: pass protocol to base request so that SW ID can be done right 2021-08-31 19:05:57 -04:00
Peter F. Patel-Schneider
a7ddb3efdd cli: allow for new_fn_inversion call to fail 2021-08-31 19:05:57 -04:00
Peter F. Patel-Schneider
2f870fe0f7 device: allow for None reponse from kind request 2021-08-31 19:05:57 -04:00
kkrentz
3ef5e63cd4 Fix "'int' object is not subscriptable" on G613 2021-08-30 20:23:10 -04:00
Peter F. Patel-Schneider
b94ae51ac8 rules: consistent naming for HID++ Diversion settings 2021-08-27 06:18:13 -04:00
Jose Riha
3f33d0633a Add Slovak translation 2021-08-24 05:17:22 -04:00
ifurther
dcafaf18e2 po/i18n: update zh_TW translation 2021-08-22 14:56:43 -04:00
Peter F. Patel-Schneider
67e40b35e8 device: add G102 mouse 2021-08-22 11:16:41 -04:00
Peter F. Patel-Schneider
30f56a1c0f device: use 0xFF instead of 0 for direct-connected devices 2021-08-22 11:16:41 -04:00
Vinícius
4b97ebd649 po/i18n: update pt_BR translation 2021-08-20 18:44:04 -04:00
Peter F. Patel-Schneider
c2de1b59ef ui: use logging for signalling unfound udev rule 2021-08-18 10:01:22 -04:00
Peter F. Patel-Schneider
4e76c99e0f hid: add debug message when potential device found 2021-08-18 09:40:23 -04:00
Matthaiks
42b83ecce8 po: update Polish translation (#1222)
* po: update Polish translation

* po: update Polish translation

* po: update Polish translation

Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
2021-08-06 21:09:38 -04:00
Peter F. Patel-Schneider
14c2ac6959 po: make common button names translatable and show translations 2021-08-06 18:30:52 -04:00
Peter F. Patel-Schneider
a1874c572b i18n: mark more strings as translatable 2021-08-06 13:41:22 -04:00
Peter F. Patel-Schneider
ee4275f45c gtk: add new possible locations for udev rule 2021-08-06 13:41:22 -04:00
Peter F. Patel-Schneider
70a0fcd906 cli: show battery information under unified battery feature 2021-08-05 16:37:28 -04:00
Peter F. Patel-Schneider
18d79f8dd4 docs: mention that Solaar is available in Fedorals 2021-08-05 16:37:28 -04:00
Peter F. Patel-Schneider
cdc7a27c9e rules: add rule condition for process under mouse 2021-07-22 10:46:31 -04:00
Peter F. Patel-Schneider
39a5350f30 settings: add binary read prefix to handle fancy fn-swap setting 2021-07-20 09:59:37 -04:00
Peter F. Patel-Schneider
538ab9c947 receiver: serialize requests per handle so that threads do not receive response for a different request 2021-07-17 13:58:20 -04:00
Peter F. Patel-Schneider
d898edc4a3 notifications: downgrade unknown notifications warnings to info messages 2021-07-15 10:31:38 -04:00
Peter F. Patel-Schneider
ed0b730e74 device: fix bug with timeout when setting reprog keys 2021-07-15 10:21:03 -04:00
Peter F. Patel-Schneider
50392da360 rules: add checks for empty process name and class 2021-07-15 10:16:16 -04:00
Karthik Nishanth
85a86ec3c5 diversion: implement pressed and released action on Key condition (#1189)
- Track `key_up` key in addition to `key_down`
- Support `pressed` or `released` action in `Key` condition
- Add radio button to KeyUI to represent `pressed` or `released`
2021-07-12 15:51:57 -04:00
Peter F. Patel-Schneider
6290c84efd rules: upgrade rule execution debug message to info message 2021-07-04 22:10:45 -04:00
Peter F. Patel-Schneider
dbdbbf7fb3 docs: fix pointer to Solaar logo 2021-07-04 10:13:44 -04:00
Peter F. Patel-Schneider
3d65a77515 misc: better error message for missing gi package 2021-07-04 10:13:44 -04:00
Peter F. Patel-Schneider
e15ce68498 rules: process old mouse movement tests as MouseGesture conditions 2021-07-04 09:38:29 -04:00
ApeironTsuka
011f3f556b rules: allow sequence of mouse moves as mouse gestures
* Add more robust mouse gesture support
- Remove existing mouse-* Test types
- Add new 'Mouse Gesture' Condition
- Implement Rule Editor UI for it
- Add support for diverted buttons
- Added diagonal mouse gesture directions

Allows you to chain multiple movements/buttons (for instance, moving the mouse up and then left) together into a single mappable gesture.

* Update docs

* Cleanup
Fix inconsistent indenting
Fix possible overwriting of built-in
Fix 'Mouse Gesture' Condition rule not starting with an initial Action field

* Make flake8 happy

* yapf

* Document no-op and make it more apparent

* Make changes to Mouse Gesture UI suggested/submitted by viniciusbm.

Co-authored-by: Apeiron <apeiron@none>
Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
2021-07-04 08:52:38 -04:00
Peter F. Patel-Schneider
8854ca6f23 docs: update advice on kernel versions 2021-06-15 19:03:43 -04:00
Peter F. Patel-Schneider
4690ca77c4 settings: fix fake divert gkeys read to return byte string 2021-06-15 19:03:43 -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
67dbe5f4c8 device: convert HID++ 2.0 device kinds to enhanced HID++ 1.0 kinds 2021-06-04 08:59:39 -04:00
Peter F. Patel-Schneider
5aedbad692 docs: update Solaar version in bug report template 2021-05-29 20:33:27 -04:00
Peter F. Patel-Schneider
9495cc03c2 misc: update about window 2021-04-25 14:48:28 -04:00
Peter F. Patel-Schneider
9deb7d66aa misc: update about window 2021-04-25 09:14:59 -04:00
Peter F. Patel-Schneider
c67bd32522 release 1.0.6 2021-04-25 09:07:58 -04:00
Peter F. Patel-Schneider
ce98e89427 release 1.0.6rc2 2021-04-25 09:03:36 -04:00
Peter F. Patel-Schneider
72b37deb52 release 1.0.6rc2 2021-04-25 08:59:59 -04:00
Peter F. Patel-Schneider
0cfb9b8896 misc: tell issue reporters to look in known issues first 2021-04-23 13:21:04 -04:00
Peter F. Patel-Schneider
51c6b6f2de misc: update long description to add pointer to installation instructions 2021-04-21 14:26:31 -04:00
Peter F. Patel-Schneider
1c1be84e59 device: downgrade warning about removing missing notification handler to info message 2021-04-21 13:55:58 -04:00
Peter F. Patel-Schneider
4edbf51f17 ui: better message for missing udev file 2021-04-21 08:53:41 -04:00
Peter F. Patel-Schneider
98b5804a21 rules: turn several log messages from INFO to DEBUG 2021-04-20 07:58:41 -04:00
Peter F. Patel-Schneider
d3799dcf41 docs: minor updates and cleanup 2021-04-18 11:13:50 -04:00
Peter F. Patel-Schneider
44b1b5b6d0 misc: update release.sh 2021-04-18 08:06:25 -04:00
Peter F. Patel-Schneider
f5fac6f713 release 1.0.6rc1 2021-04-18 07:46:03 -04:00
Peter F. Patel-Schneider
be143992ff po: update German translation 2021-04-18 07:36:29 -04:00
Peter F. Patel-Schneider
086a8252d2 docs: add new settings and rule example 2021-04-18 07:36:29 -04:00
Peter F. Patel-Schneider
39beaf8b3a docs: document new version of sliding DPI 2021-04-18 07:36:29 -04:00
Peter F. Patel-Schneider
3969472dd3 settings: dpi sliding looks for suitable key 2021-04-18 07:36:29 -04:00
Peter F. Patel-Schneider
90bae7db84 settings: only produce warning if can't turn off DPI sliding 2021-04-18 07:36:29 -04:00
Peter F. Patel-Schneider
a734a35b7e rules: add a mouse-noop test for mouse gesture with little movement 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
64915b09f7 docs: update description of mouse gestures setting 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
7add22e861 settings: don't halt when trying to write invalid map choice 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
75fec689a0 settings: change name of App Switch Button 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
5d885f76e7 settings: show potential triggering keys for mouse gesture setting 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
42624c7102 ui: write persisted value when changing from ignoring a setting 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
087b99a2de settings: use keys interface in divert_keys setting 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
b3a6dc5b2e ui: update map all settings that are not None 2021-04-17 10:32:24 -04:00
Peter F. Patel-Schneider
95dafbe3aa settings: fix return value for mouse gesture callback 2021-04-15 17:00:29 -04:00
Peter F. Patel-Schneider
a1dc69d203 ui: make ignore settings not sensitive at startup 2021-04-13 13:27:59 -04:00
Peter F. Patel-Schneider
e32cf61fa8 docs: document sliding dpi and mouse gestures 2021-04-13 09:26:24 -04:00
Peter F. Patel-Schneider
f7488f67c1 settings: add mouse gesture handling 2021-04-13 09:26:24 -04:00
Peter F. Patel-Schneider
6c62f975d0 ui: directly connected devices don't need to support connection notifications 2021-04-12 23:21:22 -04:00
Peter F. Patel-Schneider
62034758f0 ui: check that receivers support connection nofications 2021-04-12 22:32:11 -04:00
Peter F. Patel-Schneider
e66a83aa36 docs: sudo should not be used to run Solaar 2021-04-12 19:05:11 -04:00
Peter F. Patel-Schneider
a288caa7ee settings: fix typo 2021-04-12 08:08:31 -04:00
Peter F. Patel-Schneider
5be7541875 settings: for polling rate setting only change profiles mode when actually writing 2021-04-12 08:04:41 -04:00
Peter F. Patel-Schneider
33a4bf8bf5 ui: read current value of setting when switching away from ignore 2021-04-12 07:39:35 -04:00
Peter F. Patel-Schneider
b2970186df docs: describe setting ignoring and add note about drivers and scroll wheel resolution 2021-04-12 07:39:35 -04:00
Peter F. Patel-Schneider
52fcbe3b48 settings: restore _feature_hires_smooth_resolution 2021-04-12 07:39:35 -04:00
Peter F. Patel-Schneider
b34061c766 ui: add ability to ignore a Solaar setting 2021-04-12 07:39:35 -04:00
Peter F. Patel-Schneider
2ce8a3b249 docs: describe how to install a system tray for Gnome 2021-04-09 09:39:30 -04:00
Peter F. Patel-Schneider
8c5800e536 receiver: use symbolic identifiers for sub-registers 2021-04-09 07:46:10 -04:00
gogogogi
804ba267f6 device: add G700 wired support 2021-04-09 07:43:54 -04:00
Peter F. Patel-Schneider
6099df1b42 ui: do not set attention icon - gets around bug in XFCE 16 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
fc1e38d196 docs: add note that some system tray implementations might not set up icons correctly 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
55ed173c39 ui: replace deprecated GTK stock values 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
593d27770d ui: only use first element of theme path for appindicator extra path 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
0dbb93e6a5 ui: only prepend one icon path to theme search paths 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
68049efc41 ui: better handling of tray icons 2021-04-09 07:28:23 -04:00
Peter F. Patel-Schneider
1d18e4d8f7 receiver: receiver c52e does not unpair 2021-04-09 07:24:11 -04:00
SiDevesh
d3a18bb85f rules: match WM_CLASS also for process matching in rules 2021-04-08 15:01:50 -04:00
Peter F. Patel-Schneider
1cb8f0c874 ui: correctly set icon theme value when regular battery icons are missiong 2021-04-07 19:59:25 -04:00
Peter F. Patel-Schneider
7e360e4416 settings: remove _feature_hires_smooth_resolution as recent Linux input drivers depend on it not changing 2021-04-04 22:36:54 -04:00
Peter F. Patel-Schneider
9842972d8b receiver: handle exception when device is not available while being added 2021-04-04 22:33:38 -04:00
Peter F. Patel-Schneider
a4b54df433 device: fix debug message error 2021-04-02 10:25:01 -04:00
Peter F. Patel-Schneider
6ed09d0643 listener: perform initial activation of devices in listener threads
listener: perform initial activation of devices in listener threads
2021-03-30 08:36:37 -04:00
Peter F. Patel-Schneider
1bd68177ab configure: keep track of serial numbers in configuration file 2021-03-30 08:36:37 -04:00
Peter F. Patel-Schneider
985ebd46cd device: check device is active before performing request and don't replace empty settings 2021-03-30 08:36:37 -04:00
Peter F. Patel-Schneider
3fb197b78c device: set host names longer than 14 bytes 2021-03-29 11:43:30 -04:00
Peter F. Patel-Schneider
cb67897d15 device: set current host name if not current host 2021-03-29 11:43:30 -04:00
Peter F. Patel-Schneider
533cd54b92 settings: add setting for SMART SHIFT ENHANCED feature 2021-03-26 15:55:59 -04:00
Peter F. Patel-Schneider
a658f2e2b0 device: add names for 2250 and 2251 features 2021-03-26 15:55:59 -04:00
Peter F. Patel-Schneider
5aa45a78c3 docs: update package dependencies 2021-03-23 22:31:04 -04:00
Peter F. Patel-Schneider
689d57d097 device: don't always use long messages for protocol 1.0 2021-03-22 08:35:34 -04:00
Peter F. Patel-Schneider
dc3f70ff86 cli: use 1-origin addressing when selecting from choices in config 2021-03-18 09:57:03 -04:00
Peter F. Patel-Schneider
58f1a142ec cli: fix config check against choices 2021-03-18 09:57:03 -04:00
Peter F. Patel-Schneider
10233dac30 settings: add quirk to not set up host mode on G915 TKL keyboard 2021-03-07 22:02:49 -05:00
Peter F. Patel-Schneider
ec9ac9c920 docs: put show output in a details block in issue templates 2021-03-06 07:39:04 -05:00
Peter F. Patel-Schneider
5642a658ab cli: print settings saved in config file in show command 2021-03-06 07:39:04 -05:00
Peter F. Patel-Schneider
08d571aea9 docs: add notes about different settings on different computers 2021-03-05 07:31:13 -05:00
Peter F. Patel-Schneider
3cd76aa191 tools: fix up call to udev matching in hidconsole 2021-03-02 19:02:08 -05:00
daviddavid
3d3d0d4ccc Update French translation for 1.0.5 release
- by David Geiger <david.david@mageialinux-online.org>
2021-02-27 10:25:45 -05:00
Peter F. Patel-Schneider
83f45218de release 1.0.5 2021-02-27 09:03:29 -05:00
Peter F. Patel-Schneider
69df28c155 docs: update docs - remembering settings, point to github docs 2021-02-21 14:02:48 -05:00
Peter F. Patel-Schneider
babdb44b4f cli: fix up help messages for selecting devices and receivers for CLI commands 2021-02-21 13:23:33 -05:00
Peter F. Patel-Schneider
daee35de4a cli: fix bug in finding receiver to pair 2021-02-21 06:30:32 -05:00
Peter F. Patel-Schneider
8d01e28138 release 1.0.5rc2 2021-02-18 15:04:18 -05:00
Peter F. Patel-Schneider
04d79810d4 cli: set keyed settings with config 2021-02-18 11:02:57 -05:00
Matthaiks
6fa1bfd044 po: Update translation for Polish 2021-02-17 16:16:52 -05:00
Leonardo Gates
c1a79a49f8 settings: implement polling rate 2021-02-17 07:58:30 -05:00
Peter F. Patel-Schneider
04775a3719 device: use long messages for all 2.0 requests 2021-02-16 20:20:33 -05:00
Peter F. Patel-Schneider
20f16e8e10 i18n: update german and italian translations 2021-02-16 20:14:37 -05:00
Peter F. Patel-Schneider
eb0d939d1a cli: don't select unpaired device for config command 2021-02-16 08:25:46 -05:00
Peter F. Patel-Schneider
4b52b77348 cli: add device name to output when changing settings using config command 2021-02-16 08:25:46 -05:00
Equidamoid
8fccd84345 Log real exception when can't use Xorg API (#1066)
* fix: log real exception when can't use Xorg API

* chore: make linter happy
2021-02-08 18:55:10 -05:00
Alexander Huck
2ea92db3ca remove trailing whitespace 2021-02-01 12:54:32 -05:00
Alexander Huck
205047e278 Update about.py 2021-02-01 12:54:32 -05:00
Alexander Huck
c268ff7a45 Update about.py to bump copyright years
Update Copyright Timeframe
2021-02-01 12:54:32 -05:00
Peter F. Patel-Schneider
7dbf92955e doc: remove packages that no longer exist 2021-01-27 11:43:33 -05:00
Peter F. Patel-Schneider
82a41bf46b device: show remaining pairings in show 2021-01-27 11:35:11 -05:00
daviddavid
1de3b2e472 Update French translation for 1.0.4 release
- by David Geiger <david.david@mageialinux-online.org>
2021-01-23 11:44:50 -05:00
Heimen Stoffels
f6b76900d9 Updated Dutch translation 2021-01-15 17:40:13 -05:00
Peter F. Patel-Schneider
1c6f289d91 ui: add option to not use battery icons for tray icon 2021-01-04 09:53:46 -05:00
Matthaiks
ca0e2a0a3f po: Update translation for Polish
Version 1.0.4
2021-01-04 09:53:09 -05:00
Peter F. Patel-Schneider
111f2be5c8 device: defense against missing devices 2021-01-03 16:01:59 -05:00
Marián Kyral
f68a831c81 Add Czech translation 2020-12-30 12:22:09 -05:00
Marián Kyral
b722eccf04 Fix typo 2020-12-30 12:22:09 -05:00
Peter F. Patel-Schneider
53b7c63680 docs: remove pointer to SUSE package as it is very old 2020-12-27 07:08:39 -05:00
Vinícius
aa4456e9dc receiver: changing duplicate label of GESTURE 2 options 2020-12-17 12:18:22 -05:00
Ricardo Mones
8d657f891a Update es.po
Hi, I'm using 1.0.4 in Debian testing and Spanish translation lacks a lot of strings, here it is an updated file.
2020-12-15 06:39:33 -05:00
Peter F. Patel-Schneider
a688bfd9ec settings: add setting to divert G keys and handle in rules 2020-12-13 22:24:08 -05:00
Dominik 'Rathann' Mierzejewski
a47f3fa5d1 fix metainfo file location
Rename the file to match the <id> tag inside the file.

Install the file in correct location.

This fixes #1025 .
2020-12-04 10:07:38 -05:00
Peter F. Patel-Schneider
69f889e33f rules: only activate rules if X11 is running 2020-12-02 10:10:47 -05:00
Peter F. Patel-Schneider
52049af8e1 receiver: add remote device type 2020-11-30 08:18:09 -05:00
Peter F. Patel-Schneider
7d0402a97f rules: only use X11 code when X11 is available 2020-11-28 09:41:59 -05:00
Peter F. Patel-Schneider
0427e5607e settings: correctly handle diversions when key has other flags set 2020-11-27 17:38:38 -05:00
Peter F. Patel-Schneider
419a7722ad rules: make rule processing conditional on X11 being available 2020-11-27 10:48:16 -05:00
Peter F. Patel-Schneider
60afd53257 device: fix short name for MX Keys keyboard 2020-11-27 10:48:16 -05:00
Peter F. Patel-Schneider
a99a5a544e rules: fix syntax in MouseClick 2020-11-27 10:12:21 -05:00
Peter F. Patel-Schneider
244d48d245 rules: remove use of pynput 2020-11-27 10:12:21 -05:00
Peter F. Patel-Schneider
808a719823 device: push device settings when device is active after suspend 2020-11-27 10:02:46 -05:00
Bruno Mello
56db8fbdf9 Update installation.md
Fix spelling of python psutil package
2020-11-23 18:12:18 -05:00
Peter F. Patel-Schneider
0af12fbf2e docs: mention GUI editor for notification rules 2020-11-21 12:44:50 -05:00
Peter F. Patel-Schneider
646151ae61 receiver: reduce unnecessary writes of config file 2020-11-21 12:34:13 -05:00
Peter F. Patel-Schneider
66138ad7c0 docs: add instructions on Python development package 2020-11-21 12:32:33 -05:00
Peter F. Patel-Schneider
d81a971455 cli: don't show devices as receivers 2020-11-21 12:32:33 -05:00
Peter F. Patel-Schneider
66f3d5d02b receiver: gracefully handle more receiver and device disconnects 2020-11-21 12:32:33 -05:00
Peter F. Patel-Schneider
6b8e7a2d9c ui: only emit warning on path mismatch between device and recevier in main window 2020-11-21 12:32:33 -05:00
Peter F. Patel-Schneider
504d23fab7 ui: only emit warning when updating tray for inactive device 2020-11-21 12:32:33 -05:00
Vinícius
52109ade91 ui: ignore Ctrl+Delete shortcut if root is selected 2020-11-21 12:23:41 -05:00
Vinícius
daafe5ebca ui: don't offer to delete/cut root element and don't offer to paste non-Rule at the top level 2020-11-21 12:23:41 -05:00
Vinícius
8be0e21ac7 ui: delete method that is no longer used 2020-11-21 12:23:41 -05:00
Vinícius
9c04bfad92 ui: fixed unnecessary dialogue when window is closed after discarding changes 2020-11-21 12:23:41 -05:00
Vinícius
4025b83dfd ui: add icons to rule editor buttons and implement Ctrl+S shortcut 2020-11-21 12:23:41 -05:00
Vinícius
bc51117f59 ui: use readable names on the left column of rule editor 2020-11-21 12:23:41 -05:00
Vinícius
a8819b06c8 ui: make KeyPress entry larger (relative to window size) 2020-11-21 12:23:41 -05:00
Vinícius
6f973cdc27 ui: fix bug that prevented copying from a built-in rule for the first time 2020-11-21 12:23:41 -05:00
Vinícius
b548d05cad ui: change diversion editor window title and button label 2020-11-21 12:23:41 -05:00
Vinícius
ef3d3e5290 ui: fix feature entry bug when feature is not on the list 2020-11-21 12:23:41 -05:00
Vinícius
487e1a3ded ui: show Feature completion matches for all features 2020-11-21 12:23:41 -05:00
Vinícius
4206d370f1 ui: add delete button for every Execute argument 2020-11-21 12:23:41 -05:00
Vinícius
29ccd55210 ui: improve validation of FeatureUI and KeyUI diversion rule components 2020-11-21 12:23:41 -05:00
Vinícius
b399380445 ui: diversion rule editor - move save and discard buttons to the top 2020-11-21 12:23:41 -05:00
Vinícius
1d68ef858e ui: make rule editing buttons larger and add delete buttons for KeyPress. 2020-11-21 12:23:41 -05:00
Vinícius
717213c506 ui: move diversion button to the right 2020-11-21 12:23:41 -05:00
Vinícius
0b5c263799 receiver: fix and improve diversion load/save functions 2020-11-21 12:23:41 -05:00
Vinícius
1379da70a8 ui: add GUI for diversion rules (draft) 2020-11-21 12:23:41 -05:00
Peter F. Patel-Schneider
f42ff35f24 doc: add app metainfo file 2020-11-17 17:24:47 -05:00
Peter F. Patel-Schneider
3d8c9272fb install: update and document new dependencies 2020-11-17 17:07:32 -05:00
Vinícius
381371c899 receiver: add MouseClick diversion rule 2020-11-14 10:38:01 -05:00
Peter F. Patel-Schneider
be590c154a docs: add documentation for rules processing and change name of rules file 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
30e4324906 receiver: associate source file with top-level rules 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
545db1f641 receiver: add named tests for hires and lowres wheels 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
5e2b2b6647 device: add quirk for WPID 4055 in button diversion 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
f3a276d7a3 receiver: add rule-based processing of diverted features 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
02a7d8cadd util: allow accessing NamedInts by readable name 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
4da7feec3b receiver: regularize capitalization of Logitech CONTROL key names 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
f75c9845d2 settings: add setting for diverting keys 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
b947dd4896 settings: add crown diversion setting 2020-11-13 08:46:04 -05:00
Peter F. Patel-Schneider
ade9c816c7 receiver: add report_id to notifications and use where appropriate 2020-11-13 08:46:04 -05:00
Vinícius
8141fafb4b ui: create attributes to access children in settings with multiple items 2020-11-02 09:28:12 -05:00
Peter F. Patel-Schneider
79b18d07c9 cli: fix bug in probe 2020-11-02 09:15:43 -05:00
Peter F. Patel-Schneider
d92939135f device: warn when feature notifiation comes in before device fully set up 2020-11-02 08:27:08 -05:00
Peter F. Patel-Schneider
733bf913e6 device: implement UNIFIED_BATTERY feature
device: implement UNIFIED_BATTERY feature
2020-11-02 08:27:08 -05:00
Peter F. Patel-Schneider
1162ccb897 device: be defensive when getting device id 2020-11-01 15:14:18 -05:00
Peter F. Patel-Schneider
73ddb12d8e docs: fix typos in devices.md 2020-10-28 12:41:04 -04:00
Peter F. Patel-Schneider
93b5a0008b ui: add lock icon to control whether setting can be changed 2020-10-25 14:13:58 -04:00
Wojciech Nawrocki
847205eb06 settings_templates: typo
Oops!
2020-10-25 14:03:05 -04:00
Antony Kellermann
98b4aff33d Fix warning 2020-10-25 14:02:25 -04:00
Peter F. Patel-Schneider
a4e4c160c1 release 1.0.4 2020-10-22 10:02:24 -04:00
Peter F. Patel-Schneider
b97c83be97 po: update pt_BR translation 2020-10-22 10:02:24 -04:00
Peter F. Patel-Schneider
2e4e0a0676 release: fix ChangeLog 2020-10-12 08:35:02 -04:00
Peter F. Patel-Schneider
93fe73214c release 1.0.4rc1 2020-10-12 08:25:35 -04:00
Peter F. Patel-Schneider
4ca2496a6f docs: update devices.md for USB and BT devices 2020-10-12 08:05:13 -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
dba9d472a8 hidapi: fix bug in processing of serial numbers 2020-10-07 15:18:28 -04:00
Peter F. Patel-Schneider
7a7aad8977 device: use FRIENDLY NAME for codename if needed and available 2020-10-07 05:30:34 -04:00
Olivier Dormond
254e2cb77e device: add BT information for MX Keys 2020-10-03 09:10:59 -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
a9d6b4c319 listener: make sure device has a status before processing notifications 2020-10-01 17:45:49 -04:00
Peter F. Patel-Schneider
7908a4f5a4 ui: ensure that Gtk 3.0 is the version loaded 2020-10-01 17:45:49 -04:00
Peter F. Patel-Schneider
757c731610 device: show DPI values, not slider, in sliding notification 2020-10-01 12:48:11 -04:00
Peter F. Patel-Schneider
612e8fb4f7 device: store sliding DPI value in persister and respect changes in regular DPI setting 2020-10-01 12:48:11 -04:00
Peter F. Patel-Schneider
3effccf390 docs: update for USB and Bluetooth 2020-09-29 11:26:34 -04:00
Peter F. Patel-Schneider
84e0e74709 device: add BT IDs for MX Master and MX Master 2S 2020-09-29 11:26:34 -04:00
Peter F. Patel-Schneider
ec8a51d353 udev: get manufacturer and product from HID_ID 2020-09-29 11:26:34 -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
815c9755b5 receiver: handle bluetooth-connected devices 2020-09-29 11:26:34 -04:00
Peter F. Patel-Schneider
1e7050595e receiver: add model and node ID and use in configurations 2020-09-29 11:26:34 -04:00
Peter F. Patel-Schneider
fc59c0fbf6 device: only look up feature notifications in SLIDING DPI setting 2020-09-28 14:47:43 -04:00
Peter F. Patel-Schneider
4874d72c16 receiver: fix bug in debug message 2020-09-28 14:47:43 -04:00
Peter F. Patel-Schneider
e6cfd0a0c1 device: increase speed for DPI sliding 2020-09-28 12:59:04 -04:00
Peter F. Patel-Schneider
ebf7984ad0 device: determine SLIDING DPI suitability based on device features 2020-09-28 12:59:04 -04:00
Peter F. Patel-Schneider
2654b6bbe0 ui: add forced-refresh argument to window update 2020-09-28 12:59:04 -04:00
Wojciech Nawrocki
9f7c7209fe device: support DPI sliding with two slots on MX Vertical mouse
Reimplements the entire behaviour of Logitech's software for this
mouse on Windows.
2020-09-28 12:59:04 -04:00
Wojciech Nawrocki
41fb08c059 notify: allow displaying progress 2020-09-28 12:59:04 -04:00
Wojciech Nawrocki
362d43a7a1 backend: allow device objects to handle notifications 2020-09-28 12:59:04 -04:00
Peter F. Patel-Schneider
0259e44c31 cli: ignore DJ pairing notifications in CLI pair command 2020-09-24 18:22:35 -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
825b7b6f34 udev: add permissions for any Logitech device 2020-09-23 18:03:47 -04:00
Peter F. Patel-Schneider
b1d4b2f3cd receiver: add model and node ID and use in configurations 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
aeb8588e06 cli: make probe and config work for 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
Peter F. Patel-Schneider
95a30a8089 cli: add extra information about features to show command output 2020-09-23 18:03:47 -04:00
Peter F. Patel-Schneider
dca6b4ba38 ui: show all host choices 2020-09-21 08:57:47 -04:00
Peter F. Patel-Schneider
b1706fa9e2 ui: don't show unpaired host choices 2020-09-21 07:44:55 -04:00
Peter F. Patel-Schneider
ff5d744183 ui: improve display strings and ordering for settings 2020-09-21 07:44:55 -04:00
Peter F. Patel-Schneider
377e44c624 ui: add separator before device settings 2020-09-21 07:44:55 -04:00
Peter F. Patel-Schneider
6e986ddf8c docs: add missing word in index.md 2020-09-18 05:49:43 -04:00
Peter F. Patel-Schneider
714f8782b3 cli: reduce chance of connect notifications clashing when pairing 2020-09-18 05:49:43 -04:00
Peter F. Patel-Schneider
ad57db4a39 receiver: permit connection notifications that are not unifying 2020-09-18 05:49:43 -04:00
Peter F. Patel-Schneider
8b5d56feb4 device: if hidraw node is not available wait and try a second time 2020-09-18 05:49:43 -04:00
Peter F. Patel-Schneider
2153035c30 ui: add device path to information panel for non-receivers 2020-09-18 05:49:43 -04:00
Peter F. Patel-Schneider
dbf6226f77 receiver: update strings for several settings 2020-09-18 05:49:43 -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
Ali Sabzevari
9de4d392d4 Fix broken link to about website 2020-09-04 14:39:25 -04:00
Peter F. Patel-Schneider
b0297694d1 receiver: remove spurious part of special handling for ex100 receiver 2020-09-01 23:13:49 -04:00
Vinícius
7fdba7fe75 ui: disabled ListBoxRow background colour on hover 2020-09-01 18:38:00 -04:00
Vinícius
9f330479c1 docs: filled information about GESTURE2 and some supported devices 2020-09-01 18:38:00 -04:00
Vinícius
36e8dcb396 descriptors: added GESTURE2 to known supported devices 2020-09-01 18:38:00 -04:00
Vinícius
708edbc444 ui: make collapsible sections start collapsed 2020-09-01 18:38:00 -04:00
Vinícius
d87bc594f4 ui: fixed vertical alignment of panel after collapsing widgets 2020-09-01 18:38:00 -04:00
Vinícius
7a65c40312 ui: removed GESTURE2 specs from the panel 2020-09-01 18:38:00 -04:00
Vinícius
6994e1e41c receiver/ui: added labels and tooltips to some settings 2020-09-01 18:38:00 -04:00
Vinícius
1ce67954cb receiver: fixed number of spec "field widths" 2020-09-01 18:38:00 -04:00
Vinícius
1e8956ff96 ui: fixed horizontal alignment and size of multiple toggle/range widgets 2020-09-01 18:38:00 -04:00
Vinícius
c8fe87ee2d receiver: implementation of GESTURE 2 params; improved UI for multiple toggle 2020-09-01 18:38:00 -04:00
Vinícius
aa067b2774 receiver: show GESTURE2 specs on the panel 2020-09-01 18:38:00 -04:00
Vinícius
b3751913b2 receiver: read GESTURE2 param defaults 2020-09-01 18:38:00 -04:00
Vinícius
09394cfbf5 receiver: support GESTURE2 specs 2020-09-01 18:38:00 -04:00
Vinícius
7498febc3a receiver: GESTURE 2 also applies to mice 2020-09-01 18:38:00 -04:00
Vinícius
4a5c0ea523 receiver: initial implementation of boolean GESTURE 2 settings 2020-09-01 18:38:00 -04:00
Peter F. Patel-Schneider
633760e261 receiver: add initial support for GESTURE_2 2020-09-01 18:38:00 -04:00
Peter F. Patel-Schneider
68aebc8c1b cli: slight improvement to probe 2020-09-01 18:35:31 -04:00
Peter F. Patel-Schneider
831287ead6 cli: add full register dump for probe 2020-09-01 18:04:24 -04:00
Peter F. Patel-Schneider
1bba8b26de cli: fix bug in probe.py 2020-08-29 13:38:11 -04:00
Peter F. Patel-Schneider
718c2d4039 receiver: simplify settings interface 2020-08-28 08:41:14 -04:00
Peter F. Patel-Schneider
1516daa6d0 listener: fix misleading connection log message 2020-08-27 08:27:58 -04:00
Peter F. Patel-Schneider
4df84107e1 receiver: don't emit warning for battery status notifications 2020-08-27 05:22:03 -04:00
Peter F. Patel-Schneider
3e4c09380a receiver: be extra cautious when writing key-value pairs for settings 2020-08-27 05:22:03 -04:00
Peter F. Patel-Schneider
e6947d95d8 receiver: use DJ connection notifications to set device active status 2020-08-27 05:22:03 -04:00
Peter F. Patel-Schneider
f5c00a5f2a docs: mention that Solaar udev rule is needed for access to device hidraw nodes 2020-08-25 07:28:09 -04:00
effective-light
246c6cc1b2 udev: add a timeout to find_paired_node because the device might not be instantly ready (e.g. after pairing) 2020-08-25 06:47:07 -04:00
effective-light
2d29db4609 udev: simplify find_paired_node 2020-08-25 06:47:07 -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
fe55e39560 udev: use HID_PHYS instead of HID_UNIQ to look for relevant child nodes 2020-08-25 06:47:07 -04:00
effective-light
535b1f02ce device: report a wired device's serial number 2020-08-25 06:47:07 -04:00
effective-light
eec5df5d56 device: read the serial number properly from the device hidraw nodes 2020-08-25 06:47:07 -04:00
effective-light
c4d2ec4008 device: ensure that the serial ids match since wpids aren't distinct between devices and fallback to the receiver's handle when a match can't be found 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
effective-light
16823092bc device: add preliminary support for wired devices 2020-08-25 06:47:07 -04:00
effective-light
9a13eb0229 receiver: talk directly to the device where possible 2020-08-25 06:47:07 -04:00
effective-light
35114490d3 cli: print each device's direct path 2020-08-25 06:47:07 -04:00
effective-light
bf3aeff7d8 receiver: open and store each paired device's direct hidraw node 2020-08-25 06:47:07 -04:00
Peter F. Patel-Schneider
d027c66198 receiver: add WPID 0612 for VX Revolution mouse 2020-08-24 08:28:48 -04:00
Peter F. Patel-Schneider
04e8281738 receiver: handle devices with serial numbers that don't provide number of pairings 2020-08-24 08:28:48 -04:00
Peter F. Patel-Schneider
f5c63ccc39 ui: better display of battery information in main window 2020-08-22 10:43:10 -04:00
Peter F. Patel-Schneider
9b8f96e824 receiver: fix bug when setting causes exception 2020-08-17 18:04:11 -04:00
Peter F. Patel-Schneider
5117028c52 misc: ignore exceptions when trying to set locale 2020-08-17 11:03:03 -04:00
Peter F. Patel-Schneider
eda0a95585 receiver: correctly handle settings that share a name in config 2020-08-15 14:41:56 -04:00
Peter F. Patel-Schneider
5041530952 receiver: don't produce pop-up notifications at startup and power on 2020-08-14 10:10:39 -04:00
Peter F. Patel-Schneider
9d0fcea02e receiver: simpler interface for settings 2020-08-13 16:38:11 -04:00
Peter F. Patel-Schneider
1400473877 receiver: make unpairing log messages be INFO, not warning 2020-08-12 19:12:41 -04:00
Peter F. Patel-Schneider
330fadfbce receiver: check that device can retrieve host names before trying that 2020-08-12 19:12:41 -04:00
Kudlaty
b3cc4361e8 receiver: add lightspeed receiver c541 2020-08-12 14:35:05 -04:00
Peter F. Patel-Schneider
2e1e8dc9b5 receiver: fix bug in logging DJ notifications 2020-08-10 05:34:33 -04:00
Peter F. Patel-Schneider
44f85d5dee receiver: change notification before status setup from assertion to warning 2020-08-09 18:20:18 -04:00
Peter F. Patel-Schneider
78a6ae9208 receiver: keep better track of battery voltage status for GUI 2020-08-09 18:20:18 -04:00
Américo Monteiro
4c31adb907 po: Add Portuguese translation 2020-08-09 15:46:06 -04:00
Peter F. Patel-Schneider
15b1965582 receiver: add lightspeed receiver c545 2020-08-09 11:21:28 -04:00
Peter F. Patel-Schneider
6918353a29 cli: improve messages for unpairing errors 2020-08-08 07:58:01 -04:00
Wojciech Nawrocki
1973693cc8 hidpp20: support version 4 of REPROG_CONTROLS_V4 2020-08-07 13:40:36 -04:00
Wojciech Nawrocki
1361af5501 special_keys: uppercase for DPI switch control 2020-08-07 13:40:36 -04:00
Wojciech Nawrocki
6e5d36e59f settings: use KeysArray for key reprogramming 2020-08-07 13:40:36 -04:00
Wojciech Nawrocki
95dc973748 hidpp20: add full support for version 2 of REPROG_CONTROLS_V4 2020-08-07 13:40:36 -04:00
muzena
e7047f4606 Update Croatian translation 2020-08-04 16:31:04 -04:00
John Erling Blad
d1908694c4 linted release page 2020-08-04 07:53:44 -04:00
John Erling Blad
b5bb04b8a2 po: update pot-file 2020-08-04 07:52:43 -04:00
John Erling Blad
14725e42ee po: update translation for Norwegian Bokmal 2020-08-04 07:52:23 -04:00
John erling Blad
5b796bae7d po: update translation for Norwegian Nynorsk 2020-08-04 07:51:38 -04:00
John erling Blad
e4f5d75095 po: update translation for Danish 2020-08-04 07:51:07 -04:00
John erling Blad
409065ed29 po: update translation for Swedish 2020-08-04 07:50:31 -04:00
Peter F. Patel-Schneider
56c6a52941 docs: put absolute links back in index.md 2020-08-04 07:49:47 -04:00
Peter F. Patel-Schneider
fd02b33971 ui: use ngettext for translatable strings with number dependencies 2020-08-02 11:56:56 -04:00
Peter F. Patel-Schneider
e763aeadb4 release 1.0.3 2020-08-02 11:46:13 -04:00
John Erling Blad
aaee650caf cleanup and lint the docs 2020-08-02 11:25:00 -04:00
John Erling Blad
6645b5b04c po: update translation for Swedish 2020-08-02 11:24:24 -04:00
John Erling Blad
e8f169f6f5 po: add translation for Danish 2020-08-02 11:23:45 -04:00
John Erling Blad
19a5fa3911 po: add translation for Norwegian Nynorsk 2020-08-01 15:46:59 -04:00
John Erling Blad
64e20533a0 po: update translation for Norwegian Bokmål 2020-08-01 15:41:28 -04:00
daviddavid
86a49128b4 Update French translation for 1.0.3rc2 release
- by David Geiger <david.david@mageialinux-online.org>
2020-08-01 07:51:52 -04:00
John Erling Blad
a579eb4ded po: update translation for Swedish 2020-07-31 06:23:44 -04:00
Peter F. Patel-Schneider
59296f41ca docs: add instructions on translations to docs/installation.md 2020-07-31 06:21:48 -04:00
Peter F. Patel-Schneider
0b0cf63240 release 1.0.3rc2 2020-07-30 02:58:23 -04:00
Peter F. Patel-Schneider
5dbf691403 receiver: ignore DJ pairing notifications 2020-07-30 02:44:56 -04:00
John Erling Blad
c1b6bf92c7 po: update pot file 2020-07-29 11:20:43 -04:00
John Erling Blad
3909a79149 po: add translation for Norwegian Bokmal 2020-07-29 11:20:43 -04:00
Peter F. Patel-Schneider
97caca023f docs: update devices.md with M720 2020-07-27 17:01:15 -04:00
Peter F. Patel-Schneider
11bc5bde37 docs: add warning about running Solaar as root 2020-07-27 10:21:55 -04:00
Peter F. Patel-Schneider
fb328b3993 release 1.0.3rc1 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
4fbf5aa531 dist: update ChangeLog for release 1.0.3rc1 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
07b42e2b34 dist: require Python 3.6 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
95893f3aac docs: minor documentation cleanup 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
46e6c98523 dist: remove deprecated solaar-cli appliation 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
e4d3f5e61e dist: don't install files in /etc from setup.py 2020-07-25 21:25:16 -04:00
Peter F. Patel-Schneider
a2ac8b46c1 misc: check for udev rule file presence at startup 2020-07-25 21:25:16 -04:00
Vinícius
d2eabe4258 receiver: prevent errors after clicking the name of an idle device 2020-07-25 16:47:05 -04:00
Peter F. Patel-Schneider
204bc6e810 hidapi: fix infinite loop on some write errors 2020-07-20 20:37:15 +01: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
Peter F. Patel-Schneider
4dfa55c96c receiver: add mode and inversion settings for feature THUMB_WHEEL 2020-07-19 08:35:46 -04:00
Lukas Michel
7f70039284 update german translation (#857)
* update german translation

* update german translation: apply suggestions from code review

Co-authored-by: Marcel Schilling <marcel.schilling@uni-luebeck.de>

Co-authored-by: Marcel Schilling <marcel.schilling@uni-luebeck.de>
2020-07-19 07:55:35 -04:00
Peter F. Patel-Schneider
2d2e71daa3 receiver: restore feature number to feature choice settings 2020-07-16 15:06:08 -04:00
Peter F. Patel-Schneider
4ce2abca0a ui: turn off write-backs for values obtained from device 2020-07-16 15:06:08 -04:00
Peter F. Patel-Schneider
bc6b1de472 gui: correctly show initial value for choice settings 2020-07-16 15:06:08 -04:00
Peter F. Patel-Schneider
90cc629f26 receiver: don't write non-persisted settings when applying them 2020-07-16 15:06:08 -04:00
Peter F. Patel-Schneider
de0894bc34 receiver: adjust CHANGE_HOST numbers to user-visible ones 2020-07-13 19:15:44 -04:00
Peter F. Patel-Schneider
e86a50cfa9 receiver: use report rate feature if available to determine polling rate 2020-07-13 13:34:21 -04:00
Peter F. Patel-Schneider
b6615d5abe cli: in config don't apply setting unnecessarily and don't print setting after writing 2020-07-12 18:12:18 -04:00
Peter F. Patel-Schneider
323fb13161 cli: check range values for validity in config 2020-07-12 18:12:18 -04:00
Peter F. Patel-Schneider
fef22de021 cli: don't lower-case choice values and allow numeric selection of choices 2020-07-12 18:12:18 -04:00
Peter F. Patel-Schneider
5a4205d002 receiver: add CHANGE_HOST setting 2020-07-12 18:04:04 -04:00
Peter F. Patel-Schneider
1c2b347512 receiver: allow for settings that do not persist 2020-07-12 18:04:04 -04:00
Peter F. Patel-Schneider
63872b9146 receiver: add settings option to not wait for reply when writing to device 2020-07-12 18:04:04 -04:00
Peter F. Patel-Schneider
c6506b3508 receiver: add option to not wait for a reply when requesting to device 2020-07-12 18:04:04 -04:00
Peter F. Patel-Schneider
c9c472e391 receiver: add setting for MULTIPLATFORM and DUALPLATFORM feature 2020-07-12 17:38:00 -04:00
Peter F. Patel-Schneider
1dc59fd374 docs: update issue templates 2020-07-11 15:36:49 -04:00
Peter F. Patel-Schneider
24798ee310 docs: remove logitech files and outdated information; update supported features 2020-07-11 15:36:49 -04:00
Peter F. Patel-Schneider
e05c1aa90c cli: make config faster 2020-07-10 14:16:41 -04:00
Peter F. Patel-Schneider
fe0ab16cc8 misc: dump threads on SIGINT 2020-07-09 12:51:38 -04:00
Peter F. Patel-Schneider
c38d10a654 receiver: gather host names from HOSTS_INFO feature and show them 2020-07-09 12:44:27 -04:00
Filipe Laíns
d386f4369b git-blame-ignore-revs: add pre-commit bulk change
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 16:10:37 +01:00
Filipe Laíns
ae4a0eba70 git-blame-ignore-revs: fix commit ids due to rebase
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 16:10:37 +01:00
Peter F. Patel-Schneider
72fd2f255e device: mouse m510v1 doesn't have a working smooth scroll so remove from its descriptor 2020-07-07 10:20:00 -04:00
Filipe Laíns
a8d067035d git-blame-ignore-revs: add yapf, isort and flake8 bulk changes
A clean blame can be accessed with:
git blame --ignore-revs-file .git-blame-ignore-revs <file>

Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
27c90fa736 yapf: adjust style to not indent closing brackets
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
bbaa144397 ci: add pre-commit
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
e751f741f7 setup.py: set minimum python version to 3.5
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
8e89aa0038 yapf: set max line lenght to 127
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01: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
de5514aa23 pre-commit: add flake8
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
0bc58d5653 flake8: add config
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
33521558ed pre-commit: initial fix
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
63fa581d13 pre-commit: add initial config
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
e6369e0c3c isort: intial import fix
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-07-07 15:11:15 +01:00
Filipe Laíns
be4e88dc1a isort: add config
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
cab523e122 receiver: add direct implementation of NEW FN INVERSION feature
receiver: fix bug in NEW FN INVERSION

receiver: fix bug in NEW FN INVERSION

receiver: fix bug in NEW FN INVERSION
2020-06-30 16:20:38 -04:00
Peter F. Patel-Schneider
070a2bf837 receiver: add new set of special keys from logitech documentation
receiver: descriptor and key for MX Vertical mouse
2020-06-28 02:45:20 +01:00
Peter F. Patel-Schneider
0836766bfb receiver: fix k375s Fn inversion 2020-06-26 05:07:47 -04:00
Peter F. Patel-Schneider
4379bd0613 receiver: update tooltips for several settings 2020-06-23 06:26:21 -04:00
Peter F. Patel-Schneider
ad2660a1bd receiver: minor updates to key remapping 2020-06-23 06:26:21 -04:00
Vinícius
6d16462988 receiver: simpler way to create setting information for device descriptors 2020-06-21 20:19:30 -04:00
Peter F. Patel-Schneider
e69c4c6b4f receiver: don't abort on unexpected device number, just warn 2020-06-21 12:16:04 -04:00
Vinícius
5e4c792a64 receiver: fix error when settings listed on descriptor.py return None
e.g. REPROG_CONTROLS_V4 when no keys can be reprogrammed by Solaar
2020-06-20 20:33:29 -04:00
Peter F. Patel-Schneider
c5ca2c2818 receiver: remove testing line from settings_template.py 2020-06-20 14:01:38 -04:00
Peter F. Patel-Schneider
f631f0f551 receiver: keep track of non-features to not continually try to find them 2020-06-20 13:38:09 -04:00
Vinícius
ef54a750dc receiver: implement KEYBOARD_DISABLE_KEYS feature
(the UI needs some improvement)
2020-06-20 13:30:32 -04:00
Peter F. Patel-Schneider
c99f470dd5 receiver: don't consider group 0 in reprogramming keys 2020-06-20 05:56:00 -04:00
Peter F. Patel-Schneider
1dfc4f22df receiver: add more special keys 2020-06-20 05:56:00 -04:00
Peter F. Patel-Schneider
68b4ca7abf receiver: make key settings structure uniform 2020-06-20 05:56:00 -04:00
Peter F. Patel-Schneider
09125bce2d receiver: filter out DJ reports that are not notifications 2020-06-20 05:31:45 -04:00
Peter F. Patel-Schneider
aeb03df3f7 receiver: fix bug reporting hid++ 1.0 batteries 2020-06-17 09:53:16 -04:00
Peter F. Patel-Schneider
f191d95990 misc: better reporting of errors 2020-06-17 09:53:16 -04:00
Peter F. Patel-Schneider
5926596298 receiver: add special keys and actions from Craft Keyboard 2020-06-16 17:42:34 -04:00
Peter F. Patel-Schneider
97fdcbf3ff receiver: modify and add a few names for special keys and actions 2020-06-16 15:21:10 -04:00
Peter F. Patel-Schneider
66c8621cab receiver: handle gmask 0 and group 0 in reprogrammable keys 2020-06-16 15:21:10 -04:00
Peter F. Patel-Schneider
a4bf1da6f9 docs: add information on key reprogramming 2020-06-16 15:21:10 -04:00
Peter F. Patel-Schneider
922414ae04 ui: add map choice control to ui 2020-06-16 15:21:10 -04:00
Peter F. Patel-Schneider
9beb13a305 receiver: add key reprogramming setting 2020-06-16 15:21:10 -04:00
Peter F. Patel-Schneider
89995656cd receiver: only check for device features once per device 2020-06-08 17:01:32 +01:00
Peter F. Patel-Schneider
f198b2706b cli: use Setting name and value to show feature status if not handled directly 2020-06-08 16:59:38 +01:00
Peter F. Patel-Schneider
bd0f9ca7d7 receiver: add feature to Setting class 2020-06-08 16:59:38 +01:00
Peter F. Patel-Schneider
784661bbc0 ui: remove maximum window size 2020-06-07 13:33:42 +01:00
Peter F. Patel-Schneider
579b09619b receiver: process battery voltage notifications 2020-06-06 12:59:26 -04:00
Peter F. Patel-Schneider
013f383bc8 ui: display battery voltage in ui if available 2020-06-06 12:59:26 -04:00
Peter F. Patel-Schneider
7936d2dd48 receiver: use battery voltage in read_battery if available 2020-06-06 12:59:26 -04:00
Peter F. Patel-Schneider
cb84d3b797 ui: remove translation for several strings that should not be translated in window.py 2020-06-06 12:59:26 -04:00
Peter F. Patel-Schneider
79947dca6c receiver: gather and show battery next level where available 2020-06-06 12:59:26 -04:00
Peter F. Patel-Schneider
d41c35b1c6 docs: minor update to usage.md 2020-06-05 12:18:25 -04:00
Peter F. Patel-Schneider
093169fb23 docs: update features.md with current status and add implementation section 2020-06-05 12:18:25 -04: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
4a108b3ab7 release 1.0.2 2020-05-22 01:43:53 +01:00
Peter F. Patel-Schneider
fac6cd6840 po: minor fix to es translation file 2020-05-22 01:19:20 +01:00
Peter F. Patel-Schneider
edf610d235 doc: add usage document 2020-05-22 01:18:44 +01:00
Peter F. Patel-Schneider
dac9c1bd8e doc: minor improvements to index.md 2020-05-22 01:18:44 +01:00
Peter F. Patel-Schneider
352375aa9a doc: minor improvements to installation.md 2020-05-22 01:18:44 +01:00
Peter F. Patel-Schneider
44722560d2 release 1.0.2rc3 2020-05-17 18:39:31 +01:00
daviddavid
101e24c7bf Update again French translation
- by David Geiger <david.david@mageialinux-online.org>
2020-05-17 11:57:11 -04:00
Peter F. Patel-Schneider
b7e8e646b5 ui: don't complain for receivers in other seats 2020-05-17 11:55:01 -04:00
Peter F. Patel-Schneider
97fa7de28a devices: pass arguments through in feature_choices_dynamic 2020-05-17 11:51:38 -04:00
Peter F. Patel-Schneider
302720b0db ui: add --battery-icons=symbolic option to prefer symbolic icons 2020-05-17 16:29:14 +01:00
daviddavid
813c238704 Update French translation
- by David Geiger <david.david@mageialinux-online.org>
2020-05-14 09:36:32 -04:00
Peter F. Patel-Schneider
354c914bd2 docs: improve installation document 2020-05-13 11:48:06 -04:00
daviddavid
574aee0cc7 po formatting updates (for release 1.0.2rc2) 2020-05-13 15:37:57 +01:00
Peter F. Patel-Schneider
a3cdcf4cd1 git: add lib/solaar.egg-info/ to .gitignore 2020-05-13 15:35:35 +01:00
Peter F. Patel-Schneider
592ced0a53 release 1.0.2rc2 2020-05-10 23:11:37 +01:00
Peter F. Patel-Schneider
3a2593798e release: fix up RELEASE.md 2020-05-10 03:49:32 +01:00
Peter F. Patel-Schneider
67b7d46844 docs: update ChangeLog 2020-05-07 19:33:57 +01:00
Peter F. Patel-Schneider
5411e43b77 ui: use Solaar icon instead of missing battery icons 2020-05-07 19:33:57 +01:00
Peter F. Patel-Schneider
66dc0bd285 release: remove packaging directory as it is not maintained 2020-05-02 18:44:34 +01:00
Peter F. Patel-Schneider
f641554ed5 release: release candidates do not have hyphen before rc 2020-05-02 17:42:13 +01:00
Peter F. Patel-Schneider
beec4c2130 release: change version from 1.0.2-rc1 to 1.0.2rc2 2020-05-02 17:42:13 +01:00
Peter F. Patel-Schneider
f5bf488ffc docs: update ChangeLog for 1.0.2rc2 2020-05-02 17:42:13 +01:00
Steven Lilley
1deaa09142 devices: Add Pebble M350 mouse 2020-05-02 17:25:29 +01:00
Peter F. Patel-Schneider
88a0dfff6f ui: add environment variable to switch to symbolic battery icons in tray 2020-05-02 10:28:51 -04:00
Peter F. Patel-Schneider
f28da6e7c4 docs: add a short discussion of how battery icons work 2020-05-02 10:28:51 -04:00
Peter F. Patel-Schneider
5290980ac8 ui: only use standard battery icons 2020-05-02 10:28:51 -04:00
Peter F. Patel-Schneider
4d23d3abac device: heuristic inference of battery level when charging and no discharging information available 2020-05-02 09:58:24 -04:00
Peter F. Patel-Schneider
0c4e757cf9 docs: add K600 TV, M350 WPID 4080, and MX Keys to devices.md and improve wording in it 2020-05-02 09:26:01 -04:00
Peter F. Patel-Schneider
d487a0d889 ui: remove assert that updated receiver is still in window 2020-05-02 14:07:42 +01:00
Roshan Shariff
65824a4c08 ui: add 'desktop-entry' hint to indicate notification source.
GNOME requires that notifications have a 'desktop-entry' hint to be
able to filter notifications by application. See
https://wiki.gnome.org/Initiatives/GnomeGoals/NotificationSource.

Fixes pwr-Solaar/Solaar#734
2020-05-01 13:56:22 -04:00
tarxf
58a1c7ffb0 docs: dixed name typo for MX Master 2S 2020-04-25 02:38:02 +01:00
Peter F. Patel-Schneider
1f896d2b9e docs: add changing device features to long description of Solaar 2020-04-22 21:37:25 +01:00
Peter F. Patel-Schneider
377c954933 install: remove Daniels email from setup.py 2020-04-20 12:01:57 -04:00
Peter F. Patel-Schneider
4744ce47b2 install: update installation directions and remove outdated rules/install.sh 2020-04-20 12:01:57 -04:00
Peter F. Patel-Schneider
b01b74f2a8 install: install udev rule with pip 2020-04-20 12:01:57 -04:00
Peter F. Patel-Schneider
6282ae05e8 install: remove incorrect code for determining autostart directory from setup.py 2020-04-20 12:01:57 -04:00
Peter F. Patel-Schneider
b5e1f47c50 ui: add setuptools global install share directory to icon directories 2020-04-20 10:32:40 -04:00
Peter F. Patel-Schneider
8ffaeb112f devices: add four older devices 2020-04-20 15:26:37 +01: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
Jan Szenborn
706ee2990f Improve polish translations 2020-04-20 15:25:47 +01:00
Peter F. Patel-Schneider
06875fb9ab release: update remaining version 1.0.1 to 1.0.2-rc1 where needed 2020-04-20 15:22:30 +01:00
Peter F. Patel-Schneider
f6b0cc59ed ui: only use file path for tray icon if icon name is file in current directory 2020-04-20 15:21:19 +01:00
Peter F. Patel-Schneider
e3aacdbf05 receiver: don't check that device kind matches feature kind 2020-04-20 15:20:03 +01:00
Peter F. Patel-Schneider
45dc81b4c4 docs: update information on pre-built packages 2020-04-20 15:19:22 +01:00
Peter F. Patel-Schneider
0324fd9a1e ui: more flexible way to determine icon from battery level 2020-04-18 14:27:42 +01:00
Thomas Uhle
ca9f9b3447 ui: add support for Ayatana AppIndicator 2020-04-07 18:58:18 -04:00
Peter F. Patel-Schneider
624247d378 install: fix up errors when required packages not installed 2020-04-05 20:55:32 +01:00
Thomas Uhle
5f8dbdeb6d ui: fix tooltip description
The program's name is printed twice if AppIndicator is used and no receiver
is found because AppIndicator always adds the program's name as a title to
the tooltip.
2020-04-01 11:10:54 -04:00
Thomas Uhle
2bdb844557 ui: fix end of iterative calls to _blink()
Prepare _icon_before_attention for the next iteration by reinitializing it
at the end of the current iteration.
2020-04-01 11:10:54 -04:00
Thomas Uhle
422f336d70 ui: add missing parentheses to function call
Compare function's return value to AppIndicator3.IndicatorStatus.ATTENTION
instead of the function object reference.
2020-04-01 11:10:54 -04:00
Peter F. Patel-Schneider
563ef0d8ef receiver: remove extra argument in call when unpairing 2020-03-22 17:23:28 +00:00
Peter F. Patel-Schneider
3a85c4f64b UI: lookup attention icon filename directly to get around bug in libappindicator 2020-03-17 23:17:59 +00:00
Filipe Laíns
4056f5b9d3 release.sh: simplify script
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-03-16 21:59:41 +00:00
Filipe Laíns
442a7d18a5 release.sh: document release process
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-03-16 21:59:41 +00:00
Filipe Laíns
79be4b20d7 release.sh: don't throw github release creation error on dry run
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-03-16 21:59:41 +00:00
Filipe Laíns
b2f3b56c31 release 1.0.2-rc1
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-03-16 20:57:35 +00:00
Peter F. Patel-Schneider
072f932206 ui: handle devices and receivers with no firmware information 2020-03-16 20:55:18 +00:00
Filipe Laíns
d5a3a4fe7e release.sh: initial script
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-03-16 16:58:41 +00: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
1eef88eb44 cli: handle receivers with no firmware information 2020-03-16 16:04:16 +00:00
Peter F. Patel-Schneider
eda1399330 cli: force unpairing attempt when using cli 2020-03-15 23:34:51 +00:00
Peter F. Patel-Schneider
8dbc4b5707 docs: Update ChangeLog 2020-03-15 23:33:47 +00:00
Peter F. Patel-Schneider
687a28d2c2 UI: lookup icon filenames directly to get around bug in libappindicator 2020-03-15 22:00:56 +00:00
Peter F. Patel-Schneider
f733390bd1 install: autostart .desktop file has --window=hide 2020-03-15 22:00:21 +00:00
Peter F. Patel-Schneider
ac6fa9643f UI: change default for --window to show 2020-03-15 22:00:21 +00:00
Peter F. Patel-Schneider
f28053a09a docs: improve documentation on required packages 2020-03-15 21:59:42 +00:00
gogogogi
49145ae272 translations: Update Croatian language translation
* Update Croatian language

* Update version
2020-03-15 16:30:00 -04:00
Peter F. Patel-Schneider
af26870e83 docs: use correct name of udev rules file in installation directions 2020-03-08 15:15:17 +00:00
Peter F. Patel-Schneider
007163a563 docs: update ChangeLog 2020-03-08 15:15:17 +00:00
Peter F. Patel-Schneider
a9acdbe47a receiver: add c537 nano receiver 2020-03-06 18:00:37 -05:00
Peter F. Patel-Schneider
955df30c7f upower: properly add signal receiver 2020-02-22 08:46:56 -05:00
Peter F. Patel-Schneider
23c0397764 listener: mark device as inactive after resume so that settings are correctly pushed 2020-02-22 08:46:56 -05:00
Peter F. Patel-Schneider
789f5f05c3 receiver: don't check features when device is not online 2020-02-22 08:46:56 -05:00
Peter F. Patel-Schneider
ea2c22c015 receiver: fix seldom-encountered bug for devices that have no features set up yet 2020-02-21 16:52:28 +00:00
Peter F. Patel-Schneider
1c09b9c45d upower: add in logind signals for suspend/resume 2020-02-21 16:52:28 +00:00
Peter F. Patel-Schneider
dd9626f7a4 docs: ask for git describe output if running a cloned version 2020-02-21 16:48:05 +00:00
Rijnhard Hessel
35909afb0d packaging: remove solaar-gnome3 package 2020-02-21 09:50:30 -05:00
Rijnhard Hessel
8e67bbbc11 receiver: add safety for non-compliant mouse features
receiver: safely handle errors with check_feature to allow device to be detected even if some features are inconsistent
2020-02-21 09:33:14 -05:00
Peter F. Patel-Schneider
a5813e4e23 packaging: remove last vestiges of python2 2020-02-20 19:49:38 +00:00
Peter F. Patel-Schneider
d439d43be6 docs: replace dummy URL for Solaar with real URL 2020-02-20 12:27:41 +00:00
Peter F. Patel-Schneider
11465f2b2a cli: add probe command to show receiver register information 2020-02-18 23:21:59 +00:00
Peter F. Patel-Schneider
079f2dacd4 docs: add information on --windows flag and rewrite other bits of index.md 2020-02-18 08:32:02 -05:00
Peter F. Patel-Schneider
7c6bd4202d receiver: use dictionary for expected message length checking; ignore messages with unknown report ids 2020-02-18 08:14:22 -05:00
Peter F. Patel-Schneider
1740a9a8c4 receiver: segregate and standardly handle DJ notifications separately - just ignore them all for now 2020-02-18 08:14:22 -05:00
Peter F. Patel-Schneider
0cadc3247e receiver: don't create notifications for movement and key reports 2020-02-18 08:14:22 -05:00
Peter F. Patel-Schneider
e23de2ee9f ui: add quit button to main window 2020-02-18 13:14:10 +00:00
Peter F. Patel-Schneider
8fb52a3f37 ui: don't show warning in pairing window for receivers with unlimited pairing 2020-02-18 12:19:45 +00:00
Peter F. Patel-Schneider
3edac85b90 ui: turn on window manager notifications again 2020-02-18 12:17:49 +00:00
Peter F. Patel-Schneider
64c76e51ef receiver,cli,ui: minor code cleanup 2020-02-17 11:53:39 +00:00
Peter F. Patel-Schneider
02cac598a0 receiver: all nano receivers re-pair but don't unpair 2020-02-17 11:53:39 +00:00
Peter F. Patel-Schneider
02a47b4003 install: adjust autostart desktop installation to use usual desktop file 2020-02-17 08:35:47 +00:00
Peter F. Patel-Schneider
4afe8c893b ui: add option to show the main window or run solaar without tray 2020-02-17 08:35:47 +00:00
Peter F. Patel-Schneider
5afa094175 ui: Add message about remaining pairings to pairing window when receiver has limited pairings 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
196705ba1f docs: fix information about receiver c534 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
4c46a999f7 gui: treat nano protocol disconnections correctly when pairing 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
7bd31c0d95 cli: complain when trying to unpair from a receiver that does not unpair 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
dc2a1adf26 ui: handle re-pairing receivers correctly when pairing 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
e89b50cdf2 cli: correct reporting for pairing with receivers that re-pair (i.e., c534) 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
d08e0a9574 cli: Show a positive response instead of an error when receiver pairs on already-used slot in CLI 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
22d37c4c1c ui: Better determination in GUI of when receiver may pair (still might be conservative) 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
546ccb7ac2 receiver: determine remaining pairings (if receiver has this) and display in solaar show and main window 2020-02-17 08:34:53 +00:00
Peter F. Patel-Schneider
1ab03d4c9f receiver: add check for bad results from getting the usb device 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
a6fcb75aa8 receiver: get receiver name from receiver information list 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
907c5ab075 receiver: change usb identification of receivers to dictionary to allow adding other fields, add receiver name to dictionary 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
515f994ab8 receiver: ignore disconnects of disconnected devices 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
25905c5d77 receiver: Show type of receiver in CLI show command 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
babf0f4ded receiver: Show serial number in stringify of receivers 2020-02-16 22:16:37 +00:00
Peter F. Patel-Schneider
41664b8e21 docs: update changelog to 11 February 2020 commits 2020-02-16 22:07:45 +00:00
svntjng
5c080a7831 docs: add supported feature for M330 2020-02-16 22:06:12 +00:00
Peter F. Patel-Schneider
5aa4fa0239 update version in docs/_config.yml to 1.0.1 2020-02-11 15:55:15 +00:00
Peter F. Patel-Schneider
4f4e610635 receiver: battery level 0 is unknown level 2020-02-10 18:44:28 +00:00
Peter F. Patel-Schneider
39791be440 doc: fix typos and improve some wording 2020-02-06 19:09:00 +01:00
Peter F. Patel-Schneider
2814350f9f doc: fix wording about supported Nano receivers 2020-02-06 19:09:00 +01:00
Peter F. Patel-Schneider
4a28b48275 doc: add paragraph on firmware 2020-02-06 19:09:00 +01:00
Peter F. Patel-Schneider
97474a21de doc: fix formatting, add receivers, change version 4.5 to 2.0 2020-02-06 19:09:00 +01:00
Peter F. Patel-Schneider
719106bf0f doc: solaar does keep track of device status 2020-02-06 19:09:00 +01:00
Peter F. Patel-Schneider
0a735a32ed doc: better documentation: devices and capabilities 2020-02-06 19:09:00 +01:00
Dmitriusan
bd26b9340d scripts/debian: switch to python3 2020-02-06 19:06:47 +01:00
Peter F. Patel-Schneider
f45ae5ffad solaar: use python3, not generic python 2020-02-06 17:37:10 +01:00
Peter F. Patel-Schneider
0520dde990 receiver: use None for serial number of c534 2020-02-04 22:04:43 +01:00
Peter F. Patel-Schneider
e53781ec6e install: autostart desktop file starts with tray only 2020-01-22 22:22:14 +00:00
Peter F. Patel-Schneider
1bc189e2fe ui: add --tray option to start without window visible 2020-01-22 22:22:14 +00:00
Peter F. Patel-Schneider
91bcfa28ea docs: minor changes to installation.md to eliminate python2 support 2020-01-21 21:51:35 +00:00
Filipe Laíns
64c1de32da setup.py: drop python 2 support
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-21 21:51:25 +00:00
Peter F. Patel-Schneider
56762b5494 device: move persister from Setting to _DeviceDescriptor to get around problem with settings discovered after startup 2020-01-21 03:23:25 +00:00
Peter F. Patel-Schneider
77e21a0b63 ui: fix crash when styles add padding by not setting 1-pixel columns; slightly better window layout; add style class to window 2020-01-21 03:11:35 +00:00
Peter F. Patel-Schneider
d6fa5269c5 ui: don't ignore offline devices when determining whether pairing is possible 2020-01-21 03:08:49 +00:00
Peter F. Patel-Schneider
0198d58dc7 hidpp20: fix error when showing battery
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:18:33 +00:00
Filipe Laíns
c30f0a79bd docs: features: add partly working and unsupported status
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:18:30 +00:00
Filipe Laíns
89ee83b906 docs: features: change checkmark style
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:18:11 +00:00
Filipe Laíns
0bef7b84f8 docs: features: make the table easier to maintain
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:18:08 +00:00
Filipe Laíns
c3e90bc73e docs: features: make the table readable in plain ascii
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:17:54 +00:00
Alex Cherkayev
814b7f30ba docs: features: added some missing feature names and list of implemented features
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2020-01-19 18:17:18 +00:00
Alex Cherkayev
8039c035a7 devices: Add new variant of K800 keyboard
docs: Add K800 new variant to supported
2020-01-12 16:11:03 +00:00
effective-light
430b70711b hidpp20: features: add BATTERY_VOLTAGE (0x1001) support
Signed-off-by: Filipe Laíns <lains@archlinux.org>

Co-authored-by: Filipe Laíns <lains@archlinux.org>
2020-01-12 16:05:21 +00:00
nightsky30
82915eea4b docs: update the USB IDs list 2019-12-29 14:46:59 +00:00
Peter F. Patel-Schneider
995544396c receiver: don't log messages with unknown report IDs 2019-12-26 16:10:48 +00:00
Peter F. Patel-Schneider
4678f52293 don't have window always be on top 2019-12-24 18:54:12 +00:00
Peter F. Patel-Schneider
26c5a5f9ba clarify license status; fix debian packaging copyight notice 2019-12-24 18:53:43 +00:00
Peter F. Patel-Schneider
c6ccc0638d devices: add M310 2019-12-24 12:49:00 +00:00
drupal-daffie
6ba8c6c3fc setup: use setuptools if available 2019-12-24 12:16:35 +00:00
Peter F. Patel-Schneider
9087f4187c docs: adjust documentation to new changes 2019-12-24 12:13:58 +00:00
drupal-daffie
673c81c096 docs: devices: add MX Master 2s 2019-12-16 15:33:50 +00:00
drupal-daffie
43bfa80753 docs: devices: add Mx Master 3 2019-12-16 12:03:03 +00:00
gogogogi
3884ce14d7 docs: readme: add new ppa 2019-12-14 21:22:25 +00:00
spaced
4fafd4f6be hidpp20: features: add very basic implementation of 0x1982 (Backlight 2)
Fixes #547
2019-12-12 18:56:08 +00:00
Chris Rainey
0bec0e02b1 docd: devices: add M330 2019-12-10 23:36:31 +00:00
Filipe Laíns
59c0367283 github: add issue templates 2019-12-01 21:48:57 +00:00
marcelkarger
63f523dac6 po: update German translation 2019-11-30 23:14:32 +00:00
Heimen Stoffels
4822975acb po: added Dutch translation 2019-11-30 23:13:26 +00:00
Chad Condon
c389c9c2b7 ur: repair low resolution smooth scrolling 2019-11-30 23:12:07 +00:00
KTB
76e70799aa Update devices.md for Anywhere MX 2 - R/W DPI
Simple doc update to show that Solaar supports changing DPI for the Logitech Anywhere MX 2.
2019-10-20 23:55:02 +01:00
Tom Swartz
2a94cc9233 Fix typos in docs 2019-10-20 23:53:45 +01:00
Tom Swartz
ae9e862f19 Fix typos in comments 2019-10-20 23:53:45 +01:00
Tom Swartz
12f4e187d6 Fix typos in logging, output 2019-10-20 23:53:45 +01:00
Filipe Laíns
51dd2a5d28 notifications: add missing protocol names
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-10-20 23:19:34 +01:00
Alex Cherkayev
6981555804 notifications: fix battery status notification parsing
Fix indicator tooltip (duplicate Solaar line, python list instead of battery status).
2019-08-20 09:40:39 +02:00
spaced
3583759d3a devices: basic support for craft keyboard
* basic support for craft keyboard
* fix issue where _(status) throws exception because namedInt with UTF8.decode
2019-08-20 09:39:11 +02:00
david_david
c92a889b68 po: formatting updates
* po formatting updates

- Update French translation by David Geiger <david.david@mageialinux-online.org>
- Update version into setup.py file

* Update version in fr.po
2019-08-20 09:37:15 +02:00
Peter Wu
b9fb005c9c docs: Deduplicate README contents, use a symlink
docs/index.md and README.md are almost identical, except for some paths
and the metadata table on top of the file. Use absolute paths to the
website to avoid breaking links, and symlink README.md.
2019-08-20 09:36:16 +02:00
Zachary Cook
a06ea6de11 data: fix icon theme for battery level
It was previously assigning levels 1-89 to caution and 90+ to full, which was unintended due to the floor division by 100
2019-08-20 09:35:31 +02:00
Andreas Schneider
a868b477e1 Fix reading and storing DPI in config settings
Fixes #328
Fixes #356
Fixes #545
2019-08-20 09:24:22 +02:00
spaced
c799e038de added to list of supported devices 2019-08-20 09:23:38 +02:00
spaced
8468be2126 add doc for silent mouse M585/M590 2019-08-20 09:23:38 +02:00
spaced
1ff9c3a40b support for silent mouse M585/M590 2019-08-20 09:23:38 +02:00
Chris Johnston
9b201f6b0d copy updated README content 2019-07-27 15:56:53 +01:00
Chris Johnston
afda6f9f66 remove all google analytics stuff from page templates 2019-07-27 15:56:53 +01:00
Chris Johnston
5cc0b8854d update config.yml for new repo path 2019-07-27 15:56:53 +01:00
Chris Johnston
f88951c56d Squash previous changes and rebase master branch
Set theme jekyll-theme-slate

update _config.yml

move some files around

add an index file

delete files that will no longer be needed

include jekyll front matter

Update the index page layout to use updated template

re-create the page layout from the updated template

add a favicon

remove manual gh pages build script

use master branch docs/ folder instead

add favicon to default layout

move layouts and includes back because of restriction with gh pages

testing: move index back into project root

move everything under docs, including config.yml

dont put the favicon in _includes

Fix building locally, fix logo

- resize the original logo document so that it doesn't have extra whitespace
- style the logo to match the original page
- fix issue when building locally, repo format was incorrect

Ignore files that are specific to documentation

add a readme that describes how to build the docs

remove downloads, since installation instructions are provided elsewhere

fix broken links in index page

fix the page header on all non-index pages

use site.baseurl for images

fix urls when on testing site with baseurl
2019-07-27 15:56:53 +01:00
Filipe Laíns
2aab7f71fd release 1.0.1
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 16:55:51 +01:00
Filipe Laíns
6376980213 udev: fix c52b + MX Master
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 17:50:13 +02:00
Filipe Laíns
1bb08d011d base-usb: add new Lightspeed receiver
used in the G305

Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 15:23:55 +01:00
Filipe Laíns
966c55e69d base-usb: fix non-unifying for linux 5.2
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 15:18:24 +01:00
Filipe Laíns
6b14004a6f udev: fix writting to the device
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 15:10:59 +01:00
Daehyeok Mun
7a4f7bbb84 docs: fix broken github.io link to new repo url
Signed-off-by: Daehyeok Mun <daehyeok@gmail.com>
2019-07-26 15:38:16 +02:00
Matthias Fulz
155e2f8c40 fix: #531 #537. Better handling of EPIPE during hid write. 2019-07-26 15:35:21 +02:00
Filipe Laíns
6a1968beff release 1.0.0
Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-26 14:33:16 +01:00
Filipe Laíns
f4557233f1 base-usb: add support for Lightspeed receivers
They way we are currently identifying the type of a receiver (unifying,
nano, lightspeed) in the Receiver class is pretty bad. The correct
approach would be to specify the receiver type name string in
base_usb.py.

Signed-off-by: Filipe Laíns <lains@archlinux.org>
2019-07-16 11:10:03 +02:00
muzena
a597b81f5a Update Croatian translation 2019-07-14 23:57:15 +01:00
Peter Wu
a587ae65d1 Merge pull request #477 from doctor64/pointer_info_show
Added status info print and rename some functions
2019-06-29 18:08:52 +02:00
Peter Wu
6522b5fef0 Merge pull request #514 from pdecat/fix-zh_TW
Fix zh_TW translation (nplural=1)
2019-06-29 18:05:49 +02:00
Peter Wu
7f78f0c580 Merge pull request #515 from pdecat/fix-icon-dep
Add gnome-icon-theme as an acceptable dependency for icons
2019-06-29 18:05:14 +02:00
Peter Wu
127a8053d8 Merge pull request #521 from kacpi2442/master
Added basic support for Lenovo dongle,
https://download.lenovo.com/consumer/options/lenovo_n50_wireless_optical_mouse.pdf
2019-06-29 18:04:25 +02:00
Patrick Decat
6c0acee645 Fix UnicodeDecodeError with ngettext and python2 2019-06-29 18:01:54 +02:00
nicolas
60c52eb13f Name for K780
“Multi-Device” and not “Solar”
2019-06-29 17:59:44 +02:00
Benoit Hanotte
8bac8d68f4 Add MX Master settings
Add the same settings to the logitech MX Master as the one from the MX
Master 2 (scroll wheel DPI, smart scoll sensitivity).
2019-06-29 17:57:02 +02:00
Maarti
087a5d2c42 Update of the installation instructions for Debian (#490)
Solaar is available on official Debian repository and the old repo link
`https://pwr.github.io/Solaar/packages/` is dead and causes `404 Not
Found` error and `The repository 'http://pwr.github.io/Solaar/packages
./ Release' does not have a Release file.` error when doing `apt update`
so I updated the installation instructions.
2019-06-29 17:56:07 +02:00
kacpi2442
481511b6c2 Added basic support for Lenovo dongle 2019-04-15 15:40:40 +02:00
Patrick Decat
21d98294bd Add gnome-icon-theme as an acceptable dependency for icons 2019-03-26 15:46:14 +01:00
Patrick Decat
ebbb54758b Fix zh_TW translation (nplural=1) 2019-03-26 15:12:44 +01:00
Peter Wu
c07c115ee3 Avoid collision for wpid 4055 (M185 vs M235)
Hopefully use of a slash does not cause issues. M505 already uses slash
in its codename.

Fixes #499
2019-01-30 16:58:00 +01:00
Peter Dave Hello
8c02320795 docs/devices: Add m235 device information 2019-01-30 16:55:24 +01:00
Markus Heiser
932164458a icons: add application icons from repo's $git-toplevel/share/solaar/
Add application path from the repository to the search paths.

When you Install a project in editable mode (i.e. setuptools "develop mode")
from a local project path, the application path is ``./share``, relative to
git's top level folder. Add this path at the end of search path::

  echo "$(git rev-parse --show-toplevel)/share"
2019-01-30 12:38:54 +01:00
Markus Heiser
de79bf1b5c gtk.main(): make source more readable + comment about cli & gui 2019-01-30 12:38:54 +01:00
Markus Heiser
5944103aef setup.py: fix install_requires and add comment about OS packages 2019-01-30 12:38:54 +01:00
Markus Heiser
ab4226e066 setup.py: fix ModuleNotFoundError: No module named 'solaar'
Fix the "chicken or the egg" problem: while installing solaar, setup.py tries to
import solaar. This will only work if solaar already is installed before. On
first time installation a import exception is raised.::

$ pip install git+https://github.com/pwr/Solaar.git
Collecting git+https://github.com/pwr/Solaar.git
  Cloning https://github.com/pwr/Solaar.git to /tmp/pip-req-build-xzyoskf5
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-req-build-xzyoskf5/setup.py", line 11, in <module>
        from solaar import NAME, __version__
    ModuleNotFoundError: No module named 'solaar'
2019-01-30 12:38:54 +01:00
Peter Dave Hello
a66121db0d Optimize PNG images losslessly with zopflipng (#484)
11 images recompressed as below:

jekyll/images/bg_hr.png              | Bin 943 -> 96 bytes
jekyll/images/blacktocat.png         | Bin 1428 -> 432 bytes
jekyll/images/icon_download.png      | Bin 1162 -> 230 bytes
jekyll/images/sprite_download.png    | Bin 16799 -> 14650 bytes
share/solaar/icons/light_000.png     | Bin 1750 -> 1657 bytes
share/solaar/icons/light_020.png     | Bin 1942 -> 1895 bytes
share/solaar/icons/light_040.png     | Bin 1578 -> 1461 bytes
share/solaar/icons/light_060.png     | Bin 2442 -> 2319 bytes
share/solaar/icons/light_080.png     | Bin 1910 -> 1803 bytes
share/solaar/icons/light_100.png     | Bin 2376 -> 2249 bytes
share/solaar/icons/light_unknown.png | Bin 1108 -> 1007 bytes
2019-01-30 12:36:20 +01:00
Peter Dave Hello
eacfdea37f Add zh_TW Traditional translation po file (#485) 2019-01-30 12:35:35 +01:00
Peter Dave Hello
68b1f4e413 Update Data of Wireless Mouse M235 (#486) 2019-01-30 12:35:20 +01:00
CD Athuraliya
947035a7b7 Add K400 Plus (#492) 2019-01-30 12:30:36 +01:00
Xaver Maierhofer
e54134cda9 Update arch package information (#496) 2019-01-30 12:29:58 +01:00
Beni Cherniavsky-Paskin
1609c3e98a Display "K400 Plus" rather than just "Plus" (#483) 2018-12-30 18:19:38 +01:00
Alex Cherkayev
ed9aa76547 Added status info on features MOUSE_POINTER, VERTICAL_SCROLLING, HI_RES_SCROLLING, POINTER_SPEED and LOWRES_WHEEL to solaar show.
Renamed functions for HI_RES_SCROLLING and LOWRES_WHEEL features for consistency.
2018-11-20 16:29:38 +02:00
Danny
b8529030e6 setup.py: detect "--prefix=" correctly. (#433) 2018-08-15 18:46:50 +02:00
Peter Wu
1412a07899 Merge pull request #440 from nostrad/master
Improve trackball support
2018-08-15 15:14:08 +02:00
Mattias Jernberg
f79ad67ea7 Add trackball for all settings that mice have 2018-08-13 18:44:16 +02:00
Mattias Jernberg
dd8018a4d5 Prepare for allowing multiple device kinds in settings 2018-08-13 18:44:16 +02:00
Mattias Jernberg
350784eb70 Print an error message when assertion fails 2018-08-13 18:36:52 +02:00
Peter Wu
f0fc63e5b7 Merge pull request #295 from cschreib/master
Added support for MintX icon set (for Linux Mint integration)
2018-08-13 11:33:10 +02:00
Peter Wu
51375d4510 Merge pull request #454 from lopsided98/tree-scroll-fix
Fix device tree GUI hierarchy (Closes #453).
2018-08-12 12:22:50 +02:00
Ben Wolsieffer
2c0ea34694 Fix device tree GUI hierarchy. 2018-08-11 16:24:15 -04:00
Peter Wu
867edf8516 Merge pull request #146 from tristianc/master
Added border around tree view.
2018-08-11 17:55:37 +02:00
Peter Wu
dcd1a88250 Merge pull request #390 from Toshik1978/master
Added Logitech K375s support
2018-08-11 16:36:13 +02:00
Peter Wu
8f95dd323d Merge pull request #410 from lckarssen/add-mx-ergo
Update devices.md with MX Ergo trackball
2018-08-11 16:27:29 +02:00
Peter Wu
336b778398 Merge pull request #452 from lopsided98/hidpp-4.5-fixes
Fix errors related to sleep and power on/off (especially HID++ >=2.0 devices).

Closes #414 by @SonicFrog who originally came up with a similar fix for the connection notice.
2018-08-11 16:26:25 +02:00
Peter Wu
572c7f5e59 Merge pull request #450 from lopsided98/new-m705
Add support for new version of M705 (M-R0073).
2018-08-11 16:11:37 +02:00
Peter Wu
6b12b7935f Merge pull request #428 from Lin-Buo-Ren/patch-add-mk240-nano-information
Information and comments regarding Logitech MK240 NANO Combo
2018-08-11 16:06:08 +02:00
Peter Wu
ade2fbacec Merge pull request #399 from Valantin/patch-1
Add MX Master 2S descriptor
2018-08-11 16:03:18 +02:00
Ben Wolsieffer
a59368f3e7 Fix issues with HID++ >= 2.0 devices (particularly related to sleep).
* Don't assume 0x41 messages only occur when a device is first paired
    (prevents errors when waking from sleep or turning a device on)
  * Delay reads/writes when a device is powered on, to prevent broken pipe
    errors (hacky solution).
  * Don't clear status when a device connects, preventing settings from being
    cleared when a device sleeps or is turned off.
  * Fix typos.
2018-08-10 23:15:37 -04:00
Jason Tibbitts
d021d87656 Python 3.7 compatibility fixes
This fixes the python 3.7 incompatibilities arising from 'async'
becoming a reserved word.

The file lib/solaar/async.py is renamed to asks.py.  I picked the name
because it defines the TaskRunner class and it's the best I could come
up in fifteen seconds.

The async function in solar/ui/__init__.py is renamed to ui_async, and
the various imports of that function are changed to match.

Without this patch it doesn't build at all.  I am running with this
patch applied and everything appears to work as expected.

Signed-off-by: Jason Tibbitts <tibbs@math.uh.edu>
2018-08-07 12:51:32 -04:00
Ben Wolsieffer
5d0d353c74 Add support for new version of M705 (M-R0073). 2018-08-05 00:10:59 -04:00
林博仁(Buo-ren, Lin)
e00d680fc9 Information and comments regarding Logitech MK240 NANO Combo
Signed-off-by: 林博仁(Buo-ren, Lin) <Buo.Ren.Lin@gmail.com>
2018-04-12 14:15:47 +08:00
Peter Wu
59b7285fdf Merge pull request #412 from aimylios/aimylios-fedora
Update link to Fedora package in README.md
2018-02-02 16:20:47 +01:00
aimylios
988bdc2c8d Update link to Fedora package in README.md
The "Fedora Package DB" is not updated any more, refer to the new "Fedora Packages" instead.
2018-01-14 12:15:38 +01:00
Peter Wu
1a67b33860 Merge pull request #382 from mchehab/fix_solaar_start_issues
Fix solaar start issues
2018-01-12 18:11:45 +01:00
Lennart C. Karssen
d43bffc9d9 Update devices.md with MX Ergo trackball
This commit adds the Logitech MX Ergo to the list of supported devices.
2018-01-04 16:52:23 +01:00
Roberto Valentini
f8079f4f9d Add MX Master 2S descriptor
Add descriptor for MX Master 2S to support High Resolution Wheel, correct charge level and DPI configuration
2017-11-16 14:53:27 +01:00
Anton Krivenko
47e7f997d5 Added Logitech K375s support 2017-10-14 22:08:40 +03:00
Peter Wu
8c0cf9fe9b Merge pull request #342 from jrbenito/MK270-desc
Mk270 Combo information and descritptors
2017-09-26 23:16:58 +01:00
Peter Wu
fa8bd83ba3 Merge pull request #387 from ryantig/patch-1
Minor installation.md edit; gpasswd cmd
2017-09-26 23:13:59 +01:00
ryantig
697fb999b4 Minor installation.md edit; gpasswd cmd
Add '-a' after gpasswd to add USER to group plugdev.
Per: ➜ gpasswd --help
Usage: gpasswd [option] GROUP

Options:
  -a, --add USER                add USER to GROUP
  -d, --delete USER             remove USER from GROUP
  -h, --help                    display this help message and exit
  -Q, --root CHROOT_DIR         directory to chroot into
  -r, --remove-password         remove the GROUP's password
  -R, --restrict                restrict access to GROUP to its members
  -M, --members USER,...        set the list of members of GROUP
  -A, --administrators ADMIN,...
                                set the list of administrators for GROUP
Except for the -A and -M options, the options cannot be combined.
2017-09-26 09:23:35 -07:00
Josenivaldo Benito Jr
aeb943fc9e Descriptor for K270 and M185
This K270 is the non unifying version and we know that it has, at
least, one variation (unifying) out there.

M185 mouse is also older, as per PR #337 there is at least two newer
versions of this mouse.

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-09-25 14:57:11 -03:00
Josenivaldo Benito Jr
434af009cb Information regarding MK270 combo
This combo is composed by K270 keyboard (non unifying version) and M185
mouse. Both paired to a nano receiver with PID c534.

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-09-25 14:55:47 -03:00
Peter Wu
cc010cb653 Merge pull request #385 from mchehab/pt-br-translation
Update pt_BR translation
2017-09-21 01:52:22 +01:00
Mauro Carvalho Chehab
e450e959a6 Update pt_BR translation
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-20 21:48:08 -03:00
Peter Wu
10f3421021 Merge pull request #345 from jrbenito/M510_v4.5
Add M510 (new version) to descriptors
2017-09-21 00:30:31 +01:00
Peter Wu
8eba60d617 Merge pull request #360 from lasers/remove-dead-links
Remove dead links
2017-09-21 00:25:11 +01:00
Peter Wu
e3d658ea10 Merge pull request #351 from mchehab/mx_anywhere2-v5
Mx anywhere2 v5
2017-09-21 00:16:15 +01:00
Peter Wu
ef1c051e10 Merge pull request #383 from skarmoutsosv/skarmoutsosv-patch-1
Update el.po
2017-09-21 00:11:04 +01:00
Peter Wu
bc566718b4 Merge pull request #384 from michal2229/master
Updated Polish translation
2017-09-21 00:09:05 +01:00
Michal B
22719f21fc Updated Polish translation 2017-09-19 20:00:43 +02:00
Vangelis Skarmoutsos
c51daa922c Update el.po 2017-09-11 21:02:14 +03:00
Mauro Carvalho Chehab
632d8804be listener: don't add elements if queue is full
When Solaar is loaded, if a large number of events happen,
it will lose the register events, as the queue size is too
small (16). So, check if the queue is full, in order to
avoid losing those important events.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-11 10:36:12 -03:00
Mauro Carvalho Chehab
a4b7194490 listener: fix device registration logic
The "already_known" var actually doesn't track if the device was
already registered or not.

That causes race issues at Solaar, causing it to sometimes not
detect a device.

Change the logic to always call register_new_device if the
corresponding events happen, and updating already_known
to reflect it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-11 10:34:23 -03:00
Mauro Carvalho Chehab
ea80c6d639 ui: notify.py: disable python Notify extension
For whatever reason, this doesn't work on Fedora 26:

06:47:05,925    DEBUG [ReceiverListener:hidraw1] logitech_receiver.base: (13) => r[20 02 0100 0000000000000000000000]
06:47:05,925    DEBUG [ReceiverListener:hidraw1] logitech_receiver.notifications: <PairedDevice(2,2011,K520)> (1.0) custom notification Notification(2,01,00,000000000$
06:47:05,925  WARNING [ReceiverListener:hidraw1] logitech_receiver.notifications: <PairedDevice(2,2011,K520)>: unrecognized Notification(2,01,00,000000000000000000000$
06:47:08,806    ERROR [MainThread] solaar.ui.notify: showing <Notify.Notification object at 0x7f82c2484640 (NotifyNotification at 0x556fa0fc5a40)>
Traceback (most recent call last):
  File "./devel/solaar/lib/solaar/ui/notify.py", line 145, in show
    n.show()
Error: g-io-error-quark: Error calling StartServiceByName for org.freedesktop.Notifications: Timeout was reached (24)


So, disable it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-11 07:02:48 -03:00
Mauro Carvalho Chehab
a01e4b2efe hidpp20.py: handle gracefully errors at REPROG_CONTROLS_V4
At least with Anywhere Mouse MX 2, one reprogrammed key
fails to read:

    ERROR [MainThread] logitech_receiver.base: (3) device 3 error on feature request {0829}: 2 = invalid argument

That causes "solaar show" to crash.  Instead, let's handle
errors there gracefully, reporting it as:

         7: unknown:00C3              , default: unknown:009C                => unknown:00C3
             virtual, pos:0, group:4, gmask:0

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-10 22:53:19 -03:00
Mauro Carvalho Chehab
801bdfa224 Remove the hid++ high-res wheel notification
The best is to make the logitech-hidpp driver to switch to
hid++ notification mode when it starts. As we don't want users
to mangle with it, let's remove support from it.

PS.: I opted to keep this as a separate patch. This way, if
anyone needs to add support for it, in order to debug the
driver, it is just a matter of reverting this patch.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-10 21:49:18 -03:00
Mauro Carvalho Chehab
410d100dc6 Add notification for high-resolution Wheel events
The event at address 0 is only produced while in HID++ mode.

The rachet event (address 0x10) happens on both HID and
HID++ modes.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-10 21:49:18 -03:00
Mauro Carvalho Chehab
7078750a3f MX Anywhere2: Correct feature Smooth Scrool
Set wrongly to HI_RES_SCROLLING. Correct it to HIRES_WHEEL as reported
by MX Anywhere2.

relates to #283

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-09-10 21:49:18 -03:00
Mauro Carvalho Chehab
360c92f6b0 Add support for CLI show to display High Res Wheel settings
Add support for the high resolution wheel found on MX Anywhere 2.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-09-10 21:44:30 -03:00
lasers
2377fef3a8 Remove dead links 2017-07-24 03:44:00 -05:00
Peter Wu
684afa871e Merge pull request #337 from doctor64/m185
Basic support for M185 mouse
2017-07-17 00:08:19 +02:00
Peter Wu
dd2f884504 Merge pull request #354 from luzfcb/patch-1
update ubuntu solaar package informations
2017-04-16 12:20:27 +02:00
Fábio C. Barrionuevo da Luz
9dd05bb727 update ubuntu solaar package informations 2017-04-10 21:26:23 -03:00
Alex Cherkayev
e96a0fbfbb Add docs on both variants of Logitech M185 2017-03-21 18:03:07 +02:00
Alex Cherkayev
f9618dd0ab Add M185 keys reporting using REPROG CONTROLS V4 in cli
Add smooth scrolling using LOWRES_WHEEL
Add mouse speed selection using POINTER_SPEED
2017-03-21 18:02:59 +02:00
Alex Cherkayev
db0656967b Add basic 0xc534 receiver and M185 mouse support
Fix connection notification protocol for M185
Fixes from review
2017-03-21 18:00:44 +02:00
Peter Wu
53ec751cf1 Merge pull request #343 from jrbenito/K270-unifying
Wireless Keyboard K270 unifying
2017-03-21 00:07:26 +01:00
Peter Wu
45cc161cc7 Merge pull request #344 from jrbenito/MK520
MK520 Combo - Documentation
2017-03-21 00:02:52 +01:00
Peter Wu
1ccd2d1856 Merge pull request #346 from jrbenito/MK220-mouse
MK220 Combo descriptor for Mouse M150 and new docs
2017-03-20 23:58:49 +01:00
Josenivaldo Benito Jr
d9d37edc2f MK220 Combo descriptor for Mouse M150 and new docs
Thanks to @FabioBeneditto for providing information.

Depends on #337

fixes #222

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-03-10 10:47:23 -03:00
Josenivaldo Benito Jr
ae405871fb Add M510 (new version) to descriptors
Depends on #337

fixes #279

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-03-08 19:48:23 -03:00
Josenivaldo Benito Jr
f4700f07ce MK520 Combo
Wireless Keyboard K520
Wireless Mouse M310

Fully functional on Solaar at this point.

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-03-08 18:59:36 -03:00
Josenivaldo Benito Jr
d2d19a615d Wireless Keyboard K270 unifying
Descriptor and docs for K270 unifying version.

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2017-03-08 16:23:30 -03:00
Peter Wu
c36cc506b6 Merge pull request #327 from david-geiger/master
Update French translation
2017-01-03 12:27:22 +01:00
daviddavid
7180693f89 Update French translation
- by David Geiger <david.david@mageialinux-online.org>
2016-12-31 16:43:44 +01:00
Peter Wu
aa08356823 Merge pull request #144 from DJm00n/master
Russian translation added.
2016-12-23 15:16:06 +01:00
Dimitriy Ryazantcev
197ff7365d Add Russian translation 2016-12-21 00:18:01 +02:00
Dimitriy Ryazantcev
a0c6a6ce59 Update l10n pot template 2016-12-21 00:18:01 +02:00
Dimitriy Ryazantcev
934ecb821d Update l10n strings in code 2016-12-21 00:18:01 +02:00
Peter Wu
f0cf949336 Merge pull request #322 from jrbenito/anywhere2
Anywhere MX 2 device information and descriptor
2016-12-20 21:29:10 +01:00
Peter Wu
ecd245e8dc Merge pull request #317 from jrbenito/m560-devinfo
M560 device info contributed by @mhalano
2016-12-03 02:19:04 +01:00
Peter Wu
f65f000d38 Merge pull request #319 from jrbenito/k780
K780 add descriptor support and device information
2016-12-03 02:03:35 +01:00
Josenivaldo Benito Jr
3b60f205f7 K780 add descriptor support and device information
Device information provided by @faassen
Tests provided by @ralphdd

relates to #298

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-30 14:38:44 -02:00
Josenivaldo Benito Jr
d6c93cfcfe Anywhere MX 2 device information and descriptor
Information from mouse Anywhere MX 2 as provided by @fropeter
Descriptor for mouse based on dump provided

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-30 14:24:50 -02:00
Josenivaldo Benito Jr
cbd71f9d24 M510 HID++ V4.5 information
Dump from M510, newer version which uses HID++ V4.5 instead of V1.0.
Wireless PID 4051

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-30 14:07:42 -02:00
Josenivaldo Benito Jr
45d5119a5a M560 device info contributed by @mhalano
Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-30 14:07:27 -02:00
Peter Wu
773cb7f45f Merge pull request #312 from jrbenito/rules
Add receiver to udev rules
2016-11-29 02:16:36 +01:00
Josenivaldo Benito Jr
d74e3a9b92 Add receivers to udev rules
Sync lib/logitech_receiver/base_usb.py PIDs with udev rules

Fixes #125

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-24 09:54:24 -02:00
Peter Wu
fe1fba7ac6 Merge pull request #316 from david-geiger/master
Add French translation on desktop file and update maintainer in README.
2016-11-24 11:09:46 +01:00
daviddavid
4e20ef61c8 Add French translation on desktop file
- update README.md
2016-11-23 20:38:30 +01:00
Peter Wu
a750b32d14 Merge pull request #313 from jrbenito/doc
Update installation to point correct rules file
2016-11-23 13:46:27 +01:00
Josenivaldo Benito Jr
69006c48c6 Update installation to point correct rules file
Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-23 09:55:07 -02:00
Peter Wu
b12d03dfe3 Merge pull request #311 from jrbenito/nanoDocs
README nano receiver broken link
2016-11-22 23:46:00 +01:00
Peter Wu
ddbf93fb24 Merge pull request #309 from jrbenito/pt-br
pt-br: Improve translations
2016-11-22 23:22:23 +01:00
Josenivaldo Benito Jr
65c55b789c README nano receiver broken link
Fixes #261

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-22 11:37:40 -02:00
Josenivaldo Benito Jr
d83530bee3 pt-br: Improve translations
Some pt-br translation where ambiguous or too missing 'not' statement.
Add original translator, Mr. Drovetto, to the documentation.

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-21 17:25:22 -02:00
Peter Wu
e6c02f5c52 Merge pull request #303 from jrbenito/UTF8
UTF-8 file paths error on python 2
2016-11-18 22:22:11 +01:00
Josenivaldo Benito Jr
122d76d061 UTF-8 file paths error on python 2
Python 2 needs UTF-8 decode since it uses 'ascii' decode by default.
Python 3 might have problems converting back to UTF-8 in case of Unicode
surrogates

Signed-off-by: Josenivaldo Benito Jr <jrbenito@benito.qsl.br>
2016-11-18 15:00:20 -02:00
muzena
fb1442dbcb Add croatian translation 2016-11-15 16:34:20 +01:00
muzena
0b8141f092 Logitech G700 and G700s Gaming mouse support 2016-11-14 16:39:23 +01:00
Peter Wu
137c32262b Merge pull request #242 from drovetto/master
Added brazilian portuguese translation
2016-11-10 13:20:25 +01:00
Peter Wu
7c726738b1 Merge pull request #185 from zipperten/patch-4
Update sv.po
2016-11-10 13:19:35 +01:00
Peter Wu
2570f584b9 Merge pull request #228 from berte/master
add turkish translation file
2016-11-10 13:07:29 +01:00
Peter Wu
4c1f568fab Merge pull request #141 from ghost
Italian translations
2016-11-10 13:04:42 +01:00
Peter Wu
27bd71253e Merge pull request #129 from Tomin1/finnish
Finnish translations
2016-11-10 12:57:06 +01:00
Jhonny Oliveira
9a9a82016f Add support to G700 Gaming Mouse receiver 2016-11-10 12:25:54 +01:00
Jhonny Oliveira
aa03cef61f Add support to MK320 mouse and keyboard combo 2016-11-08 09:17:02 +01:00
Peter Wu
c14e30b6f5 Fix crash when AppIndicator3 is unavailable
Convert ValueError to an ImportError (hack!) to allow the fallback code
to function.

Fixes https://github.com/pwr/Solaar/pull/276
2016-11-06 19:50:32 +01:00
cschreib
b5d43cdc3c Added support for MintX icon set (for Linux Mint integration) 2016-10-22 13:49:50 +02:00
Peter Wu
1edd8a577b Merge pull request #290 from verybadsoldier/invert-online-bit
Fixes #289.
2016-10-03 01:58:51 +02:00
vbs
358e0958bb fixed wrong interpretation of bit 6 of the notification byte which indicates if the link could be established (bit cleared) or not (bit set)
https://lekensteyn.nl/files/logitech/logitech_hidpp10_specification_for_Unifying_Receivers.pdf
2016-09-17 18:05:03 +02:00
Peter Wu
fa5fba796b Merge pull request #263 from MagicFab/patch-1
Update es.po
2016-09-04 22:02:38 +02:00
Peter Wu
ce215228f3 Merge pull request #277 from wsargent/patch-1
Use HTTPS for github based repositories
2016-08-09 15:02:03 +02:00
Peter Wu
28e43395ab Merge pull request #259 from javitonino/support-mx-master
Support mx master
2016-07-24 23:09:28 +02:00
Will Sargent
e09231c05a Use HTTPS for github based repositories
Github Pages support HTTPS natively, so it's better for security to default to that.
2016-07-12 09:02:28 -07:00
Javier Torres
f29de0f3dd Update docs: mx master supports smart shift 2016-06-09 19:46:03 +02:00
Javier Torres
ba540338e2 Add smart shift feature for MX master 2016-06-09 19:46:03 +02:00
Javier Torres
2442fee341 Add support for range features in GUI 2016-06-09 19:46:03 +02:00
Javier Torres
bbadd3e755 Add support for range features in CLI 2016-06-09 19:46:03 +02:00
Javier Torres
2fdce2f938 Add range features 2016-06-09 19:46:03 +02:00
Javier Torres
f1fad2d16b Add range validator 2016-06-09 19:46:03 +02:00
Peter Wu
8a5700b44e Merge pull request #270 from cjmayo/appindicator
Fix: "AppIndicator3 was imported without specifying a version first"
2016-05-21 19:28:19 +02:00
Chris Mayo
e046455a05 Fix: "AppIndicator3 was imported without specifying a version first"
PyGIWarning: AppIndicator3 was imported without specifying a version
first. Use gi.require_version('AppIndicator3', '0.1') before import to
ensure that the right version gets loaded.
2016-05-03 20:20:46 +01:00
Peter Wu
ddbc27486c Merge pull request #136 from erik-smit/gobject_not_allow_None
Fixes a TypeError on older GObject libraries (as evident with Ubuntu 12.04 and OpenSUSE 12.3).
2016-04-17 14:11:15 +02:00
Peter Wu
2041007b38 Merge branch 'features'
Automatically detect FN swap feature and DPI adjustment on some newer
devices. DPI adjustment partially addresses support for the MX Master
(#208), Smart shift is still missing.
2016-04-17 12:43:15 +02:00
Fabian Rodriguez
7b7e17819e Fixed "Hardware" following comments 2016-04-01 07:55:13 -04:00
Fabian Rodriguez
f855cd60e1 Update es.po
MIssing spaces, small terms corrections, typos
2016-03-31 19:22:55 -04:00
Peter Wu
883ed9549d Fix DPI list assertion 2016-03-25 00:06:00 +01:00
Peter Wu
d1858f747b Assume 7 words for the DPI list response
HID++ 2.0 responses are 20 bytes, once you strip the 4 byte common
header and 1 byte sensorIdx, you have 15 bytes left. Since DPI values
are 16-bit words, only 14 bytes should be used.
2016-03-24 16:59:05 +01:00
Peter Wu
aa7d1b6410 Skip sensorIdx in getSensorDpiList response 2016-03-24 15:13:06 +01:00
Peter Wu
bc3a98ddb2 Merge pull request #258 from cjmayo/gentoo
readme Gentoo link updated with official package
2016-03-24 14:58:34 +01:00
Peter Wu
5b01f375e0 Merge pull request #254 from emerham/master
Adding Logitech mx 1100 cordless laser mouse to discriptors
2016-03-24 14:56:55 +01:00
Peter Wu
dd2755909d cli/config: fix error message
Attempt to fix:

    $ bin/solaar config master dpi higher
    solaar: error: coercing to Unicode: need string or buffer, int found

The DPI choices are integers, therefore cast it to a str.
2016-03-18 12:27:16 +01:00
Peter Wu
b052ab9ef0 Fix thinko in Adjustable DPI setting
There are three bytes forming the parameter, the sensor ID is the MSB,
not LSB.
2016-03-18 12:14:15 +01:00
Peter Wu
9c768d60a1 Add full support for adjustable DPI
Feature 0x2201 as used by the MX Master. Valid DPI values are read
directly from the device. Based on Logitech specifications.
2016-03-15 23:37:39 +01:00
Matthew Brabham
d1d0ab85ff Updated mouse device settings and deffinition. Added docs for the MX 1100 2016-03-14 13:05:05 -07:00
Peter Wu
e1eee2e078 Fix "Gtk was imported without specifying a version first"
Fixes the following warnings:

    sys:1: PyGIWarning: Gtk was imported without specifying a version first. Use gi.require_version('Gtk', '3.0') before import to ensure that the right version gets loaded.
    sys:1: PyGIWarning: Notify was imported without specifying a version first. Use gi.require_version('Notify', '0.7') before import to ensure that the right version gets loaded.
2016-03-14 11:33:05 +01:00
Peter Wu
5c38f90cd6 Merge branch 'issue/199'
Fixes #136.
2016-03-14 11:10:49 +01:00
Peter Wu
45d49b9de8 settings: fix Python 3 compat for boolean values
As observed for the fn-swap setting.
2016-03-14 01:48:56 +01:00
Peter Wu
4ccb8ab26d Merge pull request #257 from hobarrera/subtle-critical-battery-notification
Don't open a main window when battery is critical
2016-03-14 00:36:26 +01:00
Peter Wu
ab162583e4 cli: do not die on missing description
The DPI setting has no description, do not try to display it.
2016-03-13 23:59:21 +01:00
Chris Mayo
e25b47aa1c readme Gentoo link updated with official package 2016-03-05 16:27:16 +00:00
Hugo Osvaldo Barrera
63a98819a6 Don't open a main window when battery is critical
The main window suddenly opening when a battery is critical is very
disruptive. It can pop up on all sort of undesirable scenarios.

Rather than catch users of guard, merely show a notification that the
battery is critical.
2016-02-19 03:25:55 -03:00
Peter Wu
27d3d80d30 Merge pull request #256 from SlySven/add_m175DestinguishingDetails
add: wpid for M175 to distinguish between it and M185 wireless mouse (Fixes #255)
2016-02-11 18:30:02 +01:00
Stephen Lyons
478381a994 add: wpid for M 175 to distinguish between it and M185 wireless mouse
I own the former and wanted to correct this detail which caused the wrong
model to be shown in GUI.

Signed-off-by: Stephen Lyons <slysven@virginmedia.com>
2016-02-10 19:09:25 +00:00
Matthew Brabham
51a15a960f Adding Logitech mx 1100 cordless laser mouse to discriptors 2016-01-26 11:04:47 -08:00
Peter Wu
92967eed23 Merge pull request #249 from mulkieran/master-pyudev
Fix some bugs in udev.get_indexed_string.
2016-01-13 15:24:51 +01:00
Peter Wu
57338303e8 Merge pull request #239 from marcbelmont/patch-1
Add setting for K400 Plus keyboard

devices.md was updated in #174
2016-01-09 12:37:35 +01:00
Peter Wu
e735ce10f0 Merge pull request #174 from IrvinPoe/patch-1
Update devices.md with K400 Touch
2016-01-09 12:36:27 +01:00
mulhern
d75b6d2f2b Fix some bugs in udev.get_indexed_string.
* from_device_number raises an exception if no device found, rather than
returning None. So, instead of checking the result, catch the exception.
* Use Attributes.get() method instead of checking containment and using the
index operator. This is really the only correct way, see rhbz#1267584.

Effect of the changes:
Previously, if no device was found this method would raise an exception.
Now it returns None instead.
Previously this method read the value of the attribute corresponding to key
twice, once via 'key in attributes' and again when accessing the key.
Now, it just reads it the one time.

Reason for noticing all these problems:
In pyudev-0.18 the Attributes class is fixed, and no longer has the []
operator or __contains__ method or other methods which require a total
mapping. This patch fixes several bugs while simultaneously avoiding these
removed operators.

Signed-off-by: mulhern <amulhern@redhat.com>
2015-12-23 09:22:48 -05:00
sadj
bd1470dad7 Added brazilian portuguese translation. 2015-10-08 18:52:14 -03:00
Marc Belmont
15f97681ef Add setting for K400 Plus keyboard
The new_fn_swap works on the K400 Plus model.
2015-08-24 19:01:21 +02:00
Behzat
7075ce910a add turkish translation file 2015-07-16 22:07:38 +03:00
Peter Wu
5ba816dd38 [WIP] Support MX Master with DPI adjustment support (#208)
It's not known whether the DPI ranges can be queried, so let's set
hard-code some values for now. Step size is 200. Does this need to
be changed?

TODO: need a capture of whether this is really a read function.
2015-05-31 15:53:26 +02:00
Peter Wu
a515cc3860 Auto-detect FN swap feature for newer devices 2015-05-31 10:56:57 +02:00
Peter Wu
73344cbf26 Simplify feature checking
Make mapping features to settings more readable. No functional changes.
2015-05-31 10:38:49 +02:00
Peter Wu
cf27328d13 Merge branch 'updates'
Documentation updates.
2015-05-27 23:43:10 +02:00
Peter Wu
869f1e4791 doc/devices.md: add MX Master
Information from (IRC) xaver. See also #208.

Product page at http://www.logitech.com/product/mx-master
2015-05-27 23:40:58 +02:00
Peter Wu
e2d65a690e hidpp20: update features list
Based on SetPoint6.65.62_32.exe and Options_2.10.73.exe (features.xml,
defaults.xml, LogiOptionsMgr.exe).

The names are based on the named next to the feature ID. For duplicates,
_2 is appended to the name.

This commands helps parsing numbers from debug prints:

    strings LogiOptionsMgr.exe |
    sed -nr 's/.*(Feature[0-9a-fA-F]{4})/\1 /p' | sort |
    awk 'tolower(a)!=tolower($1){print"";a=$1}1;' | less -S
2015-05-27 23:20:43 +02:00
Peter Wu
3141f06472 Fix crash due to non-locatable icon names (#199) 2015-05-27 23:16:39 +02:00
Peter Wu
b88cf5a07b Ignore HID++ devices on Linux 3.19+
Additionally update the docuentation to reflect new module names.
2015-05-14 23:28:04 +02:00
Peter Wu
a344ad9867 docs: document Smooth Scrolling for more devices
Based on the HI_RES_SCROLLING feature (0x2120) in docs/devices/. Tested
with a M525.
2015-05-14 23:06:14 +02:00
CzBiX
76e327d2fa update docs for M325 2015-05-08 13:27:29 +08:00
CzBiX
0ae0ef195a support switch smooth scroll feature 2015-05-08 13:20:46 +08:00
Peter Wu
b1f74a1280 Merge pull request #213 from titanofold/add-M570
Add M570 Trackball device information
2015-04-24 09:39:37 +02:00
Aaron W. Swenson
30431fbfb8 Add M570 Trackball detail 2015-04-20 14:18:07 -04:00
Peter Wu
fb4c055fbf Merge pull request #193 from dmsc/master
Add support for MK220 mouse-keyboard combo device.
2015-03-07 18:12:21 +01:00
Daniel Serpell
3ea51fe1a2 Add support for MK220 mouse-keyboard combo device.
The MK220 receiver has usbid 046d:c52e, adding this id as a generic
receiver is enough to show the mouse and keyboard charge status.
2015-03-06 08:07:22 -03:00
Peter Wu
afd36764c2 Merge pull request #202 from decibyte/master
k830 support + support for NEW FN INVERSION
2015-03-06 11:45:53 +01:00
Mikkel Munch Mortensen
b694809394 Updates to dos for k830 keyboard. 2015-03-05 19:17:00 +01:00
Mikkel Munch Mortensen
66296265ba Descriptor for k830. 2015-03-05 19:15:12 +01:00
Mikkel Munch Mortensen
952495ce04 Support for NEW_FN_INVERSION. 2015-03-05 19:14:28 +01:00
Peter Wu
29eb377267 Merge pull request #203 from HugoJH/master
Added Spanish Translation
2015-03-05 15:04:45 +01:00
Hugo Jiménez Hernández
47345e1dcb Added Spanish Translation 2015-03-05 13:05:59 +00:00
Peter Wu
36fc6de760 Merge pull request #168 from jtsagata/master
Add Greek language translation
2015-03-05 13:07:25 +01:00
Peter Wu
6c0aca8c63 Merge pull request #170 from SubOptimal/translation
add german translation
2015-03-05 13:06:52 +01:00
Peter Wu
bd93689109 Merge pull request #171 from dirtycold/master
added Chinese (simplified) translation
2015-03-05 13:06:08 +01:00
Peter Wu
4e5d4853d6 Merge pull request #173 from stickster/master
Add Fedora package information to README.md
2015-03-05 13:05:37 +01:00
zipperten
bb2361a986 Update sv.po
minor changes
2014-10-23 09:49:05 +02:00
IrvinPoe
7c8d4815f0 Update devices.md
Add Nano receiver 046d:c52b in the supported devices, and FN swap works on K400.
2014-08-17 17:47:48 +02:00
Paul W. Frields
0f05589cd6 Add Fedora package information to README.md 2014-07-30 14:39:46 -04:00
ZH
21db60a14e fix compiling Chinese simplified translation 2014-07-13 15:13:10 +08:00
ZH
091c28ca8b added Chinese (simplified) translation 2014-07-13 10:13:17 +08:00
Frank Dietrich
9af353dd32 add german translation 2014-07-02 02:12:16 +02:00
Giannis Tsagatakis
981ff00ca3 Add Greek language translation 2014-06-13 14:32:57 +03:00
Daniel Pavel
ec0197df3d Merge pull request #154 from mmehnert/patch-1
Update TK820 compatibility information
2014-04-20 22:54:27 +03:00
mmehnert
2111107ff4 Update TK820 compatibility information 2014-04-19 14:50:21 +02:00
Tristin Celestin
2b08c5e0c9 Added border around tree view. 2014-01-01 21:45:44 -05:00
Daniel Pavel
cc8a6c4ab5 Merge pull request #134 from FrederikNS/patch-1
Added Smooth Scrolling to the Performance Mouse MX
2013-12-13 09:43:16 -08:00
Michele Olivo
437e17cf37 Added Italian translation 2013-12-13 18:09:46 +01:00
Daniel Pavel
22191d7d0c Merge pull request #139 from parkerlreed/patch-1
Update devices.md
2013-12-13 07:48:21 -08:00
parkerlreed
ba890c2d2e Update devices.md
Added a little bit of info for the M325
2013-12-02 10:46:47 -05:00
erik-smit
9a6cdd9cee TypeError: Argument 3 does not allow None as a value 2013-10-31 11:16:38 +01:00
Frederik Nordahl Sabroe
32324f3e66 Added Smooth Scrolling to the Performance Mouse MX
I tested solaar with my Performance Mouse MX, and the smooth scrolling worked like a charm, I just need to find a way to make the scrolling speed slower now.
System is Linux Mint 15.
2013-10-14 17:18:49 +02:00
Tomi Leppänen
ffe297b239 Merge branch 'finnish' of github.com:Tomin1/Solaar into finnish
Conflicts:
	po/fi.po
	po/solaar.pot
2013-09-29 16:37:33 +03:00
Tomi Leppänen
7fe5983f7c Fixed a bit Finnish translation.
Some fixes to Finnish translation.
A few strings were marked as fuzzy.
Run po-compile.sh.
2013-09-29 16:34:02 +03:00
Tomi Leppänen
d5f14bb5f8 Merge branch 'master' into finnish
Conflicts:
	po/solaar.pot - run po-compile.sh
2013-09-29 16:24:06 +03:00
Daniel Pavel
f3049ed451 Merge pull request #126 from slaveriq/master
Fixing a crash when level is type None
2013-09-25 10:08:09 -07:00
David Plassmann
8485494ea7 It should check for None specificly 2013-09-25 14:12:53 +02:00
David Plassmann
7a75813a84 level is returned as None in hidpp10.py when the performanceMX mouse is
charging. Since the battery state is unknown when beeing recharged it
will now return "N/A".
Before it would crash becasue level was None and could not be inserted
using %d.
2013-09-24 16:56:50 +02:00
Daniel Pavel
35830e3d50 Merge pull request #121 from Lekensteyn/doc-updates
Documentation updates: DJ pdf and devices
2013-09-04 16:56:46 -07:00
Tomi Leppänen
46fd4dac56 Merge branch 'master' into finnish
Conflicts:
	po/solaar.pot - Run tools/po-compile.sh
2013-09-01 12:21:51 +03:00
Peter Wu
ebd8635f84 docs/devices: add K750 (from Julien Danjou)
Received from Julien Danjou on the devkit mailing list.
2013-08-29 19:06:03 +02:00
Peter Wu
efbf43b472 docs/logitech: Add DJ receiver spec
docx files is taken from hidpp20 public folder[1] and was converted to
PDF format using:

    loffice --convert-to pdf ...docx
    qpdf --linearize orig.pdf ...pdf

Mirrored on https://lekensteyn.nl/files/logitech/.

 [1]: https://drive.google.com/#folders/0BxbRzx7vEV7eWmgwazJ3NUFfQ28
2013-08-27 18:06:29 +02:00
Peter Wu
8a6d8e2ed1 docs/devices/m525: add ltunify and solaar output 2013-08-27 18:06:29 +02:00
Peter Wu
bff99799ab docs/devices/t650: add reprogrammable keys 2013-08-27 18:06:29 +02:00
Peter Wu
1434b2a50d Update features and keys list
Updated to information available from SetPoint 6.61.15.
2013-08-27 17:55:45 +02:00
Daniel Pavel
c3fdbfb643 translate battery alerts (fixes #119) 2013-08-25 23:03:25 +03:00
Daniel Pavel
a9ebac264f po formatting updates 2013-08-25 01:34:27 +03:00
Daniel Pavel
60a591ab6b Merge pull request #114 from zipperten/patch-2
Update sv.po
2013-08-24 15:32:23 -07:00
Daniel Pavel
ab3a6b50d4 Merge pull request #118 from Lekensteyn/fixes
Regression fixes: --hidraw option, python3, hidpp10
2013-08-24 14:05:11 -07:00
Peter Wu
b193b39701 Fix missing reprogrammable keys
The assumption that the Features IDs are in increasing order does not
hold. This causes the feature check for REPROG CONTROLS (1B00) to fail,
therefore remove the micro-optimisation.

While at it, rename variables and document the functions better.
2013-08-23 21:33:45 +02:00
Daniel Pavel
806d67a72f Merge pull request #117 from Lekensteyn/doc-updates
docs: added T400, T650, Anywhere MX dumps
2013-08-21 13:12:23 -07:00
Peter Wu
9c465cd998 Fix wrong register name for illumination (hidpp10)
Broken since 9a2a28e, this causes a lot of exceptions for every move.
2013-08-21 21:47:24 +02:00
Peter Wu
024a71b618 solaar: add --hidraw option again
This options allows the devices list to be restricted which got removed
in:

    commit 3b75b69970
    Author: Daniel Pavel <daniel.pavel@gmail.com>
    Date:   Fri Aug 9 12:25:47 2013 +0200

        merged solaar-cli functionality into main solaar binary

solaar-cli is still busted, but since it is deprecated, it's probably
fine.
2013-08-21 21:47:24 +02:00
Peter Wu
f144816256 solaar-cli: fix argument parsing in Python 3 again
Fix from e3a887f36c, this got removed
in:

    commit 3b75b69970
    Author: Daniel Pavel <daniel.pavel@gmail.com>
    Date:   Fri Aug 9 12:25:47 2013 +0200

        merged solaar-cli functionality into main solaar binary
2013-08-21 21:47:24 +02:00
Peter Wu
f0eeea8625 docs/devicesmd: update with T400 and Anywhere MX 2013-08-21 21:45:04 +02:00
Peter Wu
72819b6130 docs/devices: add Anywhere MX mouse
Thanks to Nestor from Logitech for providing me this device.

This mouse has two buttons on the left, currently mapped to 8 (bottom
button) and 9 (top button).

Note: setting bit 1 of register 01 does odd things in KDE. I looked in
SetPoint 6.61.15 and could not find an option for "Side Scroll",
perhaps it is not applicable here?
2013-08-21 21:45:04 +02:00
Peter Wu
23e4f32e11 docs/devices: add T650 touchpad
Thanks to Nestor from Logitech for providing me this device.

The firmware on this touchpad features out-of-the-box tap-to-click
(no host software needed). The following features work with no
additional software (tested in Linux 3.11-rc6 with KDE 4.11):

- Left-click: single tap
- Middle-click ("scroll-wheel click"): three finger tap
- Right-click ("context menu"): two finger tap or tap in right corner
- Navigate left ("Back"): three finger slide to left
- Navigate right ("Forward"): three finger swipe to the right
- Scroll (up/down/right/left): slide with two fingers
- Move pointer (any direction): slide

Click and drag is also possible (for example, for selecting text or
moving windows with Super + right/left-click in KDE), just press harder
on the surface. Right click is in the bottom-right corner, left is
anywhere else.

Sliding with three fingers up acts if you pressed Super. Sliding with
three fingers down triggers a key press of Super + D (normally the
"Show Desktop" in MSWIN).

Not working as it requires additional software:

- Pinch-to-zoom.
- Four-finger gestures, likely needs to be controlled via features as
  there are no HID messages at all.
2013-08-21 21:45:04 +02:00
Peter Wu
243d1548dc docs/devices: add Zone Touch Mouse T400
Thanks to Nestor from Logitech for providing me this device.

User experience note: the upper part (covering two-third) of the middle
button is the "METRO START SCREEN" button, the smaller bottom part
provides the "middle mouse button" (MIDLLE BUTTON). This might be OK
for a desktop user, but it's awful if you have a big hand like me and
make much use of it for opening URLs in a new tab or pasting stuff.

On the other hand, the middle button can be remapped and there is both
horizontal and vertical scrolling functionality.
2013-08-21 21:45:04 +02:00
zipperten
c3bc56f306 Update sv.po
fix for paring lock notification.
2013-08-20 22:49:08 +02:00
Daniel Pavel
288c607069 Merge pull request #113 from david-geiger/patch-1
Ouch. Added 'solaar.cli' on setup.py files (line 74 "packages=").
2013-08-13 02:20:58 -07:00
david_david
55c307d0e5 added 'solaar.cli' on setup.py files (line 74 "packages=")
missing packages 'cli' from "/lib/solaar/" and needed for building package rpm.

[david@david ~]$ solaar -dd
Traceback (most recent call last):
  File "/usr/bin/solaar", line 43, in <module>
    import solaar.gtk
  File "/usr/lib/python2.7/site-packages/solaar/gtk.py", line 26, in <module>
    import solaar.cli as _cli
ImportError: No module named cli
2013-08-13 11:02:13 +02:00
Daniel Pavel
69febfcea5 don't rely on upower to check devices after wake-up (#111)
still use upower resume events to ping devices, just in case
the old behaviour is available with a command-line option
2013-08-12 15:22:34 +02:00
Daniel Pavel
9934755566 more translation fixes (#108) 2013-08-12 00:32:19 +02:00
Tomi Leppänen
a7561eaa9b Updated Finnish translation
Merge branch 'finnish' of github.com:Tomin1/Solaar into finnish

Conflicts:
	po/fi.po
2013-08-11 17:24:06 +03:00
Tomi Leppänen
689661169a Updated Finnish translation. 2013-08-11 17:22:40 +03:00
Tomi Leppänen
eac40abc3e Updated Finnish translation. 2013-08-11 16:56:30 +03:00
Tomi Leppänen
372e4e0949 Merge branch 'master' into finnish
Conflicts:
	po/solaar.pot - run tools/po-compile.sh
2013-08-11 16:48:12 +03:00
Daniel Pavel
e42f7f1393 jekyll configuration update 2013-08-09 12:29:02 +02:00
Daniel Pavel
3860d4a56b changelog update 2013-08-09 12:28:47 +02:00
Daniel Pavel
3b75b69970 merged solaar-cli functionality into main solaar binary 2013-08-09 12:25:47 +02:00
Daniel Pavel
a4f0eab855 updated descriptors with a few more devices 2013-08-08 22:44:23 +02:00
Daniel Pavel
f54ea27d97 updated translator credits in about dialog 2013-08-08 22:43:32 +02:00
Daniel Pavel
db48fe1b40 re-formatted translation files 2013-08-08 22:41:57 +02:00
Daniel Pavel
d0a0e902a7 added translator credits to i18n documentation 2013-08-08 22:38:59 +02:00
Daniel Pavel
95a6412d5c po-update.sh without arguments re-formats all translation files 2013-08-08 22:22:39 +02:00
Daniel Pavel
5faecbf4f3 some strings were untranslated; fixes #100 2013-08-08 21:50:04 +02:00
Daniel Pavel
5af1719384 tray: always pick the lowest battery, if the user hasn't already 2013-08-08 21:49:59 +02:00
Daniel Pavel
6a66370ffe scrolling over the tray icon switches among devices; fixes #101
It now works for the standard systray as well, not just the
appindicator.
2013-08-08 21:49:54 +02:00
Daniel Pavel
c0874220d2 don't str() translated device status; fixes #108 2013-08-08 21:49:50 +02:00
Daniel Pavel
9c67b1b494 debian packaging updates 2013-08-08 21:49:35 +02:00
Daniel Pavel
22656d5b82 use Gtk.Application properly 2013-08-08 21:49:35 +02:00
Daniel Pavel
d55963caba clean-up in usb IDs 2013-08-08 21:49:35 +02:00
Daniel Pavel
413cebe40f delay some UI initialization until necessary 2013-08-08 21:49:35 +02:00
Daniel Pavel
140ffae01a Merge pull request #106 from damsweb/master
Update fr.po to fix a few typo/mistakes
2013-08-08 07:12:01 -07:00
Daniel Pavel
68251777fb Merge pull request #107 from damsweb/patch-2
Update README.md to add Mageia
2013-08-08 06:29:21 -07:00
Damien Lallement
188b20a4f1 Update README.md to add Mageia 2013-08-07 16:43:46 +02:00
Damien Lallement
5fba1db11c Update fr.po to fix a few typo/mistakes
Fixing feminine words and fix bad translations for connection.
2013-08-07 14:47:46 +02:00
Daniel Pavel
21b1a722fc Merge pull request #102 from david-geiger/patch-1
Add French translation (fr.po) (pwr/Solaar#97)
2013-08-06 07:51:32 -07:00
Daniel Pavel
715c50685b Merge pull request #103 from zipperten/master
Added Swedich translation
2013-08-06 07:50:46 -07:00
Tomi Leppänen
dd0ba17351 The first version of Finnish translation.
I don't have much experience in translating, so I'd like my translations
to be reviewed by someone with more experience.
Some translations aren't that good. Especially I'd like to know if there
is any better or newer word for pairing in Finnish. Some problems I've
already marked in po/fi.po. I'd imagine that the longest texts need the
most fixing.
2013-08-05 19:47:03 +03:00
david_david
576dd4cdd4 Update fr.po
update "Last-Translator:"
2013-08-05 08:15:44 +02:00
david_david
a2a0380401 Update fr.po
#: lib/solaar/ui/about.py:49
#: lib/solaar/ui/window.py:640
2013-08-04 23:08:47 +02:00
david_david
f1a85f45bd Update fr.po 2013-08-04 11:51:53 +02:00
david_david
200cf48df4 Update fr.po 2013-08-04 11:50:24 +02:00
david_david
14b5993dc3 Create fr.po 2013-08-03 16:48:12 +02:00
david_david
585ba93588 Create fr.po 2013-08-03 16:44:30 +02:00
zipperten
e30a692a6e Added Swedich translation 2013-07-30 01:51:35 +02:00
Daniel Pavel
edc563e0e4 release 0.9.2 2013-07-24 11:40:54 +02:00
Daniel Pavel
969ca59948 translation credits: order languages alphabetically 2013-07-24 11:39:45 +02:00
Daniel Pavel
53abd22176 packaging: add compiled locale files 2013-07-24 11:06:58 +02:00
Daniel Pavel
f449b37bda minor update to the devices doc 2013-07-23 22:50:37 +02:00
Daniel Pavel
c97f4082dd translation credits updated 2013-07-23 22:49:47 +02:00
Daniel Pavel
5e6761c61b use relative paths in .pot/.po comments
otherwise the comments get changed when someone else run po-update
2013-07-23 22:48:59 +02:00
Daniel Pavel
b2c87b4f80 Merge pull request #95 from nexces/master
Added Polish translation
2013-07-23 13:36:30 -07:00
Adrian 'Nexces' Piotrowicz
58fcb074ff Updated po-update.sh script for use in (x)buntu.
Added another location to scan in function unfmt() due to fact that gtk30.mo and gtk30-properties.mo are found in /usr/share/locale-langpack/ instead of /usr/share/locale/.
2013-07-23 10:49:25 +02:00
Adrian 'Nexces' Piotrowicz
dbff65a4d1 Updated POT (translation template) 2013-07-23 10:49:05 +02:00
Adrian 'Nexces' Piotrowicz
a7ac589692 Added Polish translation 2013-07-23 10:46:56 +02:00
Daniel Pavel
3d4570cd1f check the Gtk bindings version at start-up 2013-07-20 06:22:15 +02:00
Daniel Pavel
b6bc35ed3e K800: added support for hand detection 2013-07-19 11:49:30 +02:00
Daniel Pavel
5d4d0c07ad use () instead of [] where possible 2013-07-19 11:48:40 +02:00
Daniel Pavel
15cb97c56e udev devices may not have all the attributes; fixes #93 2013-07-19 11:46:50 +02:00
Daniel Pavel
f902b32755 m515 device scan 2013-07-18 20:40:38 +02:00
Daniel Pavel
fcfc7cd6fc a few more asserts in descriptors
just testing stuff...
2013-07-18 20:38:05 +02:00
Daniel Pavel
c3718d22d6 minor clean-ups 2013-07-18 20:36:27 +02:00
Daniel Pavel
2829acd6f5 added side-scrolling toggle setting 2013-07-18 20:35:39 +02:00
Daniel Pavel
c35ae8ffc9 added wpid to T650 descriptor 2013-07-18 20:34:29 +02:00
Daniel Pavel
f7159e9338 properly mask flags when writing device settings; fixes #86 2013-07-18 20:33:52 +02:00
Daniel Pavel
4074fb7750 trim the codename to the declared length (fixes #90) 2013-07-18 16:23:34 +02:00
Daniel Pavel
444169d84b added descriptor for V550 Nano 2013-07-18 15:26:53 +02:00
Daniel Pavel
5d5f97a776 Gtk.Application.get_dbus_object_path my be missing 2013-07-18 14:06:51 +02:00
Daniel Pavel
a8c5d3bc24 Nano receivers were unsupported on kernel 3.2; fixes #88 2013-07-18 14:01:36 +02:00
Daniel Pavel
dd2a18d60e added documentation for translators 2013-07-17 20:36:39 +02:00
Daniel Pavel
a3f9860181 added descriptor for V450 Nano; fixes #89 2013-07-17 20:02:31 +02:00
Daniel Pavel
1fed000855 added wpid to M515 desccriptor 2013-07-17 19:54:28 +02:00
Daniel Pavel
61dfefde94 internationalized most strings; fixes #79
some might have slipped through the cracks
2013-07-17 19:53:21 +02:00
Daniel Pavel
454fbcbc6e Merge remote-tracking branch 'origin/master' 2013-07-16 16:41:53 +02:00
Daniel Pavel
8112e90ded website: replace the png logo with embedded svg 2013-07-16 16:36:00 +02:00
Daniel Pavel
a4c0ad3d73 added M345 descriptor info 2013-07-16 12:51:01 +02:00
Daniel Pavel
30f2afacb7 debian packaging: cleaned-up the debian/ files
according to feedback on debian bug #715172
(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=715172)
2013-07-16 12:50:47 +02:00
Daniel Pavel
2a27c1d14e Merge pull request #87 from Lekensteyn/updates
docs/devices: add M345 (HID++ 2.0)
2013-07-16 03:39:28 -07:00
Peter Wu
cccf4ec428 docs/devices: add M345 (HID++ 2.0) 2013-07-16 12:31:56 +02:00
Daniel Pavel
38c76393b1 added copyright notices to all source files 2013-07-15 17:54:42 +02:00
Daniel Pavel
ce9b10dc2d started i18n support 2013-07-15 17:16:44 +02:00
Daniel Pavel
13e89dc219 post-build updates: debian/changelog and jekyll config 2013-07-13 13:23:52 +02:00
Daniel Pavel
16af3a9acc version 0.9.1 2013-07-13 11:24:41 +02:00
Daniel Pavel
c690b2c9e9 minor descriptors clean-up 2013-07-13 11:15:23 +02:00
Daniel Pavel
43ab629a26 moved logitech.unifying_receiver package to logitech_receiver 2013-07-12 22:48:09 +02:00
Daniel Pavel
b83a14e16f minor clean-ups and formatting 2013-07-12 22:39:17 +02:00
Daniel Pavel
a966bbff6f fixed handling of protocol version when the device is offline 2013-07-12 22:23:03 +02:00
Daniel Pavel
141a5c3dee don't ping devices known to be offline 2013-07-12 22:07:58 +02:00
Daniel Pavel
994bb07bc4 descriptors updated 2013-07-12 21:55:32 +02:00
Daniel Pavel
24f658d8fe support multiple Wireless PIDs for same device model 2013-07-12 21:53:23 +02:00
Daniel Pavel
49d77a2f90 handle unknown devices slightly better 2013-07-12 20:30:46 +02:00
Daniel Pavel
876cf35954 automatically detect the latest source.changes file generated 2013-07-12 17:14:15 +02:00
Daniel Pavel
46c0448854 got rid of /opt/extras sillyness in ubuntu packaging 2013-07-12 17:02:17 +02:00
Daniel Pavel
d78c7ed9be make sure items in window tree are sorted by number (fixed #73) 2013-07-12 15:24:49 +02:00
Daniel Pavel
51d0ccf654 only popup the window once per device on battery alerts 2013-07-12 14:35:16 +02:00
Daniel Pavel
9c8252b59f on alert popups, selected the device that triggered the popup 2013-07-12 14:10:26 +02:00
Daniel Pavel
488a78cc52 fixed #75 (pair button disappearing) 2013-07-12 10:35:28 +02:00
Daniel Pavel
0e6d088372 fixed some awkward path joining stuff 2013-07-11 22:46:29 +02:00
Daniel Pavel
d4d1a4f8e2 install the .desktop file in /etc/xdg/autostart (fixes #77) 2013-07-11 22:45:29 +02:00
Daniel Pavel
34801bfd1e install the application icon in hicolor/scalable/apps 2013-07-11 22:24:57 +02:00
Daniel Pavel
948b4c4d51 updated descriptors and devices doc for Anywhere MX 2013-07-11 15:34:36 +02:00
Daniel Pavel
85efe92d30 replaced appinstance with GtkApplication 2013-07-09 17:52:07 +02:00
Daniel Pavel
b01636e05d build-updated files for 0.9.0 2013-07-09 15:26:38 +02:00
Daniel Pavel
c0a7838429 version 0.9.0 2013-07-09 14:42:46 +02:00
Daniel Pavel
eda4112501 removed obsolete old window code 2013-07-08 21:21:53 +02:00
Daniel Pavel
dbb9025e26 replaced _ dummies with _ignore 2013-07-08 21:21:14 +02:00
Daniel Pavel
beee0bc8c2 typo in comment 2013-07-08 20:51:30 +02:00
Daniel Pavel
1bd6fd512b debian changelog updated 2013-07-07 22:15:00 +02:00
Daniel Pavel
ab8421b2f2 simplified (again) the deb build script
This time also check for consistency of .orig archives.
2013-07-07 22:07:31 +02:00
Daniel Pavel
1be56dd072 version 0.8.99.12 2013-07-07 21:58:33 +02:00
Daniel Pavel
c023f81f1a ChangeLog clean-up 2013-07-07 21:58:06 +02:00
Daniel Pavel
47f64d40de explicit encoding in main scripts 2013-07-07 21:54:35 +02:00
Daniel Pavel
d0b8233c9a minor clean-up 2013-07-07 21:40:55 +02:00
Daniel Pavel
39534d11dd make sure all debug and info loggings are if-guarded 2013-07-07 17:18:42 +02:00
Daniel Pavel
ca2f5f927c configuration: save on every change (fixes #80) 2013-07-07 16:06:27 +02:00
Daniel Pavel
2ab040591c major clean-up of debian building script 2013-07-07 14:06:03 +02:00
Daniel Pavel
8b26759731 release 0.8.99.11 2013-07-07 14:04:11 +02:00
Daniel Pavel
0e43287386 added a symlink to README.md to pacify sdist 2013-07-07 12:25:12 +02:00
Daniel Pavel
7221ceb7b4 forget battery status when the device has been offline for too long 2013-07-07 12:23:58 +02:00
Daniel Pavel
66416ff4cc fixed parsing of custom battery messages 2013-07-07 12:23:23 +02:00
Daniel Pavel
0d89d1e6c8 formatting fix in unpairing error dialog 2013-07-07 01:31:22 +02:00
Daniel Pavel
81765ee971 clean-ed up and documented gh_pages build script 2013-07-06 18:10:05 +02:00
Daniel Pavel
b72273b2a9 jekyll: made all image/css links relative 2013-07-06 18:08:52 +02:00
Daniel Pavel
e697a2d6cf updated debian build & upload scripts 2013-07-06 14:47:07 +02:00
Daniel Pavel
94d07eed53 version 0.8.99.10 2013-07-06 14:35:34 +02:00
Daniel Pavel
64ce3872b4 changelog updated 2013-07-06 14:24:17 +02:00
Daniel Pavel
508444526a commented-out the poll-ticking feature
not useful right now, and less code to worry about
2013-07-06 14:23:56 +02:00
Daniel Pavel
faa6de3b75 more explicit error dialogs, when possible 2013-07-06 14:20:50 +02:00
Daniel Pavel
77d2ae5249 omit the date in logging, is not important and the lines are shorter 2013-07-06 14:20:12 +02:00
Daniel Pavel
e2f94a9e0e be more lax as to when to allow pairing new devices 2013-07-06 13:55:22 +02:00
Daniel Pavel
ba55e4d9bd import * cleanups 2013-07-05 16:19:49 +02:00
Daniel Pavel
8e9ff939f3 hidconsole: enable hidpp automatically when talking to a Logitech Recevier 2013-07-05 16:19:24 +02:00
Daniel Pavel
bd3198f6f0 correctly handle out-of-process pairing and unpairing 2013-07-05 16:06:38 +02:00
Daniel Pavel
3319feeb73 replaced type() with isinstance() where possible 2013-07-05 16:02:38 +02:00
Daniel Pavel
47bcd4478c prettier error message if unpair fails 2013-07-05 14:35:06 +02:00
Daniel Pavel
065b8628d2 don't always show Notifications in details 2013-07-05 14:34:37 +02:00
Daniel Pavel
87e2f1cad7 solaar-cli: clearer handling of invalid device numbers 2013-07-05 14:34:18 +02:00
Daniel Pavel
373b07f271 fixed pairing in solaar-cli 2013-07-05 14:33:58 +02:00
Daniel Pavel
58f598fc88 version 0.8.99.9 2013-07-04 13:49:48 +02:00
Daniel Pavel
8f44c294d7 still getting strange messages from some devices 2013-07-04 13:37:39 +02:00
Daniel Pavel
f65079ad6d formatting fix for notifications 2013-07-04 13:35:23 +02:00
Daniel Pavel
edce56cd20 use a single separate thread for all possibly long-running stuff in GUI 2013-07-04 13:23:25 +02:00
Daniel Pavel
cd437c3809 only set NOTIFICATION_FLAGS for 1.0 devices 2013-07-04 13:22:35 +02:00
Daniel Pavel
007cbef086 better coverage of incoming events 2013-07-04 13:20:00 +02:00
Daniel Pavel
a03cc9ce64 more chair switching -- moved notifications handling into own .py 2013-07-03 08:21:40 +02:00
Daniel Pavel
3275aa4c12 allow most receivers to unpair (or at least try) 2013-07-03 08:18:47 +02:00
Daniel Pavel
a0f880fbba fix for NoneType crash 2013-07-02 19:43:18 +02:00
Daniel Pavel
833f087fdf also show polling rate in Hz 2013-07-02 12:23:47 +02:00
Daniel Pavel
9a2a28e0aa replaced hard-coded register numbers with constants
also re-worked the battery reading code a bit
2013-07-02 12:23:12 +02:00
Daniel Pavel
bf5fc42f07 fixed duplicate entries in keyboard tasks 2013-07-02 00:40:34 +02:00
Daniel Pavel
fb495fd2fc version 0.8.99.8 2013-07-01 19:35:46 +02:00
Daniel Pavel
90ab7af069 Anywhere MX and M600 descriptor updates 2013-07-01 19:22:46 +02:00
Daniel Pavel
0914e4c48d scan-registers: more lax interpretation of arguments 2013-07-01 19:01:37 +02:00
Daniel Pavel
3436055c7f re-worked (AGAIN) the way the devices are initially set-up
There is absolutely no consistency between the registers and
features receivers have, even if they're the same product_id!
2013-07-01 19:00:26 +02:00
Daniel Pavel
20aa797e96 configuration: use wpid in device key 2013-07-01 18:53:10 +02:00
Daniel Pavel
5ebc2634ae (hopefully) better serial read-out for devices 2013-07-01 18:40:03 +02:00
Daniel Pavel
94464a40b8 show the battery charge in the devices tree, if available (fixes #71) 2013-07-01 18:39:17 +02:00
Daniel Pavel
1194abf125 don't know yet how to tell if the receiver supports the unifying protocol 2013-07-01 15:28:05 +02:00
Daniel Pavel
ceba698678 moved settings templates into separate .py 2013-07-01 15:24:30 +02:00
Daniel Pavel
b1e9480f5a minor logging tweaks 2013-07-01 15:00:21 +02:00
Daniel Pavel
eaa38c858c properly format battery status string for 0x07 devices 2013-07-01 11:51:20 +02:00
Daniel Pavel
4504045bc6 extended descriptor for M305 2013-07-01 11:49:44 +02:00
Daniel Pavel
a9ea69b9a1 more explicit error message when trying to pair uncompatible devices 2013-07-01 11:41:47 +02:00
Daniel Pavel
9a8d089c73 handle some mystery data packets from older devices 2013-07-01 11:34:54 +02:00
Daniel Pavel
0d56cfbded clean-up in get/set notification flags computation 2013-06-30 17:12:44 +02:00
Daniel Pavel
9896875180 cleaner import 2013-06-30 15:03:39 +02:00
Daniel Pavel
a1c04ce39f renamed 'leds' register to '3leds', in case other may be found later 2013-06-30 15:02:58 +02:00
Daniel Pavel
da541e000a put usb ids into separate py file 2013-06-30 14:34:53 +02:00
Daniel Pavel
e490162e4f the K400 also has the FN swap feature 2013-06-30 14:04:14 +02:00
Daniel Pavel
a0b7d39f83 use the wpid to identify devices, when possible 2013-06-30 13:49:35 +02:00
Daniel Pavel
c464e049bf allow settings to be bound to certain device types
avoids stuff like smooth-scroll being attached to a keyboard
2013-06-29 21:26:25 +02:00
Daniel Pavel
daad9b5d5f cleaned-up NamedInts, added int2bytes and bytes2int generic functions 2013-06-29 20:37:04 +02:00
Daniel Pavel
2682722cb1 cleaned-up config_panel code 2013-06-29 20:35:35 +02:00
Daniel Pavel
8d5718178f load the configuration when the device is detected
and apply it every time the device comes online
2013-06-29 20:35:02 +02:00
Daniel Pavel
1d438f098f handle 0x07 battery notifications with indicating charging, but with no battery level 2013-06-29 20:26:29 +02:00
Daniel Pavel
1d305db29e minor UI layout tweaks 2013-06-29 19:02:19 +02:00
Daniel Pavel
c2a549c114 the K800 also has 3 leds, use them to indicate battery charge 2013-06-28 17:09:05 +02:00
Daniel Pavel
f43e298ac7 clean-up configuration on load and save 2013-06-26 16:05:14 +02:00
Daniel Pavel
c25b769578 repr() formatting cleanups 2013-06-26 13:40:46 +02:00
Daniel Pavel
0cf1f1983d handle backlight notifications from register 0x17 2013-06-26 13:38:36 +02:00
Daniel Pavel
39ec568ab1 descriptors table and devices documentation updated 2013-06-25 18:54:27 +02:00
Daniel Pavel
5b94ebae34 enable the backlight notifications on devices, if available 2013-06-25 18:53:18 +02:00
Daniel Pavel
a857b5fc43 fixed transparency in generated site icons 2013-06-25 17:11:28 +02:00
Daniel Pavel
eb8791ec47 fixed gh_pages script to use solaar.svg 2013-06-25 16:18:05 +02:00
Daniel Pavel
ff6da43007 version 0.8.99.7 2013-06-25 16:08:47 +02:00
Daniel Pavel
d42fdf8a4a updated debian copyright file (added svgs) 2013-06-25 16:06:13 +02:00
Daniel Pavel
adab25ad44 changelog updated 2013-06-25 16:02:21 +02:00
Daniel Pavel
90b057938b recommend python-dbus and upower in debian package control 2013-06-25 16:02:14 +02:00
Daniel Pavel
fc5c72e164 some clean-ups in descriptors 2013-06-25 16:01:29 +02:00
Daniel Pavel
bd5c03812f replaced solaar png icons with svgs 2013-06-25 15:59:49 +02:00
Daniel Pavel
6b0b7ea823 minor clean-ups and formatting 2013-06-24 17:04:19 +02:00
Daniel Pavel
dd24ed5fe0 brought solaar-cli in sync with the latest gui code 2013-06-24 17:02:45 +02:00
Daniel Pavel
f64942b51d if the battery level is approximative, show a string instead of percentage 2013-06-24 17:02:00 +02:00
Daniel Pavel
375db9996f fixed reading correct device kind on link notification 2013-06-24 16:58:41 +02:00
Daniel Pavel
20dfc063ff initial support for performance mx leds
The leds light up when we get updates about the battery level.
Right now they are not (programatically) turned off.
2013-06-23 20:59:16 +02:00
Daniel Pavel
70c341e268 don't use proxies for receiver/device objects
they should be unnecessary now that their status is properly tracked
2013-06-23 18:37:50 +02:00
Daniel Pavel
dc59c79bd3 properly handle tree re-selection when removing a receiver 2013-06-23 18:35:23 +02:00
Daniel Pavel
422cd26b92 some extra asserts on hid++ 1.0 register r/w 2013-06-23 18:16:13 +02:00
Daniel Pavel
cec892ce88 disable poll ticking
It was necessary to periodically check if the peripherals are still
online -- suspend/resume may cause Solaar to (wrongfully) remember the
status of devices after a resume.

Now that is handled by the optional upower module -- the hard way -- by
restarting all listeners on resume.
2013-06-23 18:15:19 +02:00
Daniel Pavel
d5374b9f51 optionally listen for upower suspend/resume events to stop/start all receiver listeners 2013-06-23 18:11:42 +02:00
Daniel Pavel
51e2d965cf version 0.8.99.6 2013-06-23 15:46:16 +02:00
Daniel Pavel
a6c8f2212a suggest appindicator library in solaar package 2013-06-23 15:45:07 +02:00
Daniel Pavel
b3aac40246 dropped activate_on_single_click, requires gtk 3.8 2013-06-23 13:44:34 +02:00
Daniel Pavel
fb138b77ff version 0.8.99.5 2013-06-23 13:09:44 +02:00
Daniel Pavel
273284da39 use number instead of serial to pick devices in ui (faster start-up) 2013-06-23 12:09:46 +02:00
Daniel Pavel
7102229937 properly handle ^C in console 2013-06-22 21:32:19 +02:00
Daniel Pavel
be80ba3b3b version 0.8.99.4 2013-06-21 22:27:18 +02:00
Daniel Pavel
4410cb6dc6 comment-out old main window 2013-06-21 22:25:04 +02:00
Daniel Pavel
df8df2bffa don't force a battery read on link active, will happen anyway 2013-06-21 22:24:28 +02:00
Daniel Pavel
ae4c921300 cleaner start-up of paired devices 2013-06-21 22:23:53 +02:00
Daniel Pavel
3d1aa6698d only check for non-unifying protocol only on nano receviers 2013-06-21 22:19:31 +02:00
Daniel Pavel
613b115eb4 fixed clean-up of config panel when unpairing devices 2013-06-21 16:51:39 +02:00
Daniel Pavel
e19b690bd5 fixed reading of polling rate 2013-06-21 16:47:19 +02:00
Daniel Pavel
888be8e8a8 be a bit more patient when pairing, the device notification may come after the pairing lock is closed 2013-06-21 16:40:00 +02:00
Daniel Pavel
5785896007 status: the device may be invalid when processing the unpair notification 2013-06-21 16:39:30 +02:00
Daniel Pavel
8d522de7e7 drop some unnecessary logging when ignoring request replies 2013-06-21 16:39:04 +02:00
Daniel Pavel
81ae4c8d4d forgot about pairing notification on receiver... 2013-06-21 16:32:29 +02:00
Daniel Pavel
8cd3b8fdef save configuration a little early, better timing on shutdown 2013-06-21 15:21:49 +02:00
Daniel Pavel
c1aa341a7a tweaked timing of enabling receiver notifications 2013-06-21 15:20:52 +02:00
Daniel Pavel
f9c192c47a only look for a different tray battery icon if the changed device is a peripheral 2013-06-21 15:19:07 +02:00
Daniel Pavel
cdc6da844e made the config_panel self-contained 2013-06-21 15:18:21 +02:00
Daniel Pavel
fd35f23af7 one a separate flag to check if the device is active 2013-06-21 15:17:14 +02:00
Daniel Pavel
c04851f64e better handling of timeouts in base.request 2013-06-21 15:05:48 +02:00
Daniel Pavel
3a63c3ad43 fixed reading encrypted link status in pairing window 2013-06-21 15:04:06 +02:00
Daniel Pavel
431f1c97cf added read/write_register to receiver and devices 2013-06-21 15:03:36 +02:00
Daniel Pavel
1b68a3d5a9 fixed request timeouts for devices 2013-06-20 19:51:54 +02:00
Daniel Pavel
c797808a40 fixed status keys in pairing 2013-06-20 19:35:54 +02:00
Daniel Pavel
d810ccba84 tray icon: pick the battery of the lowest _active_ device 2013-06-20 17:25:53 +02:00
Daniel Pavel
2fea5d9af2 disable the unpair button for peripherals of a Nano receiver 2013-06-20 17:21:58 +02:00
Daniel Pavel
1d9a3bf23a fixed checking for features of offline 2.0 devices 2013-06-20 17:21:23 +02:00
Daniel Pavel
3d8c764eb0 relax timeouts for device requests 2013-06-20 17:13:49 +02:00
Daniel Pavel
eb317f0d46 version 0.8.99.2 2013-06-20 14:49:02 +02:00
Daniel Pavel
27de1aea11 tray/window: append new devices rather than inserting them at the top 2013-06-20 14:43:49 +02:00
Daniel Pavel
92f7e761ee don't save the configuration if it hasn't been loaded first 2013-06-20 14:27:18 +02:00
Daniel Pavel
b2f1786eff use consistent naming of offline state for devices 2013-06-20 14:18:36 +02:00
Daniel Pavel
f8369e7c63 properly style the details panel 2013-06-20 14:18:03 +02:00
Daniel Pavel
f095a74f2a make the main window a regular window (visible in tasks list) 2013-06-20 13:51:42 +02:00
Daniel Pavel
4e3fccb009 fixed sizing of details panel 2013-06-20 13:41:05 +02:00
Daniel Pavel
a2995ed3c5 minor build_deb script update 2013-06-20 13:13:14 +02:00
Daniel Pavel
5edff9235b changelog update 2013-06-20 13:12:39 +02:00
Daniel Pavel
31e134c1e0 don't wait so long on the first idle poll 2013-06-20 13:12:29 +02:00
Daniel Pavel
47e22b788f version 0.8.99, will become 0.9 on release 2013-06-20 13:12:12 +02:00
Daniel Pavel
798628fdf8 add the USB id for the receiver in the details panel 2013-06-20 13:10:55 +02:00
Daniel Pavel
ca9825d262 support for the VX Nano mouse 2013-06-20 13:10:30 +02:00
Daniel Pavel
1a36ec65ee faster checking of feature-based settings 2013-06-20 12:55:48 +02:00
Daniel Pavel
d07a20e6f8 improved reading device properties 2013-06-20 12:54:27 +02:00
Daniel Pavel
783b317281 added a protocol field to the device descriptors 2013-06-20 11:04:17 +02:00
Daniel Pavel
4bc525f250 minor clean-ups 2013-06-20 11:02:45 +02:00
Daniel Pavel
11cfc7ea09 enable notification on recevier as soon as possible 2013-06-19 19:46:54 +02:00
Daniel Pavel
a806f2672d group all status keys into one object 2013-06-19 19:45:39 +02:00
Daniel Pavel
2fee88e54b fixed battery charge display in device info 2013-06-19 19:23:18 +02:00
Daniel Pavel
7e1a2a6e4f more fixes for device unpairing 2013-06-19 17:21:28 +02:00
Daniel Pavel
d5b311760e clean obsolete settings controls when devices are unpaired 2013-06-19 17:04:01 +02:00
Daniel Pavel
dffe6f8b91 fix display of firmware in details panel 2013-06-19 17:03:16 +02:00
Daniel Pavel
b4bca4670b cache notification flags when possible
avoids unnecessary reads from devices when the status hasn't changed
2013-06-19 17:03:01 +02:00
Daniel Pavel
150c43f41f some logging in udev 2013-06-19 16:49:20 +02:00
Daniel Pavel
9fc11df229 fixed window update when unpairing 2013-06-19 16:22:44 +02:00
Daniel Pavel
56a7a960c3 polling: it may happen that the receiver is removed mid-poll 2013-06-19 16:14:04 +02:00
Daniel Pavel
cd44cc6396 new single-window UI 2013-06-19 15:28:13 +02:00
Daniel Pavel
4af714f1dd K750: register the FN swap setting statically, no need to detect it at runtime 2013-06-18 16:48:02 +02:00
Daniel Pavel
836719587c renamed NANO receiver id 2013-06-18 16:45:44 +02:00
Daniel Pavel
2d6fab6e14 gh_pages build script updated 2013-06-17 16:48:04 +02:00
Daniel Pavel
0ae58a3346 fixed ubuntu dh_link 2013-06-17 16:47:44 +02:00
Daniel Pavel
f32e958984 version 0.8.9.4 2013-06-17 16:12:32 +02:00
Daniel Pavel
0703d927ca document Logitech receiver USB ids 2013-06-17 16:12:09 +02:00
Daniel Pavel
62b5deb77d debconf translation support (just english for now) 2013-06-17 16:11:46 +02:00
Daniel Pavel
82e718b3d1 create the plugdev group in postinst, not config 2013-06-17 16:11:17 +02:00
Daniel Pavel
41409c9b94 use debconf to check if the plugdev group is necessary 2013-06-17 14:45:45 +02:00
Daniel Pavel
57c759773a attach configuration to device settings objects 2013-06-17 11:00:53 +02:00
Daniel Pavel
9d6402a4f7 shorter thread name on receiver listener 2013-06-17 08:00:17 +02:00
Daniel Pavel
a29609df21 only save the configuration once when Solaar ends 2013-06-17 08:00:00 +02:00
Daniel Pavel
04ea8293a8 persist and restore device settings 2013-06-16 17:41:03 +02:00
Daniel Pavel
bde54aba3b proper shutdown of receiver listeners 2013-06-16 17:10:46 +02:00
Daniel Pavel
687e1be3e5 simplify debian/rules a bit 2013-06-16 17:10:46 +02:00
Daniel Pavel
a44d9b7ca8 fix battery display in main window 2013-06-16 17:10:46 +02:00
Daniel Pavel
febf571d84 account for devices going out-of-range while active 2013-06-16 17:10:46 +02:00
Daniel Pavel
818ece9f10 Merge pull request #67 from Lekensteyn/updates
udev: Use uaccess instead of plugdev (pwr/Solaar#66)
2013-06-16 08:10:04 -07:00
Peter Wu
ec10c9c70c udev: Use uaccess instead of plugdev (pwr/Solaar#66)
Rules are taken from https://git.lekensteyn.nl/ltunify/. The "VX Nano" receivers
(c51a and c526) have been removed as these are only used for Cordless mice and
are not even enabled in Solaar.

The installer is updated to check for the existence of a group and `mktemp` to
create temporary files. (relying on `$TMPDIR` is a bad idea.) This installer is
too fancy, most users will be fine with `install -m644
rules.d/42-logitech-unify-permissions.rules /etc/udev/rules.d/`. If you are lazy
and want to make `solaar-cli` work over SSH, then this installer will help you.
It won't add you to the `plugdev` group, instead it will edit the rule to use
your user's primary group.

Oh, and it does not change this group to "root" as that is pretty useless given
that root is the default.
2013-06-16 11:33:37 +02:00
Daniel Pavel
8852d50971 mark device status as inactive after idling out 2013-06-12 14:31:46 +02:00
Daniel Pavel
908f6763be updated deb/ppa build scripts 2013-06-12 14:31:16 +02:00
Daniel Pavel
03e20842fb cleaned-up gtk ui initialization 2013-06-12 14:29:34 +02:00
Daniel Pavel
084913ac91 updated devices documentation 2013-06-12 14:29:01 +02:00
Daniel Pavel
d9801e2d57 fixed firmware info for some HID++ 2.0 devices 2013-06-12 14:21:31 +02:00
Daniel Pavel
29fe913fd8 version 0.8.9.3 2013-06-08 21:11:39 +02:00
Daniel Pavel
5b68f9623e fix indicator description when there are receivers but no devices 2013-06-08 21:10:17 +02:00
Daniel Pavel
2a6662472d account for all GLib.id_add_watch variants 2013-06-08 21:07:24 +02:00
Daniel Pavel
5cf6777340 more tweaks to idle polling 2013-06-08 21:06:52 +02:00
Daniel Pavel
17863c85b6 fixed querying for known registers 2013-06-08 21:06:22 +02:00
Daniel Pavel
237d0f9d9a keep the battery level if polling the device marks it as offline 2013-06-08 21:05:30 +02:00
Daniel Pavel
b98e27e464 fix permissions error popup 2013-06-08 21:04:32 +02:00
Daniel Pavel
d01d9edb78 tweaked idle polling timings 2013-06-08 16:27:03 +02:00
Daniel Pavel
0a86683392 clean-up in solaar.listener 2013-06-08 16:18:25 +02:00
Daniel Pavel
b2b4febd31 receiver notifications: don't set all flags, might fail 2013-06-08 16:18:10 +02:00
Daniel Pavel
ad67e6eaee fix read timeouts in base.py, use seconds everywhere 2013-06-08 16:17:14 +02:00
Daniel Pavel
ed5ce48f65 fixes to polling receiver/device status 2013-06-08 16:16:12 +02:00
Daniel Pavel
2e351bfc78 read .devscripts if available 2013-06-08 16:08:00 +02:00
Daniel Pavel
f324b97e8b use GLib.io_add_watch_full when available 2013-06-08 15:02:44 +02:00
Daniel Pavel
46544e1cbe listen for udev events on the GLib main loop 2013-06-07 14:39:04 +02:00
Daniel Pavel
ffab6c0e12 move Gtk-specific idle_add() and main() into ui 2013-06-07 14:37:03 +02:00
Daniel Pavel
10e736386b user module __name__ when initializing logger 2013-06-07 14:28:13 +02:00
Daniel Pavel
a1ecebf5bf documentation and logging for 2013-06-07 14:24:05 +02:00
Daniel Pavel
996597dcb1 fixed upload_ppa script 2013-06-06 12:25:17 +02:00
Daniel Pavel
e09ad373b3 version 0.8.9.2 2013-06-06 12:19:44 +02:00
Daniel Pavel
ddf7d34982 debian packaging: always require -gnome3 for unity integration 2013-06-06 12:18:48 +02:00
Daniel Pavel
db9a4e4402 docs & changelog updates 2013-06-06 10:44:45 +02:00
Daniel Pavel
39a75a6792 AppIndicator: scrolling on the icon cycles through all devices 2013-06-06 10:25:35 +02:00
Daniel Pavel
d78484ff38 use githubredir.debian.net in watch 2013-06-05 19:49:23 +02:00
Daniel Pavel
8900ac9a1f tweak main window geometry 2013-06-05 13:21:22 +02:00
Daniel Pavel
7df2e8af97 jekyll config update, tweaked deb/gh scripts 2013-06-05 13:20:26 +02:00
Daniel Pavel
2ed723dfc2 minor doc update 2013-06-05 13:20:26 +02:00
Daniel Pavel
087177274d Merge pull request #63 from Lekensteyn/updates
Device documentation updates
2013-06-05 04:16:58 -07:00
Peter Wu
59459ebbd6 Fix crash in Python3 due to excess space
The error message was:

    TabError: inconsistent use of tabs and spaces in indentation
2013-06-05 12:39:00 +02:00
Peter Wu
2d981cd737 docs: add mk700 2013-06-05 12:39:00 +02:00
Peter Wu
4c4e6fd6f9 doc/k360: add another recv+kbd, fixup recv serial
Bug in ltunify made the serial number shift by one byte.
2013-06-05 12:38:03 +02:00
Daniel Pavel
c52f2fc069 fix descriptor for K700 keyboard 2013-06-05 01:24:19 +02:00
Daniel Pavel
eb3e2566e9 comment-out unnecessary logs 2013-06-05 00:32:01 +02:00
Daniel Pavel
c186573775 fix register blacklisting 2013-06-05 00:31:40 +02:00
Daniel Pavel
3d9d8d6efc replaced light_* icons with smaller ones 2013-06-04 10:03:13 +02:00
Daniel Pavel
1ed82fc7d5 version 0.8.9.1 2013-06-03 22:02:00 +02:00
Daniel Pavel
162228aff3 started configuration persistence implementation 2013-06-03 22:01:16 +02:00
Daniel Pavel
dd051f4c6e check latest github tag when generating gh-pages 2013-06-03 21:58:53 +02:00
Daniel Pavel
e59645b347 documentation updates 2013-06-03 21:40:54 +02:00
Daniel Pavel
cbdc0bd99b very low battery level should trigger an attention event 2013-06-03 21:40:15 +02:00
Daniel Pavel
b4fc36701a added attention() to tray icon 2013-06-03 21:39:29 +02:00
Daniel Pavel
f2f00e3017 re-arranged for easier extension 2013-06-03 11:17:58 +02:00
Daniel Pavel
c706fbc6e7 update icon theme paths directly, don't mess with XDG_DATA_DIRS 2013-06-03 11:17:19 +02:00
Daniel Pavel
88fb8458c1 logging tweaks 2013-06-02 16:16:58 +02:00
Daniel Pavel
982f298fc4 fixed page back-link 2013-06-02 12:20:44 +02:00
Daniel Pavel
4a9a05718e readme updated with Debian repo link 2013-06-02 12:16:24 +02:00
Daniel Pavel
b99a851af3 build deb-repo Packages index in $SITE/packages 2013-06-02 12:14:20 +02:00
Daniel Pavel
f452d6f5b7 jekyll pages: use absolute path for styles/images 2013-06-02 12:13:10 +02:00
Daniel Pavel
b98b94de91 documentation update -- gnome-shell indicators supported 2013-06-02 11:23:53 +02:00
Daniel Pavel
b18aee9dba maintain proper devices order in tray menu 2013-06-02 11:19:49 +02:00
Daniel Pavel
bfe7bcf1b4 avoid possible race condition on device initialization 2013-06-02 11:19:30 +02:00
Daniel Pavel
55bb732bb0 dropped unused battery icons 2013-06-02 01:11:47 +02:00
Daniel Pavel
465fea8a16 dropped solaar-mask unused icon 2013-06-02 01:11:32 +02:00
Daniel Pavel
149758ccab fixed battery icons in systray menu items 2013-06-02 01:11:04 +02:00
Daniel Pavel
16095544cb debian/control: put solaar-gnome3 in 'gnome' section 2013-06-01 23:10:10 +02:00
Daniel Pavel
37265f25d8 support custom icons in notification messages 2013-06-01 22:32:57 +02:00
Daniel Pavel
c61eb3f039 show charging status in device icon 2013-06-01 22:08:14 +02:00
Daniel Pavel
39862034e1 use just the battery icon in systray 2013-06-01 21:09:41 +02:00
Daniel Pavel
f938b29040 doc: icon names for various icon themes 2013-06-01 18:53:49 +02:00
Daniel Pavel
984b92815c use explicit debian/*.install files 2013-06-01 18:53:20 +02:00
Daniel Pavel
82c4b0007c updated solaar version to 0.8.9 2013-06-01 18:19:47 +02:00
Daniel Pavel
f4a3f699e8 debian/control: tweaks for gnome-shell/unity support 2013-06-01 18:19:31 +02:00
Daniel Pavel
9c4055a046 added Keywords entry to .desktop file 2013-06-01 18:01:23 +02:00
Daniel Pavel
088493dc4f guess battery icon set from the current theme 2013-06-01 17:34:54 +02:00
Daniel Pavel
479ab1fb7b generate a -gnome3 package for gnome-shell integration 2013-06-01 17:34:05 +02:00
Daniel Pavel
749cde6e72 require gir1.2-appindicator3 on ubuntu 2013-06-01 15:09:05 +02:00
Daniel Pavel
7317fad754 some debugging when setting icon theme paths 2013-06-01 15:08:23 +02:00
Daniel Pavel
83a29328c7 don't use notification flags with HID++ 2.0 devices 2013-06-01 15:07:39 +02:00
Daniel Pavel
788fb145af use an AppIndicator if available, instead of the status icon 2013-06-01 15:06:43 +02:00
Daniel Pavel
b1b1a9b5de Merge remote-tracking branch 'origin/master' 2013-05-27 16:24:34 +03:00
Daniel Pavel
941a36a385 Merge pull request #61 from Lekensteyn/sandbox
More special keys
2013-05-27 06:23:45 -07:00
Peter Wu
3ef3c23a29 devices/k360: update solaar output (keys, features) 2013-05-27 14:12:44 +02:00
Peter Wu
39e630cece cli: improve alignment for special keys
The following lines have an insane length and are therefore not included in the
longest line:

    WIN7_MONITOR_SWITCH_AS_WIN_SHIFT_LEFTARROW=0x0093,
    WIN7_MONITOR_SWITCH_AS_WIN_SHIFT_RIGHTARROW=0x0094,

While doing this, also fix an obvious typo in the "Lock PC" control.
2013-05-27 14:07:38 +02:00
Peter Wu
b2a62c2dd7 special_keys: update controls list
My previous observation was right, controls and tasks are really different
entities. The following "controls" appears to be invalid and have been removed:

    Home=0x001A,
    Music=0x001D,
    Search=0x0029,
    Sleep=0x002F,
2013-05-27 11:44:20 +02:00
Daniel Pavel
26dd3a2ca8 only need to set the default window icon once 2013-05-27 12:36:39 +03:00
Daniel Pavel
c328d6f6c6 fixed pairing in solaar-cli 2013-05-27 09:08:23 +03:00
Daniel Pavel
44c79d71d7 use new get_notifications_flags api in solaar-cli 2013-05-27 08:04:49 +03:00
Daniel Pavel
ecd90d605a Merge pull request #60 from Lekensteyn/updates
Update feature name list
2013-05-26 14:55:23 -07:00
Peter Wu
b6bd4b9da0 cli: fix alignment with new feature names 2013-05-26 23:51:46 +02:00
Peter Wu
6ae11f862c Add more feature names, rename existing ones
Extracted from SetPoint 6.52.74 software using:

    <FeaturesSupported.xml awk -F\" '/<Feature /{sub(/^LD_FID_/, "", $2); printf("\t%s=%s,\n", $2, $4)}' | sort -t= -k2

Existing names are renamed to the newer, verbose names.
2013-05-26 23:47:40 +02:00
Daniel Pavel
c224141355 Merge pull request #59 from Lekensteyn/special-keys
Special keys and tasks
2013-05-26 13:54:00 -07:00
Peter Wu
28c35633d3 Add more tasks for special keys
Based on tasks.xml from `%ProgramFiles%\\SetPointP\\tasks.xml`.
2013-05-26 22:47:03 +02:00
Peter Wu
6e36e33b22 Decouple controls from tasks (programmable keys)
They are treated differently in the HID++ 2.0 specification. Observations seem
to confirm this difference. For instance, a part of solaar-cli's output:

	0: unknown:0022         => Home                   FN sensitive, is FN, reprogrammable
	1: Mail                 => Mail                   FN sensitive, is FN, reprogrammable
	2: unknown:003E         => Search                 FN sensitive, is FN, reprogrammable
2013-05-26 22:47:03 +02:00
Daniel Pavel
093cca9d21 Merge pull request #57 from Lekensteyn/fixes
K360 docs, Improved solaar-cli argparse fix
2013-05-26 12:18:43 -07:00
Peter Wu
410c19dd78 devices/k360: ltunify+solaar-cli output of k360+receiver 2013-05-26 21:02:08 +02:00
Peter Wu
4a7be89be6 devices.md: add reprog keys to feature list, K360 2013-05-26 20:58:53 +02:00
Peter Wu
51305e0a21 solaar-cli: fix regression in argument parsing
When no hidraw device is given, `solaar-cli` crashes because `None` is being
indirected. Use the correct action (`store`) to avoid indirecting a list.
2013-05-26 20:51:58 +02:00
Daniel Pavel
fda3398440 commented-out stray print 2013-05-26 19:02:17 +03:00
Daniel Pavel
340ff0107c version 0.8.8.2 2013-05-26 18:43:23 +03:00
Daniel Pavel
8374a58dc1 fixed items in the systray menu 2013-05-26 18:40:53 +03:00
Daniel Pavel
3690863a27 fixed receiver icon in systray menu 2013-05-26 02:56:43 +03:00
Daniel Pavel
078d003cfe about window icon was not displayed 2013-05-26 02:56:25 +03:00
Daniel Pavel
b6ab795878 don't add receivers to the status icon tooltip 2013-05-26 02:03:58 +03:00
Daniel Pavel
7e81dede2f non-modal about dialog; fixes #46 2013-05-26 02:01:59 +03:00
Daniel Pavel
3482257b15 fix solaar-cli when no hidraw path given 2013-05-26 01:40:10 +03:00
Daniel Pavel
9f3ab8d3dd Merge remote-tracking branch 'origin/master' 2013-05-26 01:33:13 +03:00
Daniel Pavel
8f2ee555ec updated arch packaging scripts with official ones 2013-05-26 01:32:46 +03:00
Daniel Pavel
db53de2233 updated status_icon to support future appindicator implementation 2013-05-26 01:24:49 +03:00
Daniel Pavel
3596faed2f documentation updated with info about Nano receivers 2013-05-26 01:23:27 +03:00
Daniel Pavel
9e13d134d3 Merge pull request #56 from Lekensteyn/cli-updates
solaar-cli: Python3 fix, add option for custom receiver path
2013-05-25 08:43:53 -07:00
Peter Wu
7f229005a6 solaar-cli: support specifying different receiver 2013-05-25 15:46:13 +02:00
Peter Wu
e3a887f36c solaar-cli: fix argument parsing in Python 3 2013-05-25 15:17:43 +02:00
Daniel Pavel
bca8e64574 added README to packaging/ folder 2013-05-23 16:21:53 +03:00
Daniel Pavel
3873d7099c slightly reduce sleep timings when waiting for reply 2013-05-23 04:59:16 +03:00
Daniel Pavel
48b176f49a show result on reg00 unparsable output 2013-05-23 04:58:35 +03:00
Daniel Pavel
8b8b387f2a minor tweak to guessing device icon 2013-05-22 20:50:49 +03:00
Daniel Pavel
f459d9b953 updated installation docs and udev rule install scrip 2013-05-22 20:50:35 +03:00
Daniel Pavel
b276fbab90 updated scan-registers to support receiver scan 2013-05-22 20:47:04 +03:00
Daniel Pavel
e73f076324 don't support the VX Nano right now 2013-05-22 20:43:29 +03:00
Daniel Pavel
131f8f7f45 disable status polling on devices
the regular flow should be reading the battery on all devices now
2013-05-22 20:42:26 +03:00
Daniel Pavel
c3b73964d5 improved support for some Nano receivers 2013-05-22 20:41:11 +03:00
Daniel Pavel
790fc7c04b improved support for the Nano receiver 2013-05-22 07:31:16 +03:00
Daniel Pavel
cd33314d0b use passwd | addgroup in post-install 2013-05-22 06:55:59 +03:00
Daniel Pavel
4ba50267f1 add favicon when building site 2013-05-22 01:25:45 +03:00
Daniel Pavel
d46e603366 Merge remote-tracking branch 'origin/master' 2013-05-22 01:21:34 +03:00
Daniel Pavel
f8878d73c3 Merge pull request #54 from Lekensteyn/doc-updates
Doc updates
2013-05-21 15:19:46 -07:00
Peter Wu
9c0dac044c hid10: update 07 battery parsing based on spec
This fixes pwr/Solaar#49 partially, at least the charging state will be reported
correctly hereafter. The charge level may still be incorrect though.
2013-05-22 00:10:17 +02:00
Peter Wu
2f8e330b73 doc/logitech: add HID++1.0 battery level info
This should help in https://github.com/pwr/Solaar/issues/49. This information
was shared by Nestor Lopez Casado from Logitech.

What remains unclear are the 0x25 and 0x26 values for r1 (Charging state). It is
also not clear whether r0 (Battery/Charging level) always reports 0x00 while
charging the Performance MX. (Perhaps this is only reported the first few
seconds?)
2013-05-21 23:56:44 +02:00
Daniel Pavel
e6e55aa827 added performance mx LED documentation
supplied by Alexander Hofbauer
2013-05-22 00:31:08 +03:00
Peter Wu
07bff8cb37 docs/installation: typo fix, clarification
- Fix typo in rules path
 - Fix capitalisation.
 - `udevadm control --reload-rules` is unnecessary[1].
 - `adduser` is Debian-specific, use the more portable `gpasswd`.
 - No need to wait 10 seconds before re-inserting.
 - After adding to group, user must re-login.

 [1]: http://unix.stackexchange.com/a/39485/8250
2013-05-21 10:59:46 +02:00
Daniel Pavel
d857144653 added script to build gh-pages with jekyll 2013-05-21 01:12:04 +03:00
Daniel Pavel
17fdd840bb setup.py: use the version declared in the sources 2013-05-21 01:08:34 +03:00
Daniel Pavel
da6711c93c the 'Solar key' on K750 is named 'Light Check button' 2013-05-21 00:48:21 +03:00
Daniel Pavel
36b307eb49 updated debian/ppa build scripts 2013-05-21 00:47:47 +03:00
Daniel Pavel
2d8ec2fd78 added jekyll skeleton for the site 2013-05-21 00:46:49 +03:00
Daniel Pavel
11ba96103c minor updates to the documentation files 2013-05-21 00:46:07 +03:00
Daniel Pavel
843d2a224d add license section into the README 2013-05-20 16:49:44 +03:00
Daniel Pavel
0faf01c194 place the main application icon in share/pixmaps, not share/icons 2013-05-20 16:34:14 +03:00
Daniel Pavel
e868cf6270 use a separate icon for the about logo 2013-05-20 16:32:26 +03:00
Daniel Pavel
255b3d0da7 minor documentation updates 2013-05-20 13:53:39 +03:00
Daniel Pavel
5fad8d0680 minor documentation updates 2013-05-20 13:27:26 +03:00
Daniel Pavel
d3dcdcb92e Merge remote-tracking branch 'origin/master' 2013-05-19 11:54:38 +03:00
Daniel Pavel
44ae5edc56 Merge pull request #48 from Lekensteyn/doc-updates
Doc updates for HID++ 1.0 notifications
2013-05-19 01:52:07 -07:00
Peter Wu
f0542923d7 hid10: update flags description for notifications
The Logitech HID++ 1.0 documentation actually names the fields for devices and
receiver. Clarify that and explain why enabling all of the bits is a bad idea.
2013-05-19 10:30:41 +02:00
Peter Wu
29d0c07164 hid10: Formatting and re-order NOTIFICATION_FLAGs
Align values for easier reading the numeric values of NOTIFICATION_FLAGs.  To
maintain consistency in the ordering of the values, swap keyboard_backlight with
keyboard_present.
2013-05-19 10:20:21 +02:00
Peter Wu
152abb086a hid10: document notifications better
See [registers.txt][1] for 'keyboard_backlight'. The behavior of
keyboard_sleep_raw and keyboard_multimedia_raw is described at
[keyboard.txt][2].

 [1]: https://git.lekensteyn.nl/ltunify/tree/registers.txt
 [2]: https://git.lekensteyn.nl/ltunify/tree/keyboard.txt
2013-05-19 10:14:31 +02:00
Daniel Pavel
d5c36ddc89 about window tweak 2013-05-19 03:54:30 +03:00
Daniel Pavel
226a4ea2f3 version 0.8.8.1 2013-05-19 03:53:49 +03:00
Daniel Pavel
ac0eafe6ab don't crash when failing to load the icon mask 2013-05-19 03:52:01 +03:00
Daniel Pavel
87bc9a5431 depend on gnome-icon-theme or oxygen-icon-theme
It's necessary to make sure all the standard icons are available.
2013-05-19 03:35:42 +03:00
Daniel Pavel
ef62892f60 pop up a desktop notification if the battery is below 5% 2013-05-18 14:35:33 +03:00
Daniel Pavel
7ae24488d9 only notify on connected devices at start-up 2013-05-18 02:20:22 +03:00
Daniel Pavel
6482670fdf minor readme update 2013-05-18 01:31:15 +03:00
Daniel Pavel
317cf6d00f only enable certain notification flags on devices
Also added some documentation to the notification flags, where possible.
2013-05-18 00:15:42 +03:00
Daniel Pavel
a5eeac6e5a enable notifications for peripherals; fixes #27 2013-05-17 23:06:24 +03:00
Daniel Pavel
e2cf9255ac Merge pull request #41 from Lekensteyn/tool-updates
scan-registers: determine available notifications
2013-05-17 12:44:23 -07:00
Daniel Pavel
25941cdbdd debian version update 2013-05-17 20:04:33 +03:00
Daniel Pavel
1764633bc5 status icon menu items open the right device window 2013-05-17 19:55:07 +03:00
Daniel Pavel
f6eb90bd2d version and url fixes 2013-05-17 19:22:05 +03:00
Daniel Pavel
5f46c820e6 re-work the status icon updating 2013-05-17 16:03:37 +03:00
Daniel Pavel
c20b279362 minor tweaks 2013-05-08 12:06:01 +03:00
Daniel Pavel
24ceb8801e window popup fix for kwin
also, only try to position the window next to the status icon if it has never
been shown before
2013-05-07 05:59:29 +02:00
Daniel Pavel
8d5ca66db7 get rid of bad map() calls 2013-05-06 17:51:03 +02:00
Daniel Pavel
f0d250ff15 updated debian/control dependencies 2013-05-06 17:40:17 +02:00
Daniel Pavel
074cafbab1 simpler (and dumber) way to position receiver windows initially 2013-05-06 17:39:27 +02:00
Daniel Pavel
79cd52833c fix hidconsole for python 2/3 2013-05-06 17:38:09 +02:00
Daniel Pavel
6b75286885 Merge remote-tracking branch 'origin/master' 2013-05-06 17:23:38 +02:00
Daniel Pavel
b884ae039c Merge pull request #40 from Lekensteyn/fixes
Fix window close, fix positioning of new windows
2013-05-06 08:19:27 -07:00
Daniel Pavel
3ecfdd027e handle all 07/0D register notifications 2013-05-06 17:08:58 +02:00
Daniel Pavel
55ca9927b0 python 2/3: fix handling of first argument (unicode) of pack/unpack 2013-05-06 16:50:17 +02:00
Daniel Pavel
b67377c41e minor clean-up in hidconsole 2013-05-06 15:35:47 +02:00
Daniel Pavel
15f24eb26b use 'with' lock syntax instead of acquire/release 2013-05-06 15:35:20 +02:00
Daniel Pavel
0283bb0e91 fix str/unicode detection in Python 3.2 2013-05-06 15:33:42 +02:00
Daniel Pavel
d39c0995b6 Merge remote-tracking branch 'origin/master' 2013-05-06 14:55:21 +02:00
Daniel Pavel
db4c088ce9 Merge pull request #37 from Lekensteyn/py3-compat
Py3 compat: replace use of "unicode" (pwr/Solaar#32)

The `u''` syntax fails in Python 3.2; will fix is_string after the merge.
2013-05-06 05:54:53 -07:00
Daniel Pavel
a4898e24b7 extended documentation of descriptors and registers 2013-05-06 14:51:57 +02:00
Daniel Pavel
086db0d52f Merge pull request #42 from Lekensteyn/doc-updates
performance-mx: dump from scan-registers
2013-05-06 05:47:24 -07:00
Peter Wu
7b3523fb24 performance-mx: dump from scan-registers
Source: https://github.com/pwr/Solaar/issues/27#issuecomment-17472543 and
https://github.com/pwr/Solaar/issues/27#issuecomment-17478409 .
2013-05-06 14:37:28 +02:00
Daniel Pavel
74ca91d611 next version will be 0.8.8 2013-05-06 14:33:06 +02:00
Daniel Pavel
e94d4b28b0 build a proper ghost device when unpairing; fixes #36 2013-05-06 12:06:28 +02:00
Peter Wu
a85aa2da52 scan-registers: determine available notifications
00 is documented in HID++ 1.0 specification, it should be safe to set the 00
register. As another program may have written the notifications register
already and since enabling notifications has side-effects such as "disabling"
certaing functions, restore the flags after reading out available notifs.
2013-05-05 18:16:00 +02:00
Peter Wu
dded8504e6 Fix window positioning of main windows
Previously, the intent was likely to position the receiver window near the
status icon. It did so by calling move followed by present. According to the
Gtk documentation, move() may fail if the window is hidden before.

Therefore present the window *after* determining the position, but *before*
moving it. (presenting the window before getting the position gives a Gtk
warning and has unpredictable behavior wrt. the window position).

As window positioning is now enabled, add additional logic to prevent overlap
of windows: position the first window near the status icon and others on the
left. This is not idea, e.g. when the status icon is on the left side of the
screen, but the idea of positioning windows near to each other is broken anyway.
2013-05-05 11:18:29 +02:00
Peter Wu
a2bad425f6 Fix window close, icon toggle logic
"Toggle" should mean "show or hide all windows", not "flip the visibility state
of windows". Case: one receiver window is open. When a new receiver is
connected, I also expect it to be open. Instead it is hidden, so I click the
icon. Now the new receiver window is shown, but the previous one is hidden.
Huh?! Indeed, let's fix that.
2013-05-05 11:18:29 +02:00
Daniel Pavel
a4ec8ec05d better error dialog on receiver permission error; fixes #17
The problem is caused by starting Solaar right after installing it; while udev
does have the new rule loaded, the /dev/hidraw* device nodes already exist
with the old permissions.

Rather than doing a "udevadm --reload-rules" (which could have unknown side-
effects on other devices), instruct the user to remove and re-insert the usb
receiver. The new /dev/hidraw* device nods will be created with the right
permissions.
2013-05-05 10:35:03 +02:00
Daniel Pavel
1b4bf7918b minor fixes in shell scripts 2013-05-04 19:00:14 +02:00
Daniel Pavel
1f48e44cc6 Merge remote-tracking branch 'origin/master' 2013-05-04 20:20:43 +02:00
Daniel Pavel
83613f02a0 disable info label while we're still reading the info from the device 2013-05-04 20:19:33 +02:00
Daniel Pavel
9d8743e765 comment-out descriptor settings for Anywhere MX, not actually tested 2013-05-04 20:18:10 +02:00
Daniel Pavel
84b9b11ef5 Merge pull request #39 from Lekensteyn/doc-updates
descriptors.py: Clarify use of negative values
2013-05-04 11:14:09 -07:00
Peter Wu
2327a0012e descriptors.py: Clarify use of negative values
The negative behavior is not obvious, document it in the descriptors.py file
such that people who edit it to add new devices know how it works.
2013-05-04 20:02:37 +02:00
Daniel Pavel
4cdd796a3d comment-out some debugging prints 2013-05-04 19:50:50 +02:00
Daniel Pavel
e819265e7e fix automatic register blacklisting 2013-05-04 19:50:08 +02:00
Daniel Pavel
070a96c506 removed dox(x) documentation 2013-05-04 19:42:26 +02:00
Daniel Pavel
e1be54823c updated supported devices documentation 2013-05-04 18:26:09 +02:00
Daniel Pavel
d7dd9393ff minor clean-ups 2013-05-04 17:19:48 +02:00
Daniel Pavel
64c36a1562 updated descriptors table and the devices doc 2013-05-04 17:18:39 +02:00
Daniel Pavel
13a54565ba cleaned-up the descriptors table 2013-05-04 15:09:50 +02:00
Daniel Pavel
12eb17cc41 updated supported devices table 2013-05-04 15:06:55 +02:00
Daniel Pavel
9715dfa126 added a couple of more logitech docs 2013-05-04 15:06:38 +02:00
Daniel Pavel
a6e3689e97 split manual instalation procedure into it's own document 2013-05-04 14:13:31 +02:00
Daniel Pavel
2e5cf81231 split the supporte devices section into separate file
docs/devices.md contains now a few tables with supported devices
and their features (in progress)
2013-05-04 14:06:12 +02:00
Daniel Pavel
4eeca12d6a create and destroy windows on demand
based on receiver added/removed events generated by udev
2013-05-04 12:20:51 +02:00
Daniel Pavel
ad577d22d0 handle sleep in udev monitoring, fixes #35 2013-05-04 12:19:29 +02:00
Daniel Pavel
5e68094e87 split the about window into its own module 2013-05-04 12:01:28 +02:00
Peter Wu
10c26fe642 Py3 compat: replace use of "unicode" (pwr/Solaar#32)
Generating "an unknown notification" type bailed out because of an unknown
feature type None. Since `isinstance(other, str)` is False for None, the script
will raise an exception on `isinstance(other, unicode)`.

There is no differentiation between `str` and `bytes` in Python 2, therefore
add another condition to `NamedInt.__eq__` to catch unknown types (like
`bytes`).
2013-05-03 23:46:46 +02:00
Daniel Pavel
49ecd252ed always log exceptions, even without -v 2013-05-03 18:42:45 +02:00
Daniel Pavel
2ee2a5dc46 Merge remote-tracking branch 'origin/master' 2013-05-03 17:08:32 +02:00
Daniel Pavel
430fdf4fcf initial support for the MOUSE_POINTER hid++2.0 feature 2013-05-03 17:08:26 +02:00
Daniel Pavel
abca81ea38 fix device _match-ing in enumerate() 2013-05-03 16:35:54 +02:00
Daniel Pavel
a0a76f738b assert that data read/written on the receiver handle is of type bytes 2013-05-03 16:35:28 +02:00
Daniel Pavel
7d440c2430 replace thrown OSError with IOError 2013-05-03 16:25:32 +02:00
Daniel Pavel
94274fd092 Merge pull request #34 from Lekensteyn/battery-notif
Refactor battery setter, register 07 processing
2013-05-02 20:40:20 -07:00
Peter Wu
266edd80f3 Process reg07 battery notification 2013-05-03 00:10:58 +02:00
Peter Wu
d1b1be32ca Make read_battery use set_battery_info
This allows battery readouts to generate warnings and debug logs for a given
status and level.
2013-05-02 23:56:08 +02:00
Peter Wu
fbdd923d43 Refactor battery info update
- `self[BATTERY_STATUS] = BATTERY_STATUS[battery_status]` should be:
  `self[BATTERY_STATUS] = _hidpp20.BATTERY_STATUS[battery_status]`, otherwise
  the battery status would be a single char from the string `battery-status`.
- Make `_hidpp20.BATTERY_OK` check against strings instead of a number.
- Move setting battery information to a separate function, `set_battery_info`.
  This prepares for notifications when a battery error/warning occurs.
2013-05-02 23:51:40 +02:00
Daniel Pavel
2c30414f88 Merge pull request #33 from Lekensteyn/py3-hidconsole
Python3 compatibility for hidconsole
2013-05-02 14:23:16 -07:00
Peter Wu
d8e469a33a hidpp10: split reg07 (battery) parsing so it can be reused 2013-05-02 23:06:45 +02:00
Peter Wu
a6b89b3ea3 Python3 compatibility for hidconsole
`type(u'')` is 'str' in Python 3, it was `unicode` on Python 2 (with
`unicode_literals` from `__future__`).
2013-05-02 22:58:35 +02:00
Daniel Pavel
0f80901bce quicker detection of matching receivers in udev 2013-05-02 11:11:53 +02:00
Daniel Pavel
8fc45e5590 fix solaar-cli to handle the new Receiver.open() api 2013-05-01 15:51:12 +02:00
Daniel Pavel
c829304e31 use only udev events to detect receiver devices 2013-05-01 15:47:23 +02:00
Daniel Pavel
d3f94ff2fb detect some HID++1.0 custom battery notifications
they're not handled yet
2013-05-01 11:36:15 +02:00
Daniel Pavel
85d9a9dc27 fix for bug #28 2013-04-30 23:05:26 +02:00
Daniel Pavel
04db6d3838 python 3 fixes for #29 2013-04-30 22:31:06 +02:00
Daniel Pavel
e5a28ac64e simplified window/icon code, reworked how device updates are signalled 2013-04-30 19:44:03 +02:00
Daniel Pavel
2397c6c0ea about dialog updated 2013-04-30 17:25:09 +02:00
Daniel Pavel
c3e6c3d1da more flexible icon loading 2013-04-30 15:45:35 +02:00
Daniel Pavel
22da75cb72 replaced some deprecated GObject calls with GLib 2013-04-30 11:47:30 +02:00
Daniel Pavel
22a8ca37b6 updated FSF address in COPYING 2013-04-29 15:38:15 +02:00
Daniel Pavel
692afba3d9 updated FSF address in COPYING 2013-04-29 15:34:00 +02:00
Daniel Pavel
9c621d5816 always try to initialize systray icon and notifications 2013-04-28 15:44:20 +02:00
Daniel Pavel
feedbcf581 some code clean-ups 2013-04-28 15:16:45 +02:00
Daniel Pavel
a57f3be58d renamed event alert levels to be more clear 2013-04-28 15:12:20 +02:00
Daniel Pavel
897dffc426 only dispatch notification events from the specialized listener thread 2013-04-28 15:09:09 +02:00
Daniel Pavel
6f0b61e6d8 better handling of eq/ne/hash in receiver and device objects 2013-04-28 15:02:17 +02:00
Daniel Pavel
674ee9ac9e split read_battery in status into its own function 2013-04-28 15:01:27 +02:00
Daniel Pavel
5eab013cf6 more explicit logging 2013-04-28 14:58:40 +02:00
Daniel Pavel
079ef8d800 incipient support for the Nano receiver 2013-04-28 14:27:16 +02:00
Daniel Pavel
1a9be279c6 move the code for single-instance check into its own file 2013-04-28 14:06:41 +02:00
Daniel Pavel
f5d2eba0c4 hidapi: dropped native, slight update to the python implementation
added an optional filter for driver name when enumerating devices
2013-04-28 14:05:33 +02:00
Daniel Pavel
e7d19c9084 small fixes to hidconsole 2013-04-28 14:00:46 +02:00
Daniel Pavel
638bf38b25 version increased to 0.8.7.1 2013-04-28 13:59:07 +02:00
Daniel Pavel
c4dc49ac5e Merge pull request #24 from Lekensteyn/hid10-fnkey
Add FN key swap support for K800 (and presumably K710)
2013-04-28 02:03:33 -07:00
Daniel Pavel
926600e29d Merge pull request #26 from Lekensteyn/hid10-battery
Fix battery status reading, add "fully charged"
2013-04-27 23:51:18 -07:00
Peter Wu
5e58f1e273 Fix battery status reading, add "fully charged"
Commit 438c501fae introduced support for HID++ 1.0
battery information. That accidentally selected the third parameter instead of
the second one. This commit fixes that and additionally adds a "fully charged"
status too that was found on the K800.
2013-04-27 17:07:55 +02:00
Peter Wu
c79ad65d37 Add K710 with FN key swap support (pwr/Solaar#18)
The K710 keyboard is (according to the issue reporter) part of a MK710 combo
(which also contains a M705 mouse). Observing a succesful 07 register read,
I think that it is a HID++ 1.0 device too that uses the same register for FN
key swapping as K800.
2013-04-27 15:17:05 +02:00
Peter Wu
95a97ad776 Support FN keys swap for K800 2013-04-27 15:13:42 +02:00
Peter Wu
6c28cedf23 Make BooleanValidator accept bytes too besides int
Previously, only the first parameter byte can be read or written. After this
patch, it is possible to select/write more bytes by specifying a mask of type
bytes with the appropriate length.
2013-04-27 15:12:55 +02:00
Daniel Pavel
a3599b53bb Merge pull request #23 from Lekensteyn/hid10-battery
Parse battery status of HID++ 1.0 devices
2013-04-27 05:20:29 -07:00
Peter Wu
438c501fae Parse battery status of HID++ 1.0 devices
This applies to K800 but it seems also to apply to M510. The numbers are based
on the HID++ 2.0 spec that state the following for GetBatteryCapability:

    If number of levels < 10 or if mileage is disabled then report are
    mapped to 4 levels this way.

    0%->10%     critical
    11%->30%    low
    31%->80%    good
    81%->100%   full

    i.e. to report battery low, FW send 25%, to report battery good, FW send 50%.
2013-04-27 11:58:09 +02:00
Daniel Pavel
25cbd55841 Merge pull request #22 from Lekensteyn/doc-regs
Document registers for K800 and M525
2013-04-27 01:53:16 -07:00
Peter Wu
5ef53f251d Document registers for K800 and M525
See also https://lekensteyn.nl/logitech-unifying.html for tools being used to
draw conclusions. Extended dumps and description can be found on
https://git.lekensteyn.nl/ltunify/tree/registers.txt .
2013-04-27 10:17:36 +02:00
Daniel Pavel
92819b6c9e readme updated 2013-02-24 22:43:16 +01:00
Daniel Pavel
d22674f362 Merge pull request #16 from pivoq/master
Arch Linux package
2013-02-20 10:08:28 -08:00
pivoq
0fc83e9255 add Arch Linux package 2013-02-19 17:38:52 +01:00
pivoq
f171c5d59e add Arch Linux package 2013-02-19 17:15:37 +01:00
Daniel Pavel
78b8299130 readme update 2013-01-25 14:54:48 +02:00
Daniel Pavel
2c7fe0c92d updated gentoo ebuild file 2013-01-18 18:41:15 +02:00
Daniel Pavel
6ff30f2a0e release 0.8.7 2013-01-18 18:37:06 +02:00
Daniel Pavel
7707c5e558 don't notify on device disconnection 2013-01-18 17:41:45 +02:00
Daniel Pavel
9b7a920e0d fix for systray visibility (gihub #14) 2013-01-18 17:18:35 +02:00
Daniel Pavel
2e51380be5 log value of register 0x07 when register 0x0D not available 2013-01-18 12:41:01 +02:00
Daniel Pavel
445f508ea5 readme updates 2013-01-14 20:00:52 +02:00
Daniel Pavel
b82c89c582 release 0.8.6.2 2013-01-09 21:47:59 +02:00
Daniel Pavel
85a47a8049 fixed icon name in desktop file 2013-01-09 21:41:50 +02:00
Daniel Pavel
f8e9798038 gentoo ebuild updated 2013-01-09 21:31:47 +02:00
Daniel Pavel
581d6747ad Merge branch 'nano' into 0.9
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2013-01-09 21:10:39 +02:00
Daniel Pavel
00a1aa7628 release 0.8.6.1 2013-01-09 15:36:15 +02:00
Daniel Pavel
79a9048db5 fixed names for NamedInts numerical values 2013-01-09 15:31:19 +02:00
Daniel Pavel
2bfba2e399 fixed application quit icon 2013-01-09 13:47:30 +02:00
Daniel Pavel
484419e526 release 0.8.6 2013-01-08 00:59:30 +02:00
Daniel Pavel
8c18830c97 added source changelog file 2013-01-08 00:55:47 +02:00
Daniel Pavel
653d370a85 fixed locating application icons when running in a custom prefix 2013-01-08 00:40:54 +02:00
Daniel Pavel
316e91cfcf fixed some icon names 2013-01-08 00:39:13 +02:00
Daniel Pavel
f31632c8c8 debian: make sure the plugdev group exists after installation 2013-01-07 22:09:43 +02:00
Daniel Pavel
bb52c13f9a only allow a single instance of solaar to run at a time 2013-01-07 21:34:47 +02:00
Daniel Pavel
738d43fd83 fix for gihub issue #10
http://github.com/pwr/Solaar/issues/10
2013-01-07 20:14:31 +02:00
Daniel Pavel
1c6c8588d9 release 0.8.5.3, only packaging changes 2013-01-07 13:01:59 +02:00
Daniel Pavel
7a97cb2e02 gentoo ebuild update 2013-01-07 12:43:11 +02:00
Daniel Pavel
5e0d2992c9 small fixes for ubuntu packaging 2013-01-07 12:40:44 +02:00
Daniel Pavel
210859a5ef ignore some development-side directories 2013-01-07 12:05:40 +02:00
Daniel Pavel
25f6d229dd advanced version to account for latest changes in packaging 2013-01-07 12:04:22 +02:00
Daniel Pavel
60405abf58 dropped unnecessary #! in lib/ python files 2013-01-07 11:54:52 +02:00
Daniel Pavel
8070b11c27 customized debian/ and debian packaging script to support ubuntu ppas 2013-01-07 11:46:34 +02:00
Daniel Pavel
7d76ce77c9 packaging updates for debian/ubunutu 2013-01-05 17:40:06 +02:00
Daniel Pavel
3d48cbc111 updated debian packaging script, added ppa build script 2013-01-05 15:50:37 +02:00
Daniel Pavel
36f34da227 proper debian packaging, dropper stdeb 2013-01-05 11:48:35 +02:00
Daniel Pavel
d06e07542e dependency fix for debian package 2013-01-04 12:43:16 +02:00
Daniel Pavel
a0c8646923 Merge branch 'master' into packaging 2013-01-04 11:55:31 +02:00
Daniel Pavel
6c924de209 small readme update 2013-01-04 11:52:17 +02:00
Daniel Pavel
500503c069 release 0.8.5 2013-01-04 11:38:15 +02:00
Daniel Pavel
5dd8cd66dd added smooth scroll setting for the anywhere mx mouse 2013-01-04 11:23:41 +02:00
Daniel Pavel
41e84e55f1 fix hidconsole input 2013-01-04 10:59:00 +02:00
Daniel Pavel
7f8888d7dd added an ebuild script 2013-01-04 10:51:22 +02:00
Daniel Pavel
216928f904 small logging fixes for repr() 2013-01-04 08:25:47 +02:00
Daniel Pavel
345bab3a99 fix code looking for icons 2013-01-04 08:18:22 +02:00
Daniel Pavel
064a7a113c added setup.py for python and debian packaging 2012-12-18 05:03:43 +02:00
Daniel Pavel
115d5c7db1 release 0.8.4 2012-12-14 22:29:44 +02:00
Daniel Pavel
8a86ecc38d smaller icons in toolbars 2012-12-14 21:50:45 +02:00
Daniel Pavel
430a2d71e3 read all device features as soon as the application is idle 2012-12-14 19:51:18 +02:00
Daniel Pavel
187c0d2a52 fixes in the shell scripts 2012-12-14 19:33:01 +02:00
Daniel Pavel
8fbe77afb2 readme updates 2012-12-14 16:57:21 +02:00
Daniel Pavel
e43e92f2b0 commented-out testing register for M705 2012-12-14 16:57:10 +02:00
Daniel Pavel
cc6c0ee7df fix for python3 2012-12-14 16:25:46 +02:00
Daniel Pavel
3cd0665166 fixed list of settings in config panel 2012-12-14 15:48:04 +02:00
Daniel Pavel
a42e696695 hide the confix box when the device goes inactive 2012-12-14 06:45:51 +02:00
Daniel Pavel
83886fbcf1 fix device settings being read on every confix box display 2012-12-14 06:45:31 +02:00
Daniel Pavel
f0c5046ccf re-worked the settings classes 2012-12-14 06:44:44 +02:00
Daniel Pavel
9db2a65b31 solaar-cli: return on the first match when searching for device name
results may be occasionally ambiguous, but the command runs faster
2012-12-13 15:12:51 +02:00
Daniel Pavel
59c5619b44 cleaner output on solaar-cli config 2012-12-13 14:58:32 +02:00
Daniel Pavel
b39016df7c small clean-ups in device status handling 2012-12-13 14:54:31 +02:00
Daniel Pavel
c22fe6320d properly slice NamedInts 2012-12-13 05:26:56 +02:00
Daniel Pavel
b99ccdf612 support slices in FeaturesArray and KeysArray 2012-12-13 03:34:39 +02:00
Daniel Pavel
2d338ffbfb better __str__ of Setting instances 2012-12-13 03:33:19 +02:00
Daniel Pavel
739cb9306a drop MethodType uglyness 2012-12-13 00:30:20 +02:00
Daniel Pavel
954fc29613 fix event storm when toggling a device's property 2012-12-12 22:55:04 +02:00
Daniel Pavel
630f71b349 logging clean-up 2012-12-12 21:45:56 +02:00
Daniel Pavel
2b3f274aae new UI mock-up from Julien Gascard 2012-12-12 21:45:37 +02:00
Daniel Pavel
e834e46ef6 added register scan for m510
nothing interesting there, so far
2012-12-12 21:45:06 +02:00
Daniel Pavel
27f10cd10e small clean-up in FeaturesArray, should be slightly faster 2012-12-12 21:44:37 +02:00
Daniel Pavel
f4b92ee690 print () clean-ups 2012-12-12 21:43:55 +02:00
Daniel Pavel
1c4d3d5f13 simpler NamedInt, more logical NamedInts 2012-12-12 21:42:43 +02:00
Daniel Pavel
7bb7a092a4 descriptors update (new device K230)
also assume by default all devices have battery info in register 0x0D,
and blacklist them when that's not the case
2012-12-12 21:41:29 +02:00
Daniel Pavel
0ed623caf9 made notifications handling clearer in status.py 2012-12-12 21:39:04 +02:00
Daniel Pavel
19cd40cfdd renamed 'events' to 'notifications'
in order to match the name in Logitech's documentation
2012-12-12 21:03:07 +02:00
Daniel Pavel
7617a1ef8e don't look at a device's settings if they aren'y being displayed
avoids unnecessary hid++ calls from the main thread
2012-12-12 20:56:13 +02:00
Daniel Pavel
a370afe94b faster tooltip text composition 2012-12-12 20:55:09 +02:00
Daniel Pavel
ff5a1ac7cb fast mapping of receiver status to app icon name 2012-12-12 20:54:14 +02:00
Daniel Pavel
893c7e3ab2 use direct vars instead of widget names to identify widgets 2012-12-12 20:52:33 +02:00
Daniel Pavel
17698bfeae minor clean-ups in texts 2012-12-12 20:44:29 +02:00
Daniel Pavel
8b90e99658 bin/ scripts updated 2012-12-10 15:36:10 +02:00
Daniel Pavel
fa72b89b3a release 0.8.3 2012-12-08 05:29:50 +02:00
Daniel Pavel
fd3c88cb67 added a few documentation files 2012-12-08 05:27:22 +02:00
Daniel Pavel
8b44ca913f detect when the systray icon is not available and change window state accordingly 2012-12-08 03:11:45 +02:00
Daniel Pavel
7fe79a703e fixed creation of device settings controls 2012-12-08 01:54:08 +02:00
Daniel Pavel
80c36a02a9 improved notifications detection 2012-12-08 01:49:59 +02:00
Daniel Pavel
4bdfe9b9b8 readme update 2012-12-08 00:51:51 +02:00
Daniel Pavel
767e8a0db4 extra description on configurable settings in solaar-cli 2012-12-08 00:51:34 +02:00
Daniel Pavel
d8a2ffa835 better handling of window pop-up and toggling 2012-12-08 00:51:10 +02:00
Daniel Pavel
d38bec39b6 improved hid++ support 2012-12-08 00:41:43 +02:00
Daniel Pavel
33a9ca060d made hidconsole more user-friendly 2012-12-08 00:41:10 +02:00
Daniel Pavel
30fedf418c re-read device settings when they come back online 2012-12-07 21:00:36 +02:00
Daniel Pavel
5bdacb377c cleaner text when no status is known 2012-12-07 20:54:05 +02:00
Daniel Pavel
ee16892481 fixed registers access 2012-12-07 20:38:24 +02:00
Daniel Pavel
e2909f6165 fixed event detection 2012-12-07 20:37:13 +02:00
Daniel Pavel
205d25e341 special support for configuring dpi 2012-12-07 19:40:32 +02:00
Daniel Pavel
f49ced2d92 readme updates 2012-12-07 19:39:40 +02:00
Daniel Pavel
b86dcce381 I come from the __future__, come with me if you want to live. 2012-12-07 17:10:22 +02:00
Daniel Pavel
c4be58f074 dropped bin/scan as deprecated, bin/solaar-cli completely replaces it 2012-12-07 15:31:19 +02:00
Daniel Pavel
b3f0bfa4fb fixed obsolete import 2012-12-07 14:41:00 +02:00
Daniel Pavel
37daf3a192 better handling of terminal in hidconsole 2012-12-07 14:40:48 +02:00
Daniel Pavel
7ada4af31b hidconsole has to be run in unbuffered mode 2012-12-07 14:29:30 +02:00
Daniel Pavel
67db483b0b dropped the unittests, they've been obsolete and nonfunctional for a long time now 2012-12-07 14:00:28 +02:00
Daniel Pavel
357e118ace added configuration support to solaar-cli 2012-12-07 13:56:22 +02:00
Daniel Pavel
f2cdbe26b6 added configuration items to the UI
the window is getting very cramped now... will most likely have to re-
work the entire UI
2012-12-07 13:56:07 +02:00
Daniel Pavel
3569489ce7 added registers and settings to device descriptors 2012-12-07 13:54:03 +02:00
Daniel Pavel
6c3fa224e0 small ui fixes 2012-12-07 13:52:09 +02:00
Daniel Pavel
9066003240 named ints act like proper sequences now 2012-12-07 13:50:44 +02:00
Daniel Pavel
f0007d0a13 updates to the command lines 2012-12-07 13:41:07 +02:00
Daniel Pavel
ff6db1d00a fix for python 3 2012-12-06 14:15:28 +02:00
Daniel Pavel
27403a08d2 improved hid++ 1.0 support 2012-12-05 21:41:02 +02:00
Daniel Pavel
6d70d2aada improved support for hid++ 1.0 devices 2012-12-05 15:10:41 +02:00
Daniel Pavel
0e551383ba added script for udev rule installation 2012-12-05 12:08:45 +02:00
Daniel Pavel
b5b86ab8b8 more reliable pairing window 2012-12-04 15:59:35 +02:00
Daniel Pavel
61d0159e8a release 0.8.2 2012-12-03 15:17:33 +02:00
Daniel Pavel
c41859816b renamed README 2012-12-03 15:13:03 +02:00
Daniel Pavel
5a99e55309 readme updates 2012-12-03 15:07:35 +02:00
Daniel Pavel
1b6e6692c0 maintain notification flags when pairing in command-line 2012-12-03 15:07:07 +02:00
Daniel Pavel
116ba72f37 fixed possible dangling weakrefs on start-up 2012-12-03 12:51:22 +02:00
Daniel Pavel
3fe9caf0e6 added solaar-cli for command-line operations 2012-12-03 11:34:35 +02:00
Daniel Pavel
a403c3b596 release 0.8.1 2012-12-01 23:32:51 +02:00
Daniel Pavel
2a44b0bb5b fixed scan not seeing the devices 2012-12-01 22:34:52 +02:00
Daniel Pavel
130a23dd4f optimized appicon mask 2012-12-01 19:16:52 +02:00
Daniel Pavel
db0d6e8bbc release 0.8.0 2012-12-01 19:14:06 +02:00
Daniel Pavel
1cc532d600 fixed orphaned weakrefs when unpairing a device 2012-12-01 19:12:53 +02:00
Daniel Pavel
8f5fa0cf9a code clean-ups, the app starts faster now 2012-12-01 15:49:52 +02:00
Daniel Pavel
89c6904d69 fixed pairing (again), this time also tested it 2012-11-30 20:28:22 +02:00
Daniel Pavel
14663ca204 re-wrote loading of icons for devices 2012-11-30 15:23:16 +02:00
Daniel Pavel
64d2b35ace some clean-ups 2012-11-30 15:20:41 +02:00
Daniel Pavel
ab5e09db93 pairing fixes 2012-11-29 21:26:03 +02:00
Daniel Pavel
932a015e49 better battery icon in the systray 2012-11-29 20:13:53 +02:00
Daniel Pavel
d6b18cd426 python 3 fixes 2012-11-29 12:34:20 +02:00
Daniel Pavel
84540fb087 re-wrote most of the app, based on latest HID++ docs from Logitech 2012-11-29 04:10:16 +02:00
Daniel Pavel
5b8c983ab3 some speed tweaks to hidconsole batch mode 2012-11-24 22:49:15 +02:00
Daniel Pavel
13a11e78f0 added more known device names and kinds 2012-11-13 09:48:52 +02:00
Daniel Pavel
fb8cf26c51 release 0.7.4 2012-11-12 18:34:27 +02:00
Daniel Pavel
41db725e15 fixed property updates from events 2012-11-12 18:34:11 +02:00
Daniel Pavel
f25d2ba183 small tweaks on how the devices info is displayed 2012-11-12 18:15:29 +02:00
Daniel Pavel
66531635bc scripts clean-up 2012-11-12 15:33:21 +02:00
Daniel Pavel
4c5cf85091 re-worked the UI a bit to give better info on devices status 2012-11-12 15:28:38 +02:00
Daniel Pavel
6db4deafee python 3 fixes 2012-11-11 22:37:42 +02:00
Daniel Pavel
2c312c1a5b show battery icon in tray if any available 2012-11-11 21:59:50 +02:00
Daniel Pavel
bcc2bf123e fixed initialization sequence for newly detected devices 2012-11-11 20:11:30 +02:00
Daniel Pavel
50fedab19e re-worked how fd handles are used in multi-threading 2012-11-11 17:03:13 +02:00
Daniel Pavel
d0ccd3e9c2 ui tweak 2012-11-09 09:20:44 +02:00
Daniel Pavel
4b2d8a8d5a addded custom swids to feature calls 2012-11-09 09:20:28 +02:00
Daniel Pavel
c12364a7c7 fix receiver status when more than 1 device is connected 2012-11-09 01:03:37 +02:00
Daniel Pavel
560400e786 small ui tweaks 2012-11-08 22:32:19 +02:00
Daniel Pavel
f7a4d89467 fixed display of receiver details 2012-11-08 22:05:35 +02:00
228 changed files with 64967 additions and 3914 deletions

10
.git-blame-ignore-revs Normal file
View File

@@ -0,0 +1,10 @@
# yapf bulk change
72a8d311bce64b1536c08e754d22bb91efb66460
# isort bulk change
e6369e0c3c240715a0a2daede6c3b225ed63cf60
# pre-commit bulk change
33521558ed7007c24b24127f1448c2c23ecbfb35
# flake8 bulk change
627185079f65c9cc471194b7927c833682e4a7a3
# yapf style update
27c90fa736d8a7a1ef6acda4345d3599862e185c

39
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,39 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Information**
<!-- Make sure that your issue is not one of the known issues in the Solaar documentation at https://pwr-solaar.github.io/Solaar/ -->
<!-- Do not bother opening an issue for a version older than 1.1.0. Update to the latest version and see if your issue persists. -->
- Solaar version (`solaar --version` or `git describe --tags` if cloned from this repository):
- Distribution:
- Kernel version (ex. `uname -srmo`): `KERNEL VERSION HERE`
- Output of `solaar show`:
<details>
```
OUTPUT HERE
```
</details>
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,35 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Information**
<!-- Please update to Solaar from this repository before asking for a new feature. -->
- Solaar version (`solaar --version` and `git describe --tags`):
- Distribution:
- Kernel version (ex. `uname -srmo`):
- Output of `solaar show` for the target device (if applicable):
<details>
```
OUTPUT HERE
```
</details>
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

16
.github/workflows/checks.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: checks
on: [push, pull_request]
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
- name: Run pre-commit
uses: pre-commit/action@v2.0.0

17
.gitignore vendored
View File

@@ -1,4 +1,19 @@
*.so
*.pyc
*.pyo
__pycache__/
*.log
*.mo
/lib/Solaar.egg-info/
/lib/solaar.egg-info/
/build/
/sdist/
/dist/
/deb_dist/
/MANIFEST
/docs/captures/
/share/logitech_icons/
/share/locale/
/po/*.po~

26
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,26 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.1.0
hooks:
- id: check-ast
- id: check-builtin-literals
- id: check-merge-conflict
- id: check-yaml
- id: check-toml
- id: debug-statements
- id: double-quote-string-fixer
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/pre-commit/mirrors-yapf
rev: v0.30.0
hooks:
- id: yapf
- repo: https://github.com/pre-commit/mirrors-isort
rev: v4.3.21
hooks:
- id: isort
- repo: https://gitlab.com/pycqa/flake8
rev: 3.8.3
hooks:
- id: flake8
additional_dependencies: ['flake8-bugbear']

41
COPYING
View File

@@ -1,12 +1,12 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
@@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

14
COPYRIGHT Normal file
View File

@@ -0,0 +1,14 @@
Copyright 2012, 2013
Daniel Pavel <daniel.pavel@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 2.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

1
ChangeLog Symbolic link
View File

@@ -0,0 +1 @@
ChangeLog.md

415
ChangeLog.md Normal file
View File

@@ -0,0 +1,415 @@
# 1.1.2
* Update documentation on supported devices and translations
* Include evdev as a dependency
* Try to use uinput for fake input if XTest extension not available
* Add Nano receiver C542 for M190 mice
* Broaden range of HID++ Bluetooth devices
* Add setting to divert gestures
* Rule editor can edit all rule components
* Configuation via solaar config takes effect in Solaar UI if it is running
* Add setting to disable Onboard Profiles and decouple from Polling Rate setting
* Add setting for PERSISTENT_REMAPPABLE_ACTION, common keyboard and mouse cases only
* Split Test rule condition into Test and TestBytes and support in rule editor
* Fix bug in speed-change setting
* Support Backlight3 feature
* Ensure that settings are pushed in resume
* Update German, Polish, and zh_CN translations
* Determine device number for direct-connected devices from protocol
* fix bug in add and delete button actions in rule editor
* dispose of no-op notifications quickly
* add rule condition for checking device settings
* use local file for conversion from key names to keysyms
* get keyboard group and use to get correct keycodes (X11 only)
* improve how rules work under Wayland
* add settings for M-Key LEDs and MR-Key LED
* fix bug in unpacking M and MR key notification
* add G815 keyboard and MX518 mouse
* add new special keys for recent keyboards
* track M and MR keys for use in rules
* make sure that device is online when searching for devices in solaar show
* don't check for device kind in dpi sliding setting
* fix problem with devices that report 0 DPI
* handle missing divert-setting in action RW for settings
* add id property (unitId or serial) and don't use ? for unknown serial
* fix contains for NamedInts and eliminate use of has_element
* check for xtest and disable modifier checking if not available
* improve determination of gesture information
* add Set rules to rule GUI
* add gesture params to Set rules
* hide system tray when there are no devices to control
* add G733 headset, G9 mouse, G502 Hero mouse
* Use greyscale solaar icon in tray when using symbolic icons
* Fix bugs in solaar config
* Use classes for settings to hep with modularity
* Accept '~' and Toggle for toggling boolean settings in cli and rules
* handle errors when writing to devices
* refactor config_panel.py to use classes for widgets
* add rules action to set Solaar settings
* decrease amount of logging at each debug level
* don't stretch toggles in settings
* use key structure for key remapping setting
* optimize ReprogrammableKey implementation
* keep track of settings that are absent from device
* add G512 keyboard and G402 mouse
* reformat descriptors.py
* use feature numbers for reprogrammable key versions
* don't use new_from_icon_set in menu as it is deprecated
# 1.1.1
* Keep left pane in Solaar main window the same size
* Fix crash when checking a process condition when X11 not running
* Add version number to output of solaar show
* Fix crash when pinging a device with unknown protocol
* Display battery percentage estimates from battery voltage
* Add minimal support for Logitech PRO X Wireless Gaming Headset
* Push settings when device requests software reconfiguration
* Fix read for key/button diversion setting
* Add modalias information to Solaar metainfo
* Don't do on-screen notifications when devices are powered on
* Add setting to switch crown between smooth and ratchet scrolling
* Add write_prefix_bytes argument to Boolean validator
* Update Russian and Spanish translations
* New shell script tools to help determine capabilities of receivers
* Add special keys for MX Keys for Business and MX Keys Mini
* Improve tray menu ordering
* Add --tray-icon-size option to get around bugs in some tray implementations
# 1.1.0
* Fix bug when adding receiver to tray menu
* Add Catalan translation.
* Add toggle command to solaar config to toggle boolean settings
* Don't select windows with no PID when looking for focus window
* Catch errors when applying settings so that other settings are not affected
* Add support for Bolt receivers and devices, including pairing
* Revise method for creating system tray menu
* Remove obsolete code (mostly Python 2 compatibility code)
* Add support for PRO X Wireless Mouse, G914 TKL keyboard
* Ignore more notifications that come to a device listener
* Handle more device connection protocols
* Update usage and rules documentation
* Change emojis to text in documentation
* Pare down device documentation so as not to require frequent updates
* Add information about M500S mouse
* Reimplement MOUSE GESTURE and DPI SLIDING settings
* Add setting for DPI CHANGE button to switch sensitivity
* Use file name instead of icon name for tray to avoid XFCE bug
* Update documentation on implemented features and mouse gestures
* Update Polish, Japanese, and Spanish translations
* Make Quit and About strings more translatable
# 1.0.7
* Don't use time_ns so as not to require Python 3.7
* Correctly determine setting box in change_click method
* Handle fake Nano connection notifications
* Lock on actual handle, not just on handle number
* Mark Nano receiver C52F as not unpairing
* Upgrade pairing/unpairing documentation
* Don't signal status change when battery changes from None to None.
* Add Japanese translation
* Use first word of name for code name if no other code name available.
* Better determination of when to add SW ID.
* Check for more HID++ feature request failing.
* Fix bug with new_fn_inversion setting.
* Use correct device number for directly connected devices
* Add debug message when candidate device found
* Update Polish, Taiwanese, and Brazilian Portuguese translations
* Add MouseProcess a rule condition like Process but for the window under the mouse
* Add parameters for binary settings to support prefixes
* Add locks to serialize requests to devices
* Fix bug when reprog key requests returns None
* Fix bug for empty process name and class
* Rules can now trigger on both pressing and releasing a diverted key
* Upgrade mouse gestures to allow sequences of movements
* Fix gkeys diversion faked read
* Add support for Logitech g pro x superlight receiver
* Convert HID++ 2.0 device kinds to enhanced HID++ 1.0 device kinds
* Update about window, bug report templates, and supported kernels.
# 1.0.6
* Update sliding DPI to look for suitable keys
* Add mouse gestures that can trigger rules
* Complain if receivers do not support connection notification
* In polling rate setting, only modify onboard profiles when actually writing polling rate
* Add ability to ignore settings.
* Use symbols for receiver sub-registers
* Add support for wired G700
* Do not set attention icon
* Replace deprecated GTK stock menu icons
* Better handling of icons in tray and tray menus
* Receiver c52e does not unpair
* Match active WM_CLASS as well as active process name in rules
* Correctly set icon theme value when regular battery icons are not available
* Handle exception when device is not available when device is being added
* Perform initial activation of devices in listener threads
* Keep track of serial numbers in the configuration file
* Don't update settings for non-active devices
* Set the current host name if not stored on the device
* Add setting for SMART SHIFT ENHANCED feature
* Don't unnecessarily use long messages for HID++ 1.0 commands
* Correctly select choices in solaar config and use 1-origin addressing
* Add quirk for G915 TKL keyboard because its host mode interferes with its Fn keys
* Show command outputs both saved and on-device settings
* Update documentation
* Fix bug in hidconsole
* Update French translation
# 1.0.5
* Update documentation on devices forgetting settings.
* Improve help messages
* Fix bug in finding receiver to pair
* Solaar config command can set keyed settings.
* Add setting for polling rate
* Use long HID++ messages for all 2.0 requests
* Update German, Italian, and Polish translations
* Solaar config command no longer selects paired but unconnected devices
* Show HID++ 1.0 remaining pairings value in solaar show for devices that support it
* Add option to not use battery icons in system tray.
* Update Polish and Dutch translation.
* Add Czech translation.
* Remove information on SUSE package as it is very old.
* Turn GKEY notifications into Gn key keypresses that can trigger rules.
* Push device settings to devices after suspend when device is immediately active.
* Reduce unnecessary saving of configuration file.
* Better handling of disconnected devices.
* Implement GUI to edit rules.
* Implement rule-base processing of HID++ feature notifications (depends on X11).
* Add settings for diversion of crown and remappable keys.
* Access widgets by name instead of by index.
* Implement UNIFIED_BATTERY feature and use in battery reports.
* Add a clickable lock icon that determines where each setting can be changed.
# 1.0.4
* Update pt_BR translation
* Support USB and BT connected devices that are not in descriptors.py
* Use FRIENDLY NAME for codename if needed and available.
* Extract manufacturer and product ID from Udev HID information.
* Add Bluetooth and USB product IDs to device descriptors records.
* Support Bluetooth-connected devices.
* Add model ID and unit ID to device identification.
* Support changing DPI by pressing DPI Switch button and sliding horizontally
* Add device-specific notification handlers.
* Add MX Vertical USB information.
* Udev rule adds seat permissions for all Logitech devices.
* Support USB-connected devices in GUI.
* Make probe and config work for USB-connected devices.
* Improve strings and display for settings.
* Correctly handle non-unifying connection notifications.
* Update GUI strings for several settings.
* Better support for EX100 and devices that connect to it.
* Partial support for feature GESTURE_2.
* Simplify interface for settings.
* Use DJ connection notifications to set device active status
* Udev rule sets seat write permissions for hidraw nodes for device as well as receivers.
* Handle USB devices that use HID++ protocol in CLI.
* Use device hidraw nodes where possible.
* Handle receivers with serial numbers that don't provide number of pairings.
* Ignore exceptions when setting locale.
* Correctly discover settings that share a name.
* Don't show pop-up notifications at startup.
* Keep battery voltage updated in GUI.
* Add Portuguese translation.
* Update several translations.
* Add Lightspeed receivers c545 and c541.
* Reimplement REPROG_CONTROLS data structure.
# 1.0.3
* Clean up documentation files.
* Update documentation on installation.
* Update Swedish and French translations.
* Add Norwegian Nynorsk and Danish translations.
* Fix bug handling DJ pairing notifications.
* Add Norwegian Bokmål translation.
* Remove deprecated solaar-cli application.
* Don't install udev or autostart files from python (or pip).
* Solaar needs Python 3.6+ and probably needs kernel 5.2+
* Handle exceptions on dynamic settings when device is not connected.
* Fix infinite loop on some low-level write errors
* Add support for EX100 keyboard/mouse and receiver (046d:c517)
* Add two settings for THUMB_WHEEL feature - inversion and reporting via HID++
* Update German translation
* Use REPORT RATE feature when available to determine polling rate.
* Improve config command speed when not printing all settings
* Improve config command handling and checking of arguments
* Add setting for CHANGE_HOST feature
* Add argument to settings for values that are not to persist
* Add argument to settings to not wait for reply when writing a value to device
* Add argument to not wait for reply from request to device
* Add settings for MULTIPLATFORM and DUALPLATFORM features
* Remove Logitech documents from documentation directory
* Change config command to not read all settings when only printing or showing one
* Display hosts info in 'solaar show' if device supports it
* Remove non-working smooth-scroll from M510 v1
* Add yapf and flake8 code style checks
* Fix feature k375s Fn inversion
* Update controls (keys and buttons) and tasks (actions)
* Improved way to specify feature settings.
* Don't abort on device notifications with unexpected device numbers, just warn.
* Keep track of non-features so as not to ask device multiple times.
* Implement KEYBOARD DISABLE KEYS feature.
* Don't create notifications for DJ device activity reports.
* Update a few special keys and actions.
* Add keyed choice settings in configuration panel.
* Support remappable keys from reprogrammable keys v4 feature.
* Add setting class for keyed choice.
* Only check for features once per device.
* Use settings interface to show feature values in `solaar show` if no special code for feature.
* Remove maximum window size.
* Process battery voltage notifications.
* Display battery voltage information in main window if regular battery information not available.
* Show next battery level where available.
* Update list of implemented features and provide information on how to implement features.
* Add c53d as a Lightspeed receiver.
# 1.0.2
* Add usage document
* Don't produce error dialog for inaccessible receivers with access control lists.
* Add option --battery-icons=symbolic to use symbolic icons if available.
* Update French translation
* Update installation documentation
* Remove packaging directory tree as it is not maintained
* Pip installs udev rule and solaar autostart when doing install without --user flag
* Use Solaar icon instead of a missing battery icon
* Use only standard icons for battery levels. Symbolic icons do not change to white in dark themes because of problems external to Solaar.
* Better reporting of battery levels when charging for some devices.
* Add information on K600 TV, M350 WIPD 4080, and MX Keys
* Remove assertion requiring receivers to still be in window when they are updated.
* Augment long description of Solaar showing up in repositories.
* Update installation directions.
* Install udev rule as well as autostart file when doing system install.
* Add support for Ayatana AppIndicator.
* Use setuptools icon directory on system installs when not using pip.
* Add receiver C517 and several older devices.
* Improved translations for polish.
* Bypass bug in appindicator when solaar is file in current directory.
* Don't check that device kind matches feature kind.
* Better determination of icons for battery levels.
* Use Ayatana AppIndicator if available.
* Improve error reporting when required system packages are not install.
* Better tooltip description
* Add release script to help when creating releases
* Look up tray icon filenames to get around a bug in libappindicator.
* Make the default behavior be to show the main window at startup.
* Support c537 nano receiver
* Add logind signals for suspend/resume.
* Remove solaar-gnome3 package
* Ignore features for devices that don't follow feature specification
* Add probe command to command-line interface to dump receiver registers
* Don't terminate on malformed or unknown messages
* Create fewer internal notifications for messages from devices
* Add a button to the main window to terminate (quit) Solaar
* Set up nano receivers as receivers with no unpairing and with re-pairing
* Set up c534 as receiver with max 2 pairings, no unpairing, re-pairing
* Better support receivers that do not unpair or when pairing replace existing pairings
* Add information about receiver pairing to receiver data structure
* Better support devices that only allow a limited number of total re-pairings
* Add --window option to control main window visibility and tray usage
* Ignore receiver if USB id is not retrieved
* Fix bug with double deleting when devices are disconnected
* Determine some receiver information from data structure for USB ids
* Treat battery level of 0 as unknown
* Fix bug on devices with no serial number
* Drop support for python2, and use python3 throughout
* Fix bug in remembering features discovered from device reports
* Show icons in main window device list
* Count offline devices when determining whether pairing is possible
* Update French, Dutch, German, and Croatian translations
* Better icons for battery levels
* Support DPI, Backlight 2, Battery Voltage features
* Support M585, M590, M330, MX Master 2s and 3, new M310, new K800, craft keyboard
* Documentation improvements
* Clean up directory structure and remove unused files
# 1.0.1
* Updated the repo url.
* Fixed typo which was crashing the application.
* Improved the HID write routine which was causing issues on some devices.
* Fix non-unifying receivers in Linux 5.2.
* Add new Lightspeed receiver (used in the G305)
# 1.0.0
* Too many to track...
# 0.9.3
* Merged solaar-cli functionality into main solaar.
* Scrolling over the systray icon switches between multiple peripherals.
* Swedish translation courtesy of Daniel Zippert and Emelie Snecker
* French translation courtesy of Papoteur, David Geiger and Damien Lallement.
* Fixed some untranslated strings.
# 0.9.2
* Added support for hand detection on the K800.
* Added support for V550 and V450 Nano.
* Fixed side-scrolling with the M705 Marathon.
* Fixed identification of the T650 Touchpad.
* Added internationalization support and romanian translation.
* Polish translation courtesy of Adrian Piotrowicz.
# 0.9.1
* When devices report a battery alert, only show the alert once.
* Make sure devices in the window tree are sorted by registration index.
* Added an autostart .desktop file.
* Replaced single-instance code with GtkApplication.
* Fixed identification of the M505 mouse.
* Fixed an occasional windowing layout bug with the C52F Nano Receiver.
# 0.9.0
* New single-window UI.
* Performance MX leds show the current battery charge.
* Support the VX Nano mouse.
* Faster and more accurate detection of devices.
* If upower is accessible through DBus, handle suspend/resume.
* Replaced Solaar icons with SVGs.
* Running solaar-cli in parallel with solaar is now less likely to cause issues.
* Bugfixes to saving and applying device settings.
* Properly handle ^C when running in console.
# 0.8.9
* Improved support for gnome-shell/Unity.
* Persist devices settings between runs.
* Fixed reading of MK700 keyboard battery status.
* Use battery icons from the current theme instead of custom ones.
* Debian/Ubuntu packages now depend on an icon theme, to make sure
no missing icons appear in the application window.
* Fixed missing icons under Kubuntu.
* Many more bug-fixes and reliability improvements.
# 0.8.8
* Partial support for some Nano receivers.
* Improved support for some devices: M510, K800, Performance MX.
* Improved battery support for some HID++ 1.0 devices.
* Properly handle device loss on computer sleep/wake.
* Better handling of receiver adding and removal at runtime.
* Removed a few more unhelpful notifications.
* Incipient support for multiple connected receivers.
* More Python 3 fixes.
# 0.8.7
* Don't show the "device disconnected" notification, it can be annoying and
not very useful.
* More robust detection of systray icon visibility.
# 0.8.6
* Ensure the Gtk application is single-instance.
* Fix identifying available dpi values.
* Fixed locating application icons when installed in a custom prefix.
* Fixed some icon names for the oxygen theme.
* Python 3 fixes.

3
MANIFEST.in Normal file
View File

@@ -0,0 +1,3 @@
include COPYRIGHT COPYING README.md ChangeLog.md
recursive-include rules.d *
recursive-include share/locale *

60
README
View File

@@ -1,60 +0,0 @@
Solaar
------
This application connects to a Logitech Unifying Receiver
(http://www.logitech.com/en-us/66/6079) and listens for events from devices
attached to it.
Currently the K750 solar keyboard is also queried for its solar charge status.
Support for other devices could be added in the future, but the K750 keyboard is
the only device I have and can test on.
Requirements
------------
- Python (2.7 or 3.2). Either version should work well.
- Gtk 3; Gtk 2 should partially work with some problems.
- Python GI (GObject Introspection), for Gtk bindings.
- pyudev for enumerating udev devices.
- Optional libnotify GI bindings, for desktop notifications.
The necessary packages for Debian/Ubuntu are `python-pyudev`/`python3-pyudev`,
`python-gi`/`python3-gi`, `gir1.2-gtk-3.0`, and optionally `gir1.2-notify-0.7`.
Installation
------------
Normally USB devices are not accessible for r/w by regular users, so you will
need to install a udev rule to allow access to the Logitech Unifying Receiver.
In rules.d/ you'll find a udev rule file, to be copied in /etc/udev/rules.d/ (as
root).
In its current form it makes the UR device available for r/w by all users
belonging to the 'plugdev' system group (standard Debian/Ubuntu group for
pluggable devices). It may need changes, specific to your particular system's
configuration.
If in doubt, replacing GROUP="plugdev" with GROUP="<your username>" should just
work.
After you copy the file to /etc/udev/rules.d (and possibly modify it for your
system), run 'udevadm control --reload-rules' as root for it to apply. Then
physically remove the Unifying Receiver, wait 30 seconds and re-insert it.
Thanks
------
This project began as a third-hand clone of Noah K. Tilton's logitech-solar-k750
project on GitHub (no longer available). It was developed further thanks to the
diggings in Logitech's HID protocol done, among others, by Julien Danjou
(http://julien.danjou.info/blog/2012/logitech-k750-linux-support) and
Lars-Dominik Braun (http://6xq.net/git/lars/lshidpp.git).
Cheers,
-pwr

1
README Symbolic link
View File

@@ -0,0 +1 @@
README.md

1
README.md Symbolic link
View File

@@ -0,0 +1 @@
docs/index.md

16
RELEASE.md Normal file
View File

@@ -0,0 +1,16 @@
# Solaar releases
## Please read before making a release
We support two type of releases: normal releases (ex. `1.0.0`) and release
candidates (ex. `1.0.0rc1`). Release candidates must have a `rcX` suffix.
Release routine:
- Update ChangeLog.md, setup.py, lib/solaar/__init__.py, and docs/_config.yml to the new version
- Create a commit that starts with `release VERSION`
- Push commit to Solaar repository
- Invoke `./release.sh`
- Git tags are signed so you must have GPG set up
- You are required to have a github token with `public_repo` access
in `~/.github-token`

77
Release_Notes.md Normal file
View File

@@ -0,0 +1,77 @@
# Notes on Major Changes in Releases
## Version 1.1.2
* Rules partly work under Wayland. There is no access to the current process in Wayland. Simulated input uses uinput if XTest extension not available, requiring read and write permissions on /dev/uinput.
* There is a setting to divert gestures so that they can trigger rules.
* There is a setting to disable Onboard Profiles, which can interfere with the Polling Rate and M-Key LEDs settings. The Polling Rate setting no longer disables onboard profiles.
* There is a setting for the Persistent Remappable Keys feature.
* There is a new rule condition that tests device settings.
* There are new settings to set M-Key LEDs and MR-Key LED.
* There is a new kind of Solaar rule action to change settings for devices.
## Version 1.1.1
* There is a new setting to switch keyboard crowns between smooth and ratchet scrolling.
## Version 1.1.0
* Solaar now supports Bolt receivers and devices that connect to them, including authentication of devices when pairing.
* A setting has been added for the DPI CHANGE button to switch movement sensitivity.
## Version 1.0.7
* Solaar rules can now trigger on both pressing and releasing a diverted key.
* The new rule condition MouseProcess is like the Process condition except for the process of the window under the mouse.
* Mouse gestures have been upgraded. A mouse gesture is now a sequence of movements separated by no movement periods while the mouse gesture button is held down. The MouseGesture rule condition matches mouse gesture sequences. The old mouse-up, etc., tests are converted to MouseGesture conditions.
## Version 1.0.6
* The sliding DPI setting now looks for suitable keys to use to trigger its effects.
* If a mouse has a suitable button it can generate mouse gestures, which trigger rule processing. Mouse gestures need to be turned on and the button diverted to produce mouse gestures.
* Settings can now be ignored by clicking on the icon at the right-hand edge of a setting until the dialog error icon (usually a red icon) appears. Solaar will not try to restore the value for an ignored setting.
* Icon handling in the tray and the tray menu has been updated to work better with some system tray implementations.
* The process rule condition also matches against the current X11 WM_CLASS.
* The SMART SHIFT ENHANCED feature is supported.
## Version 1.0.5
* Solaar has rules that can perform actions such as pressing keys or scrolling when certain HID++ feature notifications happen. Users can change these rules either by editing ~/.config/solaar/rules.yaml or via a GUI. Rules depend on X11 and so are only available under X11. This is an experimental feature for Solaar and may undergo changes in the future.
* Each setting has a clickable lock icon that determines whether the setting can be changed.
## Version 1.0.4
* Devices that connect directly via Bluetooth or USB are now supported. These devices show up in the GUI as separate lines, not under a receiver. A device that is directly connected and also paired to a receiver will show up twice, but the entry under the receiver will not be active. With this change identifying devices becomes more difficult so occasionally check your Solaar configuration file (at ~/.config/solaar/config.json) to see that there is only one entry for each of your devices.
* There are new settings for gestures, thumb wheels, adjusting the wheel ratchet behavior, and changing DPI using a DPI Switch button.
* Solaar's Udev rule now adds seat permissions for all Logitech devices. Users who install Solaar themselves will have to install the new Udev rule and activate the rule. One way to do this is to restart the user's computer.
## Version 1.0.3
* The separate deprecated solaar-cli command has been removed.
* Devices can be switched between hosts using the Change Host setting. The device will try to connect to the other host. Some devices will detect that there is no active host on the other connections and reconnect back.
## Version 1.0.2
* The separate unneeded solaar-gnome3 command has been removed. The packaging directories have been removed.
* Non-unifying receivers are modelled better. Many of them cannot unpair but instead new pairings replace existing pairings.
* Battery icon selection has been simplified.

View File

@@ -1,82 +0,0 @@
#
#
#
from logging import getLogger as _Logger
_l = _Logger('pairing')
from logitech.unifying_receiver import base as _base
state = None
class State(object):
TICK = 400
PAIR_TIMEOUT = 60 * 1000 / TICK
def __init__(self, listener):
self.listener = listener
self.reset()
def device(self, number):
return self.listener.devices.get(number)
def reset(self):
self.success = None
self.detected_device = None
self._countdown = self.PAIR_TIMEOUT
def countdown(self, assistant):
if self._countdown < 0 or not self.listener:
return False
if self._countdown == self.PAIR_TIMEOUT:
self.start_scan()
self._countdown -= 1
return True
self._countdown -= 1
if self._countdown > 0 and self.success is None:
return True
self.stop_scan()
assistant.scan_complete(assistant, self.detected_device)
return False
def start_scan(self):
self.reset()
self.listener.events_filter = self.filter_events
reply = _base.request(self.listener.handle, 0xFF, b'\x80\xB2', b'\x01')
_l.debug("start scan reply %s", repr(reply))
def stop_scan(self):
if self._countdown >= 0:
self._countdown = -1
reply = _base.request(self.listener.handle, 0xFF, b'\x80\xB2', b'\x02')
_l.debug("stop scan reply %s", repr(reply))
self.listener.events_filter = None
def filter_events(self, event):
if event.devnumber == 0xFF:
if event.code == 0x10:
if event.data == b'\x4A\x01\x00\x00\x00':
_l.debug("receiver listening for device wakeup")
return True
if event.data == b'\x4A\x00\x01\x00\x00':
_l.debug("receiver gave up")
self.success = False
return True
return False
if event.devnumber in self.listener.receiver.devices:
return False
_l.debug("event for new device? %s", event)
if event.code == 0x10 and event.data[0:2] == b'\x41\x04':
self.detected_device = self.listener.make_device(event)
return True
return True
def unpair(self, device):
_l.debug("unpair %s", device)
self.listener.unpair_device(device)

View File

@@ -1,340 +0,0 @@
#
#
#
from logging import getLogger as _Logger
from struct import pack as _pack
from time import sleep as _sleep
from logitech.unifying_receiver import base as _base
from logitech.unifying_receiver import api as _api
from logitech.unifying_receiver.listener import EventsListener as _EventsListener
from logitech.unifying_receiver.common import FallbackDict as _FallbackDict
from logitech import devices as _devices
from logitech.devices.constants import (STATUS, STATUS_NAME, PROPS)
#
#
#
class _FeaturesArray(object):
__slots__ = ('device', 'features', 'supported')
def __init__(self, device):
self.device = device
self.features = None
self.supported = True
def _check(self):
if self.supported:
if self.features is not None:
return True
if self.device.status >= STATUS.CONNECTED:
handle = self.device.handle
try:
index = _api.get_feature_index(handle, self.device.number, _api.FEATURE.FEATURE_SET)
except _api._FeatureNotSupported:
self.supported = False
else:
count = None if index is None else _base.request(handle, self.device.number, _pack('!BB', index, 0x00))
if count is None:
self.supported = False
else:
count = ord(count[:1])
self.features = [None] * (1 + count)
self.features[0] = _api.FEATURE.ROOT
self.features[index] = _api.FEATURE.FEATURE_SET
return True
return False
__bool__ = __nonzero__ = _check
def __getitem__(self, index):
if not self._check():
return None
if index < 0 or index >= len(self.features):
raise IndexError
if self.features[index] is None:
fs_index = self.features.index(_api.FEATURE.FEATURE_SET)
feature = _base.request(self.device.handle, self.device.number, _pack('!BB', fs_index, 0x10), _pack('!B', index))
if feature is not None:
self.features[index] = feature[:2]
return self.features[index]
def __contains__(self, value):
if self._check():
if value in self.features:
return True
for index in range(0, len(self.features)):
f = self.features[index] or self.__getitem__(index)
assert f is not None
if f == value:
return True
if f > value:
break
return False
def index(self, value):
if self._check():
if self.features is not None and value in self.features:
return self.features.index(value)
raise ValueError("%s not in list" % repr(value))
def __iter__(self):
if self._check():
yield _api.FEATURE.ROOT
index = 1
last_index = len(self.features)
while index < last_index:
yield self.__getitem__(index)
index += 1
def __len__(self):
return len(self.features) if self._check() else 0
#
#
#
class DeviceInfo(_api.PairedDevice):
"""A device attached to the receiver.
"""
def __init__(self, listener, number, status=STATUS.UNKNOWN):
super(DeviceInfo, self).__init__(listener.handle, number)
self._features = _FeaturesArray(self)
self.LOG = _Logger("Device[%d]" % number)
self._listener = listener
self._status = status
self.props = {}
# read them now, otherwise it it temporarily hang the UI
# if status >= STATUS.CONNECTED:
# n, k, s, f = self.name, self.kind, self.serial, self.firmware
@property
def receiver(self):
return self._listener.receiver
@property
def status(self):
return self._status
@status.setter
def status(self, new_status):
if new_status != self._status and not (new_status == STATUS.CONNECTED and self._status > new_status):
self.LOG.debug("status %d => %d", self._status, new_status)
urgent = new_status < STATUS.CONNECTED or self._status < STATUS.CONNECTED
self._status = new_status
self._listener.status_changed(self, urgent)
if new_status < STATUS.CONNECTED:
self.props.clear()
@property
def status_text(self):
if self._status < STATUS.CONNECTED:
return STATUS_NAME[self._status]
t = []
if self.props.get(PROPS.BATTERY_LEVEL):
t.append('Battery: %d%%' % self.props[PROPS.BATTERY_LEVEL])
if self.props.get(PROPS.BATTERY_STATUS):
t.append(self.props[PROPS.BATTERY_STATUS])
if self.props.get(PROPS.LIGHT_LEVEL):
t.append('Light: %d lux' % self.props[PROPS.LIGHT_LEVEL])
return ', '.join(t) if t else STATUS_NAME[STATUS.CONNECTED]
def process_event(self, code, data):
if code == 0x10 and data[:1] == b'\x8F':
self.status = STATUS.UNAVAILABLE
return True
if code == 0x11:
status = _devices.process_event(self, data)
if status:
if type(status) == int:
self.status = status
return True
if type(status) == tuple:
p = dict(self.props)
self.props.update(status[1])
if self.status == status[0]:
if p != self.props:
self._listener.status_changed(self)
else:
self.status = status[0]
return True
self.LOG.warn("don't know how to handle processed event status %s", status)
return False
def __str__(self):
return '<DeviceInfo(%d,%s,%d)>' % (self.number, self._name or '?', self._status)
#
#
#
_RECEIVER_STATUS_NAME = _FallbackDict(
lambda x:
'1 device found' if x == STATUS.CONNECTED + 1 else
'%d devices found' if x > STATUS.CONNECTED else
'?',
{
STATUS.UNKNOWN: 'Initializing...',
STATUS.UNAVAILABLE: 'Receiver not found.',
STATUS.BOOTING: 'Scanning...',
STATUS.CONNECTED: 'No devices found.',
}
)
class ReceiverListener(_EventsListener):
"""Keeps the status of a Unifying Receiver.
"""
def __init__(self, receiver, status_changed_callback=None):
super(ReceiverListener, self).__init__(receiver.handle, self._events_handler)
self.receiver = receiver
self.LOG = _Logger("ReceiverListener(%s)" % receiver.path)
self.events_filter = None
self.events_handler = None
self.status_changed_callback = status_changed_callback
receiver.kind = receiver.name
receiver.devices = {}
receiver.status = STATUS.BOOTING
receiver.status_text = _RECEIVER_STATUS_NAME[STATUS.BOOTING]
if _base.request(receiver.handle, 0xFF, b'\x80\x00', b'\x00\x01'):
self.LOG.info("initialized")
else:
self.LOG.warn("initialization failed")
if _base.request(receiver.handle, 0xFF, b'\x80\x02', b'\x02'):
self.LOG.info("triggered device events")
else:
self.LOG.warn("failed to trigger device events")
def change_status(self, new_status):
if new_status != self.receiver.status:
self.LOG.debug("status %d => %d", self.receiver.status, new_status)
self.receiver.status = new_status
self.receiver.status_text = _RECEIVER_STATUS_NAME[new_status]
self.status_changed(None, True)
def status_changed(self, device=None, urgent=False):
if self.status_changed_callback:
self.status_changed_callback(self.receiver, device, urgent)
def _device_status_from(self, event):
state_code = ord(event.data[2:3]) & 0xC0
state = STATUS.UNAVAILABLE if state_code == 0x40 else \
STATUS.CONNECTED if state_code == 0x80 else \
STATUS.CONNECTED if state_code == 0x00 else \
None
if state is None:
self.LOG.warn("don't know how to handle state code 0x%02X: %s", state_code, event)
return state
def _events_handler(self, event):
if self.events_filter and self.events_filter(event):
return
if event.code == 0x10 and event.data[0:2] == b'\x41\x04':
if event.devnumber in self.receiver.devices:
status = self._device_status_from(event)
if status is not None:
self.receiver.devices[event.devnumber].status = status
else:
dev = self.make_device(event)
if dev is None:
self.LOG.warn("failed to make new device from %s", event)
else:
self.receiver.devices[event.devnumber] = dev
self.change_status(STATUS.CONNECTED + len(self.receiver.devices))
return
if event.devnumber == 0xFF:
if event.code == 0xFF and event.data is None:
# receiver disconnected
self.LOG.warn("disconnected")
self.receiver.devices = {}
self.change_status(STATUS.UNAVAILABLE)
return
elif event.devnumber in self.receiver.devices:
dev = self.receiver.devices[event.devnumber]
if dev.process_event(event.code, event.data):
return
if self.events_handler and self.events_handler(event):
return
self.LOG.warn("don't know how to handle event %s", event)
def make_device(self, event):
if event.devnumber < 1 or event.devnumber > self.receiver.max_devices:
self.LOG.warn("got event for invalid device number %d: %s", event.devnumber, event)
return None
status = self._device_status_from(event)
if status is not None:
dev = DeviceInfo(self, event.devnumber, status)
self.LOG.info("new device %s", dev)
self.status_changed(dev, True)
return dev
self.LOG.error("failed to identify status of device %d from %s", event.devnumber, event)
def unpair_device(self, device):
try:
del self.receiver[device.number]
except IndexError:
self.LOG.error("failed to unpair device %s", device)
return False
del self.receiver.devices[device.number]
self.LOG.info("unpaired device %s", device)
self.change_status(STATUS.CONNECTED + len(self.receiver.devices))
device.status = STATUS.UNPAIRED
return True
def __str__(self):
return '<ReceiverListener(%s,%d)>' % (self.receiver.path, self.receiver.status)
@classmethod
def open(self, status_changed_callback=None):
receiver = _api.Receiver.open()
if receiver:
rl = ReceiverListener(receiver, status_changed_callback)
rl.start()
while not rl._active:
_sleep(0.1)
return rl
#
#
#
class _DUMMY_RECEIVER(object):
__slots__ = ['name', 'max_devices', 'status', 'status_text', 'devices']
name = kind = _api.Receiver.name
max_devices = _api.Receiver.max_devices
status = STATUS.UNAVAILABLE
status_text = _RECEIVER_STATUS_NAME[STATUS.UNAVAILABLE]
devices = {}
__bool__ = __nonzero__ = lambda self: False
DUMMY = _DUMMY_RECEIVER()

View File

@@ -1,127 +0,0 @@
#!/usr/bin/env python
NAME = 'Solaar'
VERSION = '0.7.2'
__author__ = "Daniel Pavel <daniel.pavel@gmail.com>"
__version__ = VERSION
__license__ = "GPL"
#
#
#
def _parse_arguments():
import argparse
arg_parser = argparse.ArgumentParser(prog=NAME.lower())
arg_parser.add_argument('-v', '--verbose',
action='count', default=0,
help='increase the logger verbosity (may be repeated)')
arg_parser.add_argument('-S', '--no-systray',
action='store_false',
dest='systray',
help='don\'t embed the application window into the systray')
arg_parser.add_argument('-N', '--no-notifications',
action='store_false',
dest='notifications',
help='disable desktop notifications (shown only when in systray)')
arg_parser.add_argument('-V', '--version',
action='version',
version='%(prog)s ' + __version__)
args = arg_parser.parse_args()
import logging
log_level = logging.WARNING - 10 * args.verbose
log_format='%(asctime)s %(levelname)8s [%(threadName)s] %(name)s: %(message)s'
logging.basicConfig(level=max(log_level, logging.DEBUG), format=log_format)
return args
def _check_requirements():
try:
import pyudev
except ImportError:
return 'python-pyudev'
try:
import gi.repository
except ImportError:
return 'python-gi'
try:
from gi.repository import Gtk
except ImportError:
return 'gir1.2-gtk-3.0'
if __name__ == '__main__':
args = _parse_arguments()
req_fail = _check_requirements()
if req_fail:
raise ImportError('missing required package: %s' % req_fail)
import ui
# check if the notifications are available and enabled
args.notifications &= args.systray
if ui.notify.available and ui.notify.init(NAME):
ui.action.toggle_notifications.set_active(args.notifications)
else:
ui.action.toggle_notifications = None
from receiver import DUMMY
window = ui.main_window.create(NAME, DUMMY.name, DUMMY.max_devices, args.systray)
if args.systray:
menu_actions = (ui.action.toggle_notifications,
ui.action.about)
icon = ui.status_icon.create(window, menu_actions)
else:
icon = None
window.present()
import pairing
from gi.repository import Gtk, GObject
listener = None
notify_missing = True
def status_changed(receiver, device=None, urgent=False):
ui.update(receiver, icon, window, device)
if ui.notify.available and urgent:
GObject.idle_add(ui.notify.show, device or receiver)
global listener
if not listener:
GObject.timeout_add(5000, check_for_listener)
listener = None
from receiver import ReceiverListener
def check_for_listener(retry=True):
global listener, notify_missing
if listener is None:
try:
listener = ReceiverListener.open(status_changed)
except OSError:
ui.show_permissions_warning(window)
if listener is None:
pairing.state = None
if notify_missing:
status_changed(DUMMY, None, True)
notify_missing = False
return retry
# print ("opened receiver", listener, listener.receiver)
notify_missing = True
pairing.state = pairing.State(listener)
status_changed(listener.receiver, None, True)
GObject.timeout_add(100, check_for_listener, False)
Gtk.main()
if listener is not None:
listener.stop()
ui.notify.uninit()

View File

@@ -1,70 +0,0 @@
# pass
from . import (notify, status_icon, main_window, pair_window, action)
from gi.repository import (GObject, Gtk)
GObject.threads_init()
from solaar import NAME as _NAME
_APP_ICONS = (_NAME + '-fail', _NAME + '-init', _NAME)
def appicon(receiver_status):
return (_APP_ICONS[0] if receiver_status < 0 else
_APP_ICONS[1] if receiver_status < 1 else
_APP_ICONS[2])
_ICON_THEME = Gtk.IconTheme.get_default()
def get_icon(name, fallback):
return name if name and _ICON_THEME.has_icon(name) else fallback
def icon_file(name):
if name and _ICON_THEME.has_icon(name):
return _ICON_THEME.lookup_icon(name, 0, 0).get_filename()
return None
def show_permissions_warning(window):
text = ('Found a possible Unifying Receiver device,\n'
'but did not have permission to open it.')
m = Gtk.MessageDialog(window, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, text)
m.set_title('Permissions error')
m.run()
m.destroy()
def find_children(container, *child_names):
assert container is not None
def _iterate_children(widget, names, result, count):
wname = widget.get_name()
if wname in names:
index = names.index(wname)
names[index] = None
result[index] = widget
count -= 1
if count > 0 and isinstance(widget, Gtk.Container):
for w in widget:
count = _iterate_children(w, names, result, count)
if count == 0:
break
return count
names = list(child_names)
count = len(names)
result = [None] * count
_iterate_children(container, names, result, count)
return tuple(result) if count > 1 else result[0]
def update(receiver, icon, window, reason):
assert receiver is not None
assert reason is not None
if window:
GObject.idle_add(main_window.update, window, receiver, reason)
if icon:
GObject.idle_add(status_icon.update, icon, receiver)

View File

@@ -1,91 +0,0 @@
#
#
#
# from sys import version as PYTTHON_VERSION
from gi.repository import Gtk
import ui.notify
import ui.pair_window
from solaar import NAME as _NAME
from solaar import VERSION as _VERSION
def _action(name, label, function, *args):
action = Gtk.Action(name, label, label, None)
action.set_icon_name(name)
if function:
action.connect('activate', function, *args)
return action
def _toggle_action(name, label, function, *args):
action = Gtk.ToggleAction(name, label, label, None)
action.set_icon_name(name)
action.connect('activate', function, *args)
return action
#
#
#
def _toggle_notifications(action):
if action.get_active():
ui.notify.init(_NAME)
else:
ui.notify.uninit()
action.set_sensitive(ui.notify.available)
toggle_notifications = _toggle_action('notifications', 'Notifications', _toggle_notifications)
def _show_about_window(action):
about = Gtk.AboutDialog()
about.set_icon_name(_NAME)
about.set_program_name(_NAME)
about.set_logo_icon_name(_NAME)
about.set_version(_VERSION)
about.set_license_type(Gtk.License.GPL_2_0)
about.set_authors(('Daniel Pavel http://github.com/pwr', ))
about.set_website('http://github.com/pwr/Solaar/wiki')
about.set_website_label('Solaar Wiki')
# about.set_comments('Using Python %s\n' % PYTTHON_VERSION.split(' ')[0])
about.run()
about.destroy()
about = _action('help-about', 'About ' + _NAME, _show_about_window)
quit = _action('exit', 'Quit', Gtk.main_quit)
#
#
#
import pairing
def _pair_device(action, frame):
window = frame.get_toplevel()
pair_dialog = ui.pair_window.create( action, pairing.state)
pair_dialog.set_transient_for(window)
pair_dialog.set_modal(True)
window.present()
pair_dialog.present()
def pair(frame):
return _action('add', 'Pair new device', _pair_device, frame)
def _unpair_device(action, frame):
window = frame.get_toplevel()
window.present()
device = frame._device
qdialog = Gtk.MessageDialog(window, 0,
Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO,
"Unpair device\n%s ?" % device.name)
choice = qdialog.run()
qdialog.destroy()
if choice == Gtk.ResponseType.YES:
pairing.state.unpair(device)
def unpair(frame):
return _action('remove', 'Unpair', _unpair_device, frame)

View File

@@ -1,304 +0,0 @@
#
#
#
from gi.repository import (Gtk, Gdk)
import ui
from logitech.devices.constants import (STATUS, PROPS)
_SMALL_DEVICE_ICON_SIZE = Gtk.IconSize.BUTTON
_DEVICE_ICON_SIZE = Gtk.IconSize.DIALOG
_STATUS_ICON_SIZE = Gtk.IconSize.LARGE_TOOLBAR
_PLACEHOLDER = '~'
#
#
#
def _info_text(dev):
fw_text = '\n'.join(['%-12s\t<tt>%s%s%s</tt>' %
(f.kind, f.name, ' ' if f.name else '', f.version) for f in dev.firmware])
return ('<small>'
'Serial \t\t<tt>%s</tt>\n'
'HID protocol\t<tt>%1.1f</tt>\n'
'%s'
'</small>' % (dev.serial, dev.protocol, fw_text))
def _toggle_info(action, label_widget, box_widget, frame):
if action.get_active():
box_widget.set_visible(True)
if not label_widget.get_text():
label_widget.set_markup(_info_text(frame._device))
else:
box_widget.set_visible(False)
def _make_receiver_box(name):
frame = Gtk.Frame()
frame._device = None
frame.set_name(name)
icon_name = ui.get_icon(name, 'preferences-desktop-peripherals')
icon = Gtk.Image.new_from_icon_name(icon_name, _SMALL_DEVICE_ICON_SIZE)
label = Gtk.Label('Scanning...')
label.set_name('label')
label.set_alignment(0, 0.5)
toolbar = Gtk.Toolbar()
toolbar.set_name('toolbar')
toolbar.set_style(Gtk.ToolbarStyle.ICONS)
toolbar.set_icon_size(Gtk.IconSize.MENU)
toolbar.set_show_arrow(False)
hbox = Gtk.HBox(homogeneous=False, spacing=8)
hbox.pack_start(icon, False, False, 0)
hbox.pack_start(label, True, True, 0)
hbox.pack_end(toolbar, False, False, 0)
info_label = Gtk.Label()
info_label.set_name('info-label')
info_label.set_alignment(0, 0.5)
info_label.set_padding(8, 2)
info_label.set_selectable(True)
info_box = Gtk.Frame()
info_box.add(info_label)
info_box.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
toggle_info_action = ui.action._toggle_action('info', 'Receiver info', _toggle_info, info_label, info_box, frame)
toolbar.insert(toggle_info_action.create_tool_item(), 0)
toolbar.insert(ui.action.pair(frame).create_tool_item(), -1)
vbox = Gtk.VBox(homogeneous=False, spacing=2)
vbox.set_border_width(4)
vbox.pack_start(hbox, True, True, 0)
vbox.pack_start(info_box, True, True, 0)
frame.add(vbox)
frame.show_all()
info_box.set_visible(False)
return frame
def _make_device_box(index):
frame = Gtk.Frame()
frame._device = None
frame.set_name(_PLACEHOLDER)
icon_name = 'preferences-desktop-peripherals'
icon = Gtk.Image.new_from_icon_name(icon_name, _DEVICE_ICON_SIZE)
icon.set_name('icon')
icon.set_alignment(0.5, 0)
label = Gtk.Label('Initializing...')
label.set_name('label')
label.set_alignment(0, 0.5)
label.set_padding(4, 4)
battery_icon = Gtk.Image.new_from_icon_name('battery_unknown', _STATUS_ICON_SIZE)
battery_label = Gtk.Label()
battery_label.set_width_chars(6)
battery_label.set_alignment(0, 0.5)
light_icon = Gtk.Image.new_from_icon_name('light_unknown', _STATUS_ICON_SIZE)
light_label = Gtk.Label()
light_label.set_alignment(0, 0.5)
light_label.set_width_chars(8)
toolbar = Gtk.Toolbar()
toolbar.set_name('toolbar')
toolbar.set_style(Gtk.ToolbarStyle.ICONS)
toolbar.set_icon_size(Gtk.IconSize.MENU)
toolbar.set_show_arrow(False)
status_box = Gtk.HBox(homogeneous=False, spacing=0)
status_box.set_name('status')
status_box.pack_start(battery_icon, False, True, 0)
status_box.pack_start(battery_label, False, True, 0)
status_box.pack_start(light_icon, False, True, 0)
status_box.pack_start(light_label, False, True, 0)
status_box.pack_end(toolbar, False, False, 0)
info_label = Gtk.Label()
info_label.set_name('info-label')
info_label.set_alignment(0, 0.5)
info_label.set_padding(8, 2)
info_label.set_selectable(True)
info_box = Gtk.Frame()
info_box.add(info_label)
toggle_info_action = ui.action._toggle_action('info', 'Device info', _toggle_info, info_label, info_box, frame)
toolbar.insert(toggle_info_action.create_tool_item(), 0)
toolbar.insert(ui.action.unpair(frame).create_tool_item(), -1)
vbox = Gtk.VBox(homogeneous=False, spacing=4)
vbox.pack_start(label, True, True, 0)
vbox.pack_start(status_box, True, True, 0)
vbox.pack_start(info_box, True, True, 0)
box = Gtk.HBox(homogeneous=False, spacing=4)
box.set_border_width(4)
box.pack_start(icon, False, False, 0)
box.pack_start(vbox, True, True, 0)
box.show_all()
frame.add(box)
info_box.set_visible(False)
return frame
def toggle(window, trigger):
if window.get_visible():
position = window.get_position()
window.hide()
window.move(*position)
else:
if trigger and type(trigger) == Gtk.StatusIcon:
x, y = window.get_position()
if x == 0 and y == 0:
x, y, _ = Gtk.StatusIcon.position_menu(Gtk.Menu(), trigger)
window.move(x, y)
window.present()
return True
def create(title, name, max_devices, systray=False):
window = Gtk.Window()
window.set_title(title)
window.set_icon_name(ui.appicon(0))
window.set_role('status-window')
vbox = Gtk.VBox(homogeneous=False, spacing=4)
vbox.set_border_width(4)
rbox = _make_receiver_box(name)
vbox.add(rbox)
for i in range(1, 1 + max_devices):
dbox = _make_device_box(i)
vbox.add(dbox)
vbox.set_visible(True)
window.add(vbox)
geometry = Gdk.Geometry()
geometry.min_width = 320
geometry.min_height = 32
window.set_geometry_hints(vbox, geometry, Gdk.WindowHints.MIN_SIZE)
window.set_resizable(False)
window.toggle_visible = lambda i: toggle(window, i)
if systray:
window.set_keep_above(True)
window.connect('delete-event', toggle)
else:
window.connect('delete-event', Gtk.main_quit)
return window
#
#
#
def _update_receiver_box(frame, receiver):
label, toolbar, info_label = ui.find_children(frame, 'label', 'toolbar', 'info-label')
label.set_text(receiver.status_text or '')
if receiver.status < STATUS.CONNECTED:
toolbar.set_sensitive(False)
toolbar.get_children()[0].set_active(False)
info_label.set_text('')
frame._device = None
else:
toolbar.set_sensitive(True)
frame._device = receiver
def _update_device_box(frame, dev):
frame._device = dev
icon, label, info_label = ui.find_children(frame, 'icon', 'label', 'info-label')
if frame.get_name() != dev.name:
frame.set_name(dev.name)
icon_name = ui.get_icon(dev.name, dev.kind)
icon.set_from_icon_name(icon_name, _DEVICE_ICON_SIZE)
label.set_markup('<b>' + dev.name + '</b>')
status = ui.find_children(frame, 'status')
status_icons = status.get_children()
toolbar = status_icons[-1]
if dev.status < STATUS.CONNECTED:
icon.set_sensitive(False)
label.set_sensitive(False)
status.set_sensitive(False)
for c in status_icons[1:-1]:
c.set_visible(False)
toolbar.get_children()[0].set_active(False)
else:
icon.set_sensitive(True)
label.set_sensitive(True)
status.set_sensitive(True)
battery_icon, battery_label = status_icons[0:2]
battery_level = dev.props.get(PROPS.BATTERY_LEVEL)
if battery_level is None:
battery_icon.set_from_icon_name('battery_unknown', _STATUS_ICON_SIZE)
battery_icon.set_sensitive(False)
battery_label.set_visible(False)
else:
icon_name = 'battery_%03d' % (20 * ((battery_level + 10) // 20))
battery_icon.set_from_icon_name(icon_name, _STATUS_ICON_SIZE)
battery_icon.set_sensitive(True)
battery_label.set_text('%d%%' % battery_level)
battery_label.set_visible(True)
battery_status = dev.props.get(PROPS.BATTERY_STATUS)
battery_icon.set_tooltip_text(battery_status or '')
light_icon, light_label = status_icons[2:4]
light_level = dev.props.get(PROPS.LIGHT_LEVEL)
if light_level is None:
light_icon.set_visible(False)
light_label.set_visible(False)
else:
icon_name = 'light_%03d' % (20 * ((light_level + 50) // 100))
light_icon.set_from_icon_name(icon_name, _STATUS_ICON_SIZE)
light_icon.set_visible(True)
light_label.set_text('%d lux' % light_level)
light_label.set_visible(True)
for b in toolbar.get_children()[:-1]:
b.set_sensitive(True)
frame.set_visible(True)
def update(window, receiver, device=None):
# print ("update", receiver, receiver.status, device)
window.set_icon_name(ui.appicon(receiver.status))
vbox = window.get_child()
frames = list(vbox.get_children())
if device is None:
_update_receiver_box(frames[0], receiver)
if receiver.status < STATUS.CONNECTED:
for frame in frames[1:]:
frame.set_visible(False)
frame.set_name(_PLACEHOLDER)
frame._device = None
else:
frame = frames[device.number]
if device.status == STATUS.UNPAIRED:
frame.set_visible(False)
frame.set_name(_PLACEHOLDER)
frame._device = None
else:
_update_device_box(frame, device)

View File

@@ -1,75 +0,0 @@
#
# Optional desktop notifications.
#
import logging
try:
from gi.repository import Notify
import ui
from logitech.devices.constants import STATUS
# necessary because the notifications daemon does not know about our XDG_DATA_DIRS
_icons = {}
def _icon(title):
if title not in _icons:
_icons[title] = ui.icon_file(title)
return _icons.get(title)
# assumed to be working since the import succeeded
available = True
_notifications = {}
def init(app_title):
"""Init the notifications system."""
global available
if available:
if not Notify.is_initted():
logging.info("starting desktop notifications")
try:
return Notify.init(app_title)
except:
logging.exception("initializing desktop notifications")
available = False
return available and Notify.is_initted()
def uninit():
if available and Notify.is_initted():
logging.info("stopping desktop notifications")
_notifications.clear()
Notify.uninit()
def show(dev):
"""Show a notification with title and text."""
if available and Notify.is_initted():
summary = dev.name
# if a notification with same name is already visible, reuse it to avoid spamming
n = _notifications.get(summary)
if n is None:
n = _notifications[summary] = Notify.Notification()
n.update(summary, dev.status_text, _icon(summary) or dev.kind)
urgency = Notify.Urgency.LOW if dev.status > STATUS.CONNECTED else Notify.Urgency.NORMAL
n.set_urgency(urgency)
try:
# logging.debug("showing %s", n)
n.show()
except Exception:
logging.exception("showing %s", n)
except ImportError:
logging.warn("desktop notifications disabled")
available = False
init = lambda app_title: False
uninit = lambda: None
show = lambda dev: None

View File

@@ -1,125 +0,0 @@
#
#
#
# import logging
from gi.repository import (Gtk, GObject)
import ui
def _create_page(assistant, text, kind):
p = Gtk.VBox(False, 12)
p.set_border_width(8)
if text:
label = Gtk.Label(text)
label.set_alignment(0, 0)
p.pack_start(label, False, True, 0)
assistant.append_page(p)
assistant.set_page_type(p, kind)
p.show_all()
return p
def _device_confirmed(entry, _2, trigger, assistant, page):
assistant.commit()
assistant.set_page_complete(page, True)
return True
def _finish(assistant):
# logging.debug("finish %s", assistant)
assistant.destroy()
def _cancel(assistant, state):
# logging.debug("cancel %s", assistant)
state.stop_scan()
_finish(assistant)
def _prepare(assistant, page, state):
index = assistant.get_current_page()
# logging.debug("prepare %s %d %s", assistant, index, page)
if index == 0:
state.reset()
GObject.timeout_add(state.TICK, state.countdown, assistant)
spinner = page.get_children()[-1]
spinner.start()
return
assistant.remove_page(0)
state.stop_scan()
def _scan_complete_ui(assistant, device):
if device is None:
page = _create_page(assistant,
'No new device detected.\n'
'\n'
'Make sure your device is within range of the receiver,\nand it has a decent battery charge.\n',
Gtk.AssistantPageType.CONFIRM)
else:
page = _create_page(assistant,
None,
Gtk.AssistantPageType.CONFIRM)
hbox = Gtk.HBox(False, 16)
device_icon = Gtk.Image()
device_icon.set_from_icon_name(ui.get_icon(device.name, device.kind), Gtk.IconSize.DIALOG)
hbox.pack_start(device_icon, False, False, 0)
device_label = Gtk.Label(device.kind + '\n' + device.name)
hbox.pack_start(device_label, False, False, 0)
halign = Gtk.Alignment.new(0.5, 0.5, 0, 1)
halign.add(hbox)
page.pack_start(halign, False, True, 0)
hbox = Gtk.HBox(False, 16)
hbox.pack_start(Gtk.Entry(), False, False, 0)
hbox.pack_start(Gtk.ToggleButton('Test'), False, False, 0)
halign = Gtk.Alignment.new(0.5, 0.5, 0, 1)
halign.add(hbox)
page.pack_start(halign, False, False, 0)
entry_info = Gtk.Label('Use the controls above to confirm\n'
'this is the device you want to pair.')
entry_info.set_sensitive(False)
page.pack_start(entry_info, False, False, 0)
page.show_all()
assistant.set_page_complete(page, True)
assistant.next_page()
def _scan_complete(assistant, device):
GObject.idle_add(_scan_complete_ui, assistant, device)
def create(action, state):
assistant = Gtk.Assistant()
assistant.set_title(action.get_label())
assistant.set_icon_name(action.get_icon_name())
assistant.set_size_request(440, 240)
assistant.set_resizable(False)
assistant.set_role('pair-device')
page_intro = _create_page(assistant,
'Turn on the device you want to pair.\n'
'\n'
'If the device is already turned on,\nturn if off and on again.',
Gtk.AssistantPageType.INTRO)
spinner = Gtk.Spinner()
spinner.set_visible(True)
page_intro.pack_end(spinner, True, True, 16)
assistant.scan_complete = _scan_complete
assistant.connect('prepare', _prepare, state)
assistant.connect('cancel', _cancel, state)
assistant.connect('close', _finish)
assistant.connect('apply', _finish)
return assistant

View File

@@ -1,55 +0,0 @@
#
#
#
from gi.repository import Gtk
import ui
def create(window, menu_actions=None):
icon = Gtk.StatusIcon()
icon.set_title(window.get_title())
icon.set_name(window.get_title())
icon.set_from_icon_name(ui.appicon(0))
icon.connect('activate', window.toggle_visible)
menu = Gtk.Menu()
for action in menu_actions or ():
if action:
menu.append(action.create_menu_item())
menu.append(ui.action.quit.create_menu_item())
menu.show_all()
icon.connect('popup_menu',
lambda icon, button, time, menu:
menu.popup(None, None, icon.position_menu, icon, button, time),
menu)
return icon
def update(icon, receiver):
icon.set_from_icon_name(ui.appicon(receiver.status))
if receiver.devices:
lines = []
if receiver.status < 1:
lines += (receiver.status_text, '')
devlist = [receiver.devices[d] for d in range(1, 1 + receiver.max_devices) if d in receiver.devices]
for dev in devlist:
name = '<b>' + dev.name + '</b>'
if dev.status < 1:
lines.append(name + ' (' + dev.status_text + ')')
else:
lines.append(name)
if dev.status > 1:
lines.append(' ' + dev.status_text)
lines.append('')
text = '\n'.join(lines).rstrip('\n')
icon.set_tooltip_markup(text)
else:
icon.set_tooltip_text(receiver.status_text)

View File

@@ -1,9 +0,0 @@
#!/bin/sh
Z=`readlink -f "$0"`
LIB=`readlink -f $(dirname "$Z")/../lib`
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB/native/`arch`
export PYTHONPATH=$LIB
PYTHON=`which python python2 python3 | head -n 1`
exec $PYTHON -OOu -m hidapi.hidconsole "$@"

View File

@@ -1,9 +0,0 @@
#!/bin/sh
Z=`readlink -f "$0"`
LIB=`readlink -f $(dirname "$Z")/../lib`
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB/native/`arch`
export PYTHONPATH=$LIB
PYTHON=`which python python2 python3 | head -n 1`
exec $PYTHON -OOu -m logitech.scanner "$@"

View File

@@ -1,13 +1,55 @@
#!/bin/sh
#!/usr/bin/env python3
# -*- python-mode -*-
# -*- coding: UTF-8 -*-
Z=`readlink -f "$0"`
APP=`readlink -f $(dirname "$Z")/../app`
LIB=`readlink -f $(dirname "$Z")/../lib`
SHARE=`readlink -f $(dirname "$Z")/../share`
## Copyright (C) 2012-2013 Daniel Pavel
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB/native/`arch`
export PYTHONPATH=$APP:$LIB
export XDG_DATA_DIRS=$SHARE:$XDG_DATA_DIRS
PYTHON=`which python python2 python3 | head -n 1`
exec $PYTHON -OOu -m solaar "$@"
def init_paths():
"""Make the app work in the source tree."""
import sys
import os.path as _path
# Python 2 need conversion from utf-8 filenames
# Python 3 might have problems converting back to UTF-8 in case of Unicode surrogates
try:
decoded_path = sys.path[0]
sys.path[0].encode(sys.getfilesystemencoding())
except UnicodeError:
sys.stderr.write(
'ERROR: Solaar cannot recognize encoding of filesystem path, '
'this may happen because non UTF-8 characters in the pathname.\n'
)
sys.exit(1)
prefix = _path.normpath(_path.join(_path.realpath(decoded_path), '..'))
src_lib = _path.join(prefix, 'lib')
share_lib = _path.join(prefix, 'share', 'solaar', 'lib')
for location in src_lib, share_lib:
init_py = _path.join(location, 'solaar', '__init__.py')
# print ("sys.path[0]: checking", init_py)
if _path.exists(init_py):
# print ("sys.path[0]: found", location, "replacing", sys.path[0])
sys.path[0] = location
break
if __name__ == '__main__':
init_paths()
import solaar.gtk
solaar.gtk.main()

6
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
# ignore documentation-specific files
.jekyll-metadata
Gemfile
Gemfile.lock
_site/

BIN
docs/20121210110342697.pdf Normal file

Binary file not shown.

4
docs/README.md Normal file
View File

@@ -0,0 +1,4 @@
# Documentation Readme
This project's documentation is hosted using GitHub pages, which serves static pages using Jekyll.
[Please refer to the official documentation for instructions for how to build the site locally.](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
docs/Solaar-menu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
docs/Solaar-rule-editor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

10
docs/_config.yml Normal file
View File

@@ -0,0 +1,10 @@
title: Solaar
description: Linux Device Manager for Logitech Unifying Receivers and Devices.
tagline: Linux Device Manager for Logitech Unifying Receivers and Devices.
owner: pwr-Solaar
owner_url: https://github.com/pwr-Solaar
repository: pwr-Solaar/Solaar
version: 1.1.2
show_downloads: false
encoding: utf-8
theme: jekyll-theme-slate

View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,maximum-scale=2">
<link rel="stylesheet" type="text/css" media="screen" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
<link rel="icon" type="image/png" href="{{ site.baseurl }}/assets/favicon.png" />
{% seo %}
</head>
<body>
<!-- HEADER -->
<div id="header_wrap" class="outer">
<header class="inner">
{% if site.github.is_project_page %}
<a id="forkme_banner" href="{{ site.github.repository_url }}">View on GitHub</a>
{% endif %}
<h1 id="project_title">
<img src="{{ site.baseurl }}/assets/solaar.svg" style="margin-bottom: -10px; width: 48px; height: 48px; border: 0; box-shadow: none;" />
{{ site.title | default: site.github.repository_name }}</h1>
<h2 id="project_tagline">{{ site.description | default: site.github.project_tagline }}</h2>
{% if site.show_downloads %}
<section id="downloads">
<a class="zip_download_link" href="{{ site.github.zip_url }}">Download this project as a .zip file</a>
<a class="tar_download_link" href="{{ site.github.tar_url }}">Download this project as a tar.gz file</a>
</section>
{% endif %}
</header>
</div>
<!-- MAIN CONTENT -->
<div id="main_content_wrap" class="outer">
<section id="main_content" class="inner">
{{ content }}
</section>
</div>
<!-- FOOTER -->
<div id="footer_wrap" class="outer">
<footer class="inner">
{% if site.github.is_project_page %}
<p class="copyright">{{ site.title | default: site.github.repository_name }} maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p>
{% endif %}
<p>Published with <a href="https://pages.github.com">GitHub Pages</a></p>
</footer>
</div>
</body>
</html>

47
docs/_layouts/page.html Normal file
View File

@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,maximum-scale=2">
<link rel="stylesheet" type="text/css" media="screen" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
<link rel="icon" type="image/png" href="{{ site.baseurl }}/assets/favicon.png" />
{% seo %}
</head>
<body>
<!-- HEADER -->
<div id="header_wrap" class="outer">
<header class="inner">
{% if site.github.is_project_page %}
<a id="forkme_banner" href="{{ site.github.repository_url }}">View on GitHub</a>
{% endif %}
<h1 id="project_title">
<a href="{{ site.baseurl }}" style="color: #fff;">
<img src="{{ site.baseurl }}/assets/solaar.svg" style="margin-bottom: -10px; width: 48px; height: 48px; border: 0; box-shadow: none;" />
{{ site.title | default: site.github.repository_name }}</h1>
</a>
</header>
</div>
<!-- MAIN CONTENT -->
<div id="main_content_wrap" class="outer">
<section id="main_content" class="inner">
{{ content }}
</section>
</div>
<!-- FOOTER -->
<div id="footer_wrap" class="outer">
<footer class="inner">
{% if site.github.is_project_page %}
<p class="copyright">{{ site.title | default: site.github.repository_name }} maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p>
{% endif %}
<p>Published with <a href="https://pages.github.com">GitHub Pages</a></p>
</footer>
</div>
</body>
</html>

BIN
docs/assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

100
docs/assets/solaar.svg Normal file
View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="solaar.svg"
inkscape:export-filename="/home/chris/Git/Solaar/_includes/favicon.png"
inkscape:export-xdpi="66.666672"
inkscape:export-ydpi="66.666672"
width="43.200001"
height="43.200001">
<metadata
id="metadata21">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1807"
inkscape:window-height="797"
id="namedview19"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="2.36"
inkscape:cx="1.4135593"
inkscape:cy="-4.4"
inkscape:window-x="3000"
inkscape:window-y="840"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<defs
id="defs4">
<linearGradient
id="gradient_blue">
<stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop7" />
<stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop9" />
</linearGradient>
<linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" />
</defs>
<g
transform="matrix(0.48,0,0,0.48,-2.4,-2.4)"
id="g13">
<path
d="m 21.5,5.5 c -8.864,0 -16,7.136 -16,16 l 0,57 c 0,8.864 7.136,16 16,16 l 57,0 c 8.864,0 16,-7.136 16,-16 l 0,-57 c 0,-8.864 -7.136,-16 -16,-16 l -57,0 z m 16.1875,11.1875 9.03125,15.625 C 47.784179,32.115965 48.877705,32 50,32 c 1.122295,0 2.215821,0.115965 3.28125,0.3125 l 9.03125,-15.625 10.375,6 -9.03125,15.625 C 65.078123,39.972287 66.191785,41.898777 66.9375,44 L 85,44 85,56 66.9375,56 c -0.745715,2.101223 -1.859377,4.027713 -3.28125,5.6875 l 9.03125,15.625 -10.375,6 -9.03125,-15.625 C 52.215821,67.884035 51.122295,68 50,68 48.877705,68 47.784179,67.884035 46.71875,67.6875 l -9.03125,15.625 -10.375,-6 9.03125,-15.625 C 34.921877,60.027713 33.808215,58.101223 33.0625,56 L 15,56 15,44 33.0625,44 c 0.745715,-2.101223 1.859377,-4.027713 3.28125,-5.6875 l -9.03125,-15.625 10.375,-6 z"
style="fill:url(#gradient_rect);fill-opacity:1;fill-rule:nonzero;stroke:#16161d;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
id="path15"
inkscape:connector-curvature="0" />
<path
d="m 62,50 a 12,12 0 1 1 -24,0 12,12 0 1 1 24,0 z"
style="fill:url(#gradient_dot);fill-opacity:1;fill-rule:nonzero;stroke:#16161d;stroke-opacity:1"
id="path17"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

219
docs/capabilities.md Normal file
View File

@@ -0,0 +1,219 @@
---
title: Solaar Capabilities
layout: page
---
# Solaar Capabilities
[**Solaar**][solaar] reports on and controls [Logitech][logitech] devices
(keyboards, mice, and trackballs) that connect to your computer via a
Logitech USB receiver (a very small piece of hardware that plugs into one of
your USB ports).
Solaar is designed to detect all connected devices,
and at the very least display some basic information about them.
At this moment, all [Unifying][unifying] receivers are supported (e.g., devices
with USB ID `046d:c52b` or `046d:c532`) as are several Lightspeed Receivers
and many Nano receivers.
Solaar also reports on and controls some Logitech devices that directly connect
to your computer using a USB cable or via Bluetooth.
Not all such devices supported in Solaar as information needs to be added to Solaar
for each device type that directly connects.
## HID++
The devices that Solaar handles use Logitech's HID++ protocol.
HID++ is a Logitech-proprietary protocol that extends the standard HID
protocol for interfacing with receivers, keyboards, mice, and so on. It allows
Logitech receivers to communicate with multiple devices and modify some
features of the device. As the HID++ protocol is
proprietary, many aspects of it are unknown. Some information about HID++
has been obtained from Logitech but even that is subject to change and
extension.
There are several versions of HID++ and many Logitech
receivers and devices that utilize it. Different receivers and devices
implement different portions of HID++ so even if two devices appear to be
the same in both physical appearance and behavior they may work
differently underneath. (For example, there are versions of the
M510 mouse that use different versions of the HID++ protocol.)
Contrariwise, two different devices may appear different physically but
actually look the same to software. (For example, some M185 mice look the
same to software as some M310 mice.)
The software identity of a receiver can be determined by its USB product ID
(reported by Solaar and also viewable in Linux using `lsusb`). The software
identity of a device that connects to a receiver can be determined by
its wireless PID as reported by Solaar. The software identity of devices that
connect via a USB cable or via bluetooth can be determined by their USB or
Bluetooth product ID.
# Pairing and Unpairing
Solaar is able to pair and unpair devices with
receivers as supported by the device and receiver.
For Unifying receivers, pairing adds a new paired device, but
only if there is an open slot on the receiver. So these receivers need to
be able to unpair devices that they have been paired with or else they will
not have any open slots for pairing. Some other receivers, like the
Nano receiver with USB ID `046d:c534`, can only pair with particular kinds of
devices and pairing a new device replaces whatever device of that kind was
previously paired to the receiver. These receivers cannot unpair. Further,
some receivers can pair an unlimited number of times but others can only
pair a limited number of times.
Bolt receivers add an authentication phase to pairing,
where the user has type a passcode or click some buttons to authenticate the device.
Only some connections between receivers and devices are possible. In should
be possible to connect any device with a Unifying logo on it to any receiver
with a Unifying logo on it. Receivers without the Unifying logo probably
can connect only to the kind of devices they were bought with and devices
without the Unifying logo can probably only connect to the kind of receiver
that they were bought with.
## Device Settings
Solaar can display quite a few changeable settings of receivers and devices.
For a list of HID++ features and their support see [the features page](features).
Solaar does not do much beyond using the HID++ protocol to change the
behavior of receivers and devices via changing their settings.
In particular, Solaar cannot change how
the operating system turns the keycodes that a keyboard produces into
characters that are sent to programs. That is the province of HID device
drivers and other software (such as X11).
Settings can only be changed in the Solaar GUI when they are unlocked.
To unlock a setting click on the icon at the right-hand edge of the setting
until an unlocked lock appears (with tooltop "Changes allowed").
Solaar keeps track of most of the changeable settings of a device.
Devices forget most changed settings when the device is turned off
or goes into a power-saving mode.
The exceptions include the setting to change the host the device is connected to
and the setting to persistently change what a key or button does.
When Solaar starts, it restores on-line devices to their previously-known state
for the unexceptionable settings and while running it restores
devices to their previously-known state when the device itself comes on line.
Setting information is stored in the file `~/.config/solaar/config.json`.
Updating of a setting can be turned off in the Solaar GUI by clicking on the icon
at the right-hand edge of the setting until a red icon appears (with tooltip
"Ignore this setting" ).
Solaar keeps track of settings independently on each computer.
As a result if a device is switched between different computers
Solaar may apply different settings for it on the different computers
Querying a device for its current state can require quite a few HID++
interactions. These interactions can temporarily slow down the device, so
Solaar tries to internally cache information about devices while it is
running. If the device
state is changed by some other means, even sometimes by another invocation
of Solaar, this cached information may become incorrect. Currently there is
no way to force an update of the cached information besides restarting Solaar.
Logitech receivers and devices have firmware in them. Some firmware
can be updated using Logitech software in Windows. For example, there are
security issues with some Logitech receivers and devices and Logitech has
firmware updates to alleviate these problems. Some Logitech firmware can
also be updated in Linux using `fwupdmgr`.
WARNING: Updating firmware can cause a piece of hardware to become
permanently non-functional if something goes wrong with the update or the
update installs the wrong firmware.
## Other Solaar Capabilities
Solaar has a few capabilities that go beyond simply changing device settings.
### Rule-based Processing of HID++ Notifications
Solaar can process HID++ Notifications from devices to, for example,
change the speed of some thumb wheels. These notifications are only sent
for actions that are set in Solaar to their HID++ setting (also known as diverted).
For more information on this capability of Solaar see
[the rules page](https://pwr-solaar.github.io/Solaar/rules). As much of rule processing
depends on X11, this capability is only when running under X11.
Users can edit rules using a GUI by clicking on the `Edit Rule` button in the Solaar main window.
Solaar rules is an experimental feature. Significant changes might be made in response to problems.
### Sliding DPI
A few mice (such as the MX Vertical) have a button that is supposed to be used to change
the sensitivity (DPI) of the mouse by pressing the button and moving the mouse left and right.
Other mice (such as the MX Master 3) don't have a button specific for this purpose
but have buttons that can be used for it.
The DPI Sliding Adjustment setting assigns a button for this purpose.
Pressing the button, if the button is diverted, causes the mouse pointer to stop moving.
When the button is released a new Sensitivity (DPI) value is applied to the mouse,
depending on how far right or left the mouse is moved. If the mouse is moved only a little bit
the previous value that was set is applied to the mouse.
Notifications from Solaar are displayed while the mouse button is done
showing the setting that will be applied.
### Mouse Gestures
Some mice (such as the MX Master 3) have a button that is supposed to be used to
create up/down/left/right mouse gestures. Other mice (such as the MX Vertical) don't
have a button specific for this purpose but have buttons that can be used for it.
The Mouse Gestures setting assigns a button for this purpose.
Pressing the button, if the button is diverted, causes the mouse pointer to stop moving.
When the button is released a MOUSE_GESTURE notification with the total mouse movement
while the button was pressed is sent to the Solaar rule system.
MOUSE_GESTURE notifications trigger mouse gesture conditions in Solaar rules.
For more information on mouse gesture rules conditions see
[the rules page](https://pwr-solaar.github.io/Solaar/rules).
Mouse gestures is an experimental feature.
Significant changes might be made to it in the future.
## System Tray
Solaar's GUI normally uses an icon in the system tray.
This allows users to close Solaar and reopen from the tray.
This aspect of Solaar depends on having an active system tray which may
require some special setup when using Gnome, particularly under Wayland.
If you are running gnome, you most likely need the
`gnome-shell-extension-appindicator` package installed.
In Fedora, this can be done by running
```
sudo dnf install gnome-shell-extension-appindicator
```
The likely command in Ubuntu and related distributions is
```
sudo apt install gnome-shell-extension-appindicator
```
You may have to log out and log in again before the system tray shows up.
## Battery Icons
For many devices, Solaar shows the approximate battery level via icons that
show up in both the main window and the system tray. In previous versions
several heuristics to determine which icon names to use for this purpose,
but as more and more battery icon schemes have been developed this has
become impossible to do well. Solaar now uses the eleven standard
battery icon names `battery-{full,good,low,critical,empty}[-charging]` and
`battery-missing`.
Solaar will use the symbolic versions of these icons if started with the
option `--battery-icons=symbolic`. Because of external bugs,
these symbolic icons may be nearly invisible in dark themes.
[solaar]: https://github.com/pwr-Solaar/Solaar
[logitech]: https://www.logitech.com
[unifying]: https://en.wikipedia.org/wiki/Logitech_Unifying_receiver

8
docs/debian.md Normal file
View File

@@ -0,0 +1,8 @@
---
title: Debian Repository
layout: page
---
# Debian repository
Solaar is now part of the [official Debian repository](https://packages.debian.org/solaar). To install it on your Debian machine, use the following command: `sudo apt install solaar`

239
docs/devices.md Normal file
View File

@@ -0,0 +1,239 @@
---
title: Supported Devices
layout: page
---
# Supported receivers and devices
Solaar only supports Logitech receivers and devices that use the Logitech proprietary HID++ protocol.
Solaar supports most Logitech Nano, Unifying, and Bolt receivers.
Solaar supports some Lightspeed receivers.
See the receiver table below for the list of currently supported receivers.
Solaar supports most recent and many older Logitech devices
(keyboards, mice, trackballs, and touchpads)
that can connect to supported receivers.
Solaar supports many recent Logitech devices that can connect via a USB cable,
but some such Logitech devices are not suited for use in Solaar because they do not use the HID++ protocol.
One example is the MX518 Gaming Mouse.
Solaar supports most recent Logitech devices that can connect via Bluetooth.
The device tables below provide a list of some of the devices that Solaar supports,
giving their product name, WPID product number, and HID++ protocol information..
The tables concentrate on older devices that have explicit support information in Solaar.
The best way to determine whether Solaar supports a device is to run Solaar while the device is connected.
If the device is supported, it will show up in the Solaar main window.
If it is not, and there is no issue about the device in the Solaar GitHub repository,
open an enhancement issue requesting that it be supported.
## Adding new receivers and devices
Adding a new receiver requires knowing whether the receiver is a regular
Unifying receiver, a Nano receiver, a Bolt receiver, or a Lightspeed receiver. Add a line to
`../lib/logitech_receiver/base_usb.py` defining the receiver as one of these.
If the receiver has an unusual number of pairing slots, then this also needs
to be specified. Then add the receiver to the tuple of receivers (ALL).
Most new devices do not need to be known to Solaar to work.
The _D function in `../lib/logitech_receiver/descriptors.py` makes a device known to Solaar.
The usual arguments to the _D function are the device's long name, its short name
(codename), and its HID++ protocol version.
Devices that use HID++ 1.0 need a tuple of known registers (registers) and settings (settings).
Settings can be provided for Devices that use HID++ 2.0 or later,
but Solaar can determine these from the device.
If the device can connect to a receiver, provide its wireless product ID (wpid),
If the device can connect via Bluetooth, provide its Bluetooth product ID (btid).
If the device can connect via a USB cable, provide its USB product ID (usbid),
and the interface it uses to send and receiver HID++ messages (interface - default 2).
The use of a non-default USB interface is the main reason for requiring information about
modern devices to be added to Solaar.
### Supported Receivers
| USB ID | Kind | Max Paired Devices |
------------|------------|--------------------|
| 046d:c517 | 27MHz | 4 |
| 046d:c518 | Nano | 1 |
| 046d:c51a | Nano | 1 |
| 046d:c51b | Nano | 1 |
| 046d:c521 | Nano | 1 |
| 046d:c525 | Nano | 1 |
| 046d:c526 | Nano | 1 |
| 046d:c52b | Unifying | 6 |
| 046d:c52e | Nano | 1 |
| 046d:c52f | Nano | 1 |
| 046d:c531 | Nano | 1 |
| 046d:c532 | Unifying | 6 |
| 046d:c534 | Nano | 2 |
| 046d:c537 | Nano | 2 |
| 046d:c539 | Lightspeed | 1 |
| 046d:c53a | Lightspeed | 1 |
| 046d:c53d | Lightspeed | 1 |
| 046d:c53f | Lightspeed | 1 |
| 046d:c541 | Lightspeed | 1 |
| 046d:c542 | Nano | 1 |
| 046d:c545 | Lightspeed | 1 |
| 046d:c547 | Lightspeed | 1 |
| 046d:c548 | Bolt | 6 |
| 17ef:6042 | Nano | 1 |
Some Nano receivers are only partly supported
as they do not fully implement the full HID++ 1.0 protocol.
Some Nano receivers are not supported at all as they do not implement the HID++ protocol.
Receivers with USB ID 046d:c542 fall into this category.
The receiver with USB ID 046d:c517 is an old 27 MHz receiver, supporting only
subset of HID++ 1.0 protocol. Only hardware pairing is supported.
### Keyboards (Unifying)
| Device | WPID | HID++ |
|------------------|------|-------|
| K230 | 400D | 2.0 |
| K270 | 4003 | 2.0 |
| K340 | 2007 | 1.0 |
| K350 | 200A | 1.0 |
| K360 | 4004 | 2.0 |
| K375s | 4071 | |
| K400 Touch | 400E | 2.0 |
| K400 Touch | 4024 | 2.0 |
| K400 Plus | 404D | 2.0 |
| K520 | 2011 | 1.0 |
| K600 TV | 4078 | 2.0 |
| K750 Solar | 4002 | 2.0 |
| K780 | 405B | 2.0 |
| K800 Illuminated | 2010 | 1.0 |
| K800 (new ver) | 406E | 2.0 |
| K830 Illuminated | 4032 | 2.0 |
| MX Keys | 408A | 2.0 |
| N545 | 2006 | |
| TK820 | | 2.0 |
| Craft | 4066 | 2.0 |
### Keyboards (Lightspeed)
| Device | WPID | HID++ |
|------------------|------|-------|
| G915 TKL | 408E | 4.2 |
### Mice (Unifying)
| Device | WPID | HID++ |
|------------------|------|-------|
| M150 | 4022 | 2.0 |
| M185 | 4055 | 2.0 |
| M310 | 4031 | 2.0 |
| M310 | 4055 | 2.0 |
| M317 | | |
| M325 | 400A | 2.0 |
| M330 | | 2.0 |
| M345 | 4017 | 2.0 |
| M350 | 101C | 1.0 |
| M350 | 4080 | 2.0 |
| M505 | 101D | 1.0 |
| M510 | 1025 | 1.0 |
| M510 | 4051 | 2.0 |
| M515 Couch | 4007 | 2.0 |
| M525 | 4013 | 2.0 |
| M560 | | 2.0 |
| M585 | 406B | 2.0 |
| M590 | 406B | 2.0 |
| M600 Touch | 401A | 2.0 |
| M705 Marathon | 101B | 1.0 |
| M705 Marathon | 406D | 2.0 |
| M720 Triathlon | 405E | 2.0 |
| T400 Zone Touch | | 2.0 |
| T620 Touch | | 2.0 |
| Performance MX | 101A | 1.0 |
| Anywhere MX | 1017 | 1.0 |
| Anywhere MX 2 | 404A | 2.0 |
| MX Master | 4041 | 2.0 |
| MX Master 2S | 4069 | 2.0 |
| Cube | | 2.0 |
### Mice (Nano)
| Device | WPID | HID++ |
|------------------|------|-------|
| G7 | 1002 | 1.0 |
| G700 | 1023 | 1.0 |
| G700s | 102A | 1.0 |
| V450 Nano | 1011 | 1.0 |
| V550 Nano | 1013 | 1.0 |
| VX Nano | 100B | 1.0 |
| VX Nano | 100F | 1.0 |
| M175 | 4008 | |
| M185 (old) | 4038 | 2.0 |
| M185 (new) | 4054 | 2.0 |
| M187 | 4019 | 2.0 |
| M215 | 1020 | 1.0 |
| M235 | 4055 | 2.0 |
| M305 | 101F | 1.0 |
| M310 | 1024 | 1.0 |
| M315 | | |
| M330 | | ?.? |
| MX 1100 | 1014 | 1.0 |
* (old): M185 with P/N: 810-003496
* (new): M185 with P/N: 810-005238 or 810-005232
### Mice (Mini)
| Device | WPID | HID++ |
|-------------------|------|-------|
| MX610 | 1001 | 1.0 |
| MX610 left handed | 1004 | 1.0 |
| MX620 | 100A | 1.0 |
| MX620 | 1016 | 1.0 |
| V400 | 1003 | 1.0 |
| V450 | 1005 | 1.0 |
| VX Revolution | 1006 | 1.0 |
| VX Revolution | 100D | 1.0 |
| MX Air | 1007 | 1.0 |
| MX Air | 100E | 1.0 |
| MX Revolution | 1008 | 1.0 |
| MX Revolution | 100C | 1.0 |
### Mice (Lightspeed)
| Device | WPID | HID++ |
|------------------------------|------|-------|
| PRO X Superlight Wireless | 4093 | 4.2 |
### Trackballs (Unifying)
| Device | WPID | HID++ |
|-------------------|------|-------|
| M570 Trackball | | 1.0 |
| MX Ergo Trackball | | 2.0 |
### Touchpads (Unifying)
| Device | WPID | HID++ |
|------------------|------|-------|
| Wireless Touch | 4011 | 2.0 |
| T650 Touchpad | 4101 | 2.0 |
### Mice and Keyboards sold as combos
| Device | WPID | HID++ |
|------------------|------|-------|
| MK220 | | 2.0 |
| MK270 | 4023 | 2.0 |
| MK320 | 200F | |
| MK330 | | |
| MK345 | 4023 | 2.0 |
| MK520 | | M2/K1 |
| MK550 | | |
| MK700 | 2008 | 1.0 |
| MK710 | | 1.0 |
| EX100 keyboard | 0065 | 1.0 |
| EX100 mouse | 003f | 1.0 |
* The EX100 is an old, preunifying receiver and device set, supporting only part of HID++ 1.0 features

View File

@@ -0,0 +1,48 @@
1: Wireless Mouse M510
Codename : M510v2
Kind : mouse
Wireless PID : 4051
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 8989B04C
Firmware: RQM 62.00.B0013
The power switch is located on the base.
Supports 22 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: RESET {0020}
5: BATTERY STATUS {1000}
6: unknown:1802 {1802} internal, hidden
7: unknown:1810 {1810} internal, hidden
8: unknown:1830 {1830} internal, hidden
9: unknown:1862 {1862} internal, hidden
10: unknown:1890 {1890} internal, hidden
11: unknown:18A0 {18A0} internal, hidden
12: unknown:18B1 {18B1} internal, hidden
13: REPROG CONTROLS V4 {1B04}
14: WIRELESS DEVICE STATUS {1D4B}
15: unknown:1DF0 {1DF0} hidden
16: unknown:1DF3 {1DF3} internal, hidden
17: unknown:1E00 {1E00} hidden
18: unknown:1EB0 {1EB0} internal, hidden
19: unknown:1F03 {1F03} internal, hidden
20: LOWRES WHEEL {2130}
21: POINTER SPEED {2205}
Has 7 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
divertable, mse, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
divertable, mse, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
3: LEFT SCROLL AS AC PAN , default: HorzScrollLeftSet => LEFT SCROLL AS AC PAN
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
4: RIGHT SCROLL AS AC PAN , default: HorzScrollRightSet => RIGHT SCROLL AS AC PAN
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
5: BACK AS BUTTON 4 , default: BackEx => BACK AS BUTTON 4
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
6: FORWARD AS BUTTON 5 , default: BrowserForwardEx => FORWARD AS BUTTON 5
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
Battery: 70%, discharging.

View File

@@ -0,0 +1,51 @@
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : A7F5923B
Firmware : 24.01.B0023
Bootloader : 01.08
Other : AA.AD
Has 1 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=11
1: Wireless Mouse MX Anywhere 2
Codename : MX Anywhere 2
Kind : mouse
Wireless PID : 404A
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: F3B81C5B
Bootloader: BOT 23.00.B0007
Firmware: MPM 02.00.B0007
Firmware: MPM 02.00.B0007
Other:
The power switch is located on the base.
Supports 26 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: BATTERY STATUS {1000}
7: CHANGE HOST {1814}
8: REPROG CONTROLS V4 {1B04}
9: ADJUSTABLE DPI {2201}
10: VERTICAL SCROLLING {2100}
11: HIRES WHEEL {2121}
12: DFUCONTROL 2 {00C1}
13: unknown:1813 {1813} internal, hidden
14: unknown:1830 {1830} internal, hidden
15: unknown:1890 {1890} internal, hidden
16: unknown:1891 {1891} internal, hidden
17: unknown:18A1 {18A1} internal, hidden
18: unknown:18C0 {18C0} internal, hidden
19: unknown:1DF3 {1DF3} internal, hidden
20: unknown:1E00 {1E00} hidden
21: unknown:1EB0 {1EB0} internal, hidden
22: unknown:1803 {1803} internal, hidden
23: unknown:1861 {1861} internal, hidden
24: unknown:9000 {9000} internal, hidden
25: unknown:1805 {1805} internal, hidden
Battery: 0%, recharging.

View File

@@ -0,0 +1,88 @@
Receiver
LZ301AR-DJ
M/N:C-U0007
(ltunify)
Serial number: D1759614
Firmware version: 012.001.00019
Bootloader version: BL.002.014
Supported notification flags: 00 09 00
- 01: Wireless Notifications
- 08: Software Present
Mouse
(ltunify)
HID++ version: 1.0
Device index 1
Mouse
Name: Anywhere MX
Wireless Product ID: 1017
Serial number: 13865F99
Firmware version: 016.001.00040
Bootloader version: BL.002.010
(solaar)
Unifying Receiver
Device path : /dev/hidraw2
USB id : 046d:c52b
Serial : D1759614
Firmware : 12.01.B0019
Bootloader : 02.14
Has 1 paired device(s) out of a maximum of 6.
Notifications: (none)
Device activity counters: 1=19
1: Anywhere Mouse MX
Codename : Anywhere MX
Kind : mouse
Wireless PID : 1017
Protocol : HID++ 1.0
Polling rate : 8 ms (125Hz)
Serial number: 13865F99
Firmware: 16.01.B0040
Bootloader: 02.10
Other: 00.06
The power switch is located on the base.
Notifications: (none).
Battery: 100%, discharging.
(scan-registers)
# Old notification flags: 000000
# 00 - Enabled Notifications, supported flags: Battery Status (10)
>> ( 0.792) [10 01 8100 100000] b'\x10\x01\x81\x00\x10\x00\x00'
# 01 - scrolling settings?
# Flags:
# 0x40 - Enable Smooth Scrolling
# 0x02 - "confuse KDE", see https://github.com/pwr/Solaar/issues/115
<< ( 0.011) [10 01 8101 000000] b'\x10\x01\x81\x01\x00\x00\x00'
>> ( 1.710) [10 01 8101 020000] b'\x10\x01\x81\x01\x02\x00\x00'
# 0D - battery level. first byte is remaining charge in percent; second is
# (guessed) maximum?; third is charge status (30=discharging)
# "10 ix 0D 64 64 30 00" is a battery notification (when enabled)
<< ( 9.789) [10 01 810D 000000] b'\x10\x01\x81\r\x00\x00\x00'
>> ( 9.816) [10 01 810D 646430] b'\x10\x01\x81\rdd0'
# 63 - DPI (range 0x80-0x8e (inclusive))
<< ( 75.521) [10 01 8163 000000] b'\x10\x01\x81c\x00\x00\x00'
>> ( 75.550) [10 01 8163 890000] b'\x10\x01\x81c\x89\x00\x00'
# D0 - ?
<< ( 163.118) [10 01 81D0 000000] b'\x10\x01\x81\xd0\x00\x00\x00'
>> ( 163.148) [10 01 81D0 000000] b'\x10\x01\x81\xd0\x00\x00\x00'
# D4 - ?
<< ( 166.034) [10 01 81D4 000000] b'\x10\x01\x81\xd4\x00\x00\x00'
>> ( 166.063) [10 01 81D4 000008] b'\x10\x01\x81\xd4\x00\x00\x08'
# F1 - firmware/bootloader version
<< ( 187.172) [10 01 81F1 000000] b'\x10\x01\x81\xf1\x00\x00\x00'
>> ( 187.199) [10 01 8F81 F10300] b'\x10\x01\x8f\x81\xf1\x03\x00'
# F3 - ?
<< ( 188.629) [10 01 81F3 000000] b'\x10\x01\x81\xf3\x00\x00\x00'
>> ( 188.661) [10 01 81F3 000000] b'\x10\x01\x81\xf3\x00\x00\x00'
# FD - ?
<< ( 195.715) [10 01 83FD 000000] b'\x10\x01\x83\xfd\x00\x00\x00'
>> ( 195.746) [11 01 83FD 00000000000000000000000000000000] b'\x11\x01\x83\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

113
docs/devices/craft.txt Normal file
View File

@@ -0,0 +1,113 @@
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : E21FAD57
Firmware : 24.06.B0030
Bootloader : 01.08
Other : AA.AC
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=243, 2=173
1: Craft Advanced Keyboard
Codename : Craft
Kind : keyboard
Wireless PID : 4066
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 428C2F81
Bootloader: BOT 41.00.B0014
Firmware: MPK 07.01.B0015
Other:
Other:
The power switch is located on the edge of top right corner.
Supports 39 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: unknown:0007 {0007}
7: BATTERY STATUS {1000}
8: CHANGE HOST {1814}
9: unknown:1815 {1815}
10: unknown:1982 {1982}
11: REPROG CONTROLS V4 {1B04}
12: unknown:1C00 {1C00}
13: K375S FN INVERSION {40A3}
14: ENCRYPTION {4100}
15: LOCK KEY STATE {4220}
16: KEYBOARD DISABLE {4521}
17: unknown:4531 {4531}
18: unknown:4600 {4600}
19: unknown:00C2 {00C2}
20: unknown:1803 {1803} internal, hidden
21: unknown:1806 {1806} internal, hidden
22: unknown:1813 {1813} internal, hidden
23: unknown:1805 {1805} internal, hidden
24: unknown:1830 {1830} internal, hidden
25: unknown:1890 {1890} internal, hidden
26: unknown:1891 {1891} internal, hidden
27: unknown:1801 {1801} internal, hidden
28: unknown:18A1 {18A1} internal, hidden
29: unknown:9280 {9280} internal, hidden
30: unknown:1A20 {1A20} internal, hidden
31: unknown:1DF3 {1DF3} internal, hidden
32: unknown:1E00 {1E00} hidden
33: unknown:1EB0 {1EB0} internal, hidden
34: unknown:1861 {1861} internal, hidden
35: unknown:18B0 {18B0} internal, hidden
36: unknown:92C0 {92C0} internal, hidden
37: unknown:9203 {9203} internal, hidden
38: unknown:3615 {3615} internal, hidden
Has 24 reprogrammable keys:
0: unknown:00D1 , default: unknown:00AE => unknown:00D1
divertable, nonstandard, persistently divertable, pos:0, group:0, gmask:0
1: unknown:00D2 , default: unknown:00AF => unknown:00D2
divertable, nonstandard, persistently divertable, pos:0, group:0, gmask:0
2: unknown:00D3 , default: unknown:00B0 => unknown:00D3
divertable, nonstandard, persistently divertable, pos:0, group:0, gmask:0
3: unknown:00C7 , default: unknown:00A3 => unknown:00C7
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:1, group:0, gmask:0
4: unknown:00C8 , default: unknown:00A4 => unknown:00C8
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:2, group:0, gmask:0
5: unknown:00E0 , default: unknown:00BF => unknown:00E0
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:3, group:0, gmask:0
6: unknown:00E1 , default: unknown:00C0 => unknown:00E1
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:4, group:0, gmask:0
7: SHOW DESKTOP , default: ShowDesktop => SHOW DESKTOP
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:5, group:0, gmask:0
8: unknown:00E2 , default: unknown:00C1 => unknown:00E2
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:6, group:0, gmask:0
9: unknown:00E3 , default: unknown:00C2 => unknown:00E3
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:7, group:0, gmask:0
10: unknown:00E4 , default: Previous => unknown:00E4
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:8, group:0, gmask:0
11: unknown:00E5 , default: Play/Pause => unknown:00E5
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:9, group:0, gmask:0
12: unknown:00E6 , default: Next => unknown:00E6
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:10, group:0, gmask:0
13: unknown:00E7 , default: Mute => unknown:00E7
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:11, group:0, gmask:0
14: unknown:00E8 , default: Volume Down => unknown:00E8
divertable, is FN, FN sensitive, persistently divertable, reprogrammable, pos:12, group:0, gmask:0
15: unknown:00E9 , default: Volume Up => unknown:00E9
divertable, nonstandard, persistently divertable, reprogrammable, pos:0, group:0, gmask:0
16: Calculator , default: Calculator => Calculator
divertable, nonstandard, persistently divertable, reprogrammable, pos:0, group:0, gmask:0
17: unknown:00BF , default: unknown:009B => unknown:00BF
divertable, nonstandard, persistently divertable, reprogrammable, pos:0, group:0, gmask:0
18: unknown:00EA , default: unknown:00C3 => unknown:00EA
divertable, nonstandard, persistently divertable, reprogrammable, pos:0, group:0, gmask:0
19: Lock PC , default: WindowsLock => Lock PC
divertable, nonstandard, persistently divertable, reprogrammable, pos:0, group:0, gmask:0
20: unknown:00EC , default: unknown:00B8 => unknown:00EC
divertable, nonstandard, persistently divertable, pos:0, group:0, gmask:0
21: unknown:00EB , default: unknown:00B6 => unknown:00EB
divertable, nonstandard, persistently divertable, pos:0, group:0, gmask:0
22: unknown:00DE , default: Do Nothing One => unknown:00DE
is FN, pos:0, group:0, gmask:0
23: unknown:0034 , default: Do Nothing One => unknown:0034
nonstandard, pos:0, group:0, gmask:0
Battery: 0%, full.

120
docs/devices/ex100.txt Normal file
View File

@@ -0,0 +1,120 @@
./scan-registers.sh ff /dev/hidraw4
# Old notification flags: 000100
>> ( 0.035) [10 FF 8100 000100] '\x10\xff\x81\x00\x00\x01\x00'
<< ( 0.015) [10 FF 8101 000000] '\x10\xff\x81\x01\x00\x00\x00'
>> ( 0.020) [10 FF 8101 000200] '\x10\xff\x81\x01\x00\x02\x00'
<< ( 0.030) [10 FF 8102 000000] '\x10\xff\x81\x02\x00\x00\x00'
>> ( 0.036) [10 FF 8102 000200] '\x10\xff\x81\x02\x00\x02\x00'
--
<< ( 0.142) [10 FF 8109 000000] '\x10\xff\x81\t\x00\x00\x00'
>> ( 0.148) [10 FF 8109 010000] '\x10\xff\x81\t\x01\x00\x00'
--
<< ( 1.790) [10 FF 8170 000000] '\x10\xff\x81p\x00\x00\x00'
>> ( 1.796) [10 FF 8170 012100] '\x10\xff\x81p\x01!\x00'
<< ( 1.806) [10 FF 8171 000000] '\x10\xff\x81q\x00\x00\x00'
>> ( 1.812) [10 FF 8171 011200] '\x10\xff\x81q\x01\x12\x00'
--
<< ( 1.838) [10 FF 8173 000000] '\x10\xff\x81s\x00\x00\x00'
>> ( 1.844) [10 FF 8173 643F00] '\x10\xff\x81sd?\x00'
--
<< ( 2.046) [10 FF 8180 000000] '\x10\xff\x81\x80\x00\x00\x00'
>> ( 2.052) [10 FF 8180 030000] '\x10\xff\x81\x80\x03\x00\x00'
--
<< ( 3.326) [10 FF 81D0 000000] '\x10\xff\x81\xd0\x00\x00\x00'
>> ( 3.332) [10 FF 81D0 000000] '\x10\xff\x81\xd0\x00\x00\x00'
devices
01 mouse
Red button pressed
>> ( 1676.106) [10 01 0810 000000] '\x10\x01\x08\x10\x00\x00\x00'
>> ( 1676.114) [10 01 4600 000021] '\x10\x01F\x00\x00\x00!'
>> ( 1676.122) [10 FF 4600 211100] '\x10\xffF\x00!\x11\x00'
Power lewel?
?? Input: 10 01 81 07 00 00 00
<< ( 1739.032) [10 01 8107 000000] '\x10\x01\x81\x07\x00\x00\x00'
>> ( 1739.040) [10 01 8107 030000] '\x10\x01\x81\x07\x03\x00\x00'
[10 01 8107 070000] '\x10\x01\x81\x07\x07\x00\x00'
power change
>> ( 2441.563) [10 01 0703 000000] '\x10\x01\x07\x03\x00\x00\x00'
>> ( 100.159) [10 01 0707 000000] '\x10\x01\x07\x07\x00\x00\x00'
enable power event
<< ( 59.190) [10 01 8000 100000] '\x10\x01\x80\x00\x10\x00\x00'
>> ( 59.193) [10 01 8000 000000] '\x10\x01\x80\x00\x00\x00\x00'
03 keyboard
Power level?
?? Input: 10 03 81 07 00 00 00
<< ( 1777.961) [10 03 8107 000000] '\x10\x03\x81\x07\x00\x00\x00'
>> ( 1777.967) [10 03 8107 070000] '\x10\x03\x81\x07\x07\x00\x00'
power on
>> ( 1571.805) [10 03 0810 000000] '\x10\x03\x08\x10\x00\x00\x00'
>> ( 1574.709) [10 03 0800 000000] '\x10\x03\x08\x00\x00\x00\x00'
red button pressed
>> ( 1619.043) [10 03 0810 000000] '\x10\x03\x08\x10\x00\x00\x00'
>> ( 1619.051) [10 03 4600 000011] '\x10\x03F\x00\x00\x00\x11'
>> ( 1619.059) [10 FF 4600 221100] '\x10\xffF\x00"\x11\x00'
>> ( 1621.747) [10 03 0800 000000] '\x10\x03\x08\x00\x00\x00\x00'
Fn pressed
>> ( 1651.715) [10 03 032C 100000] '\x10\x03\x03,\x10\x00\x00'
>> ( 1652.170) [10 03 0300 000000] '\x10\x03\x03\x00\x00\x00\x00'
$ bin/solaar probe
Nano Receiver
Device path : /dev/hidraw3
USB id : 046d:c517
Serial : None
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless (0x000100)
Register Dump
Notification Register 0x00: 0x000100
Connection State 0x02: 0x000200
Device Activity 0xb3: None
Pairing Register 0xb5 0x00: None
Pairing Register 0xb5 0x10: None
Pairing Register 0xb5 0x20: None
Pairing Register 0xb5 0x30: None
Pairing Name 0xb5 0x40: None
Pairing Register 0xb5 0x01: None
Pairing Register 0xb5 0x11: None
Pairing Register 0xb5 0x21: None
Pairing Register 0xb5 0x31: None
Pairing Name 0xb5 0x41: None
Pairing Register 0xb5 0x02: None
Pairing Register 0xb5 0x12: None
Pairing Register 0xb5 0x22: None
Pairing Register 0xb5 0x32: None
Pairing Name 0xb5 0x42: None
Pairing Register 0xb5 0x03: None
Pairing Register 0xb5 0x13: None
Pairing Register 0xb5 0x23: None
Pairing Register 0xb5 0x33: None
Pairing Name 0xb5 0x43: None
Pairing Register 0xb5 0x04: None
Pairing Register 0xb5 0x14: None
Pairing Register 0xb5 0x24: None
Pairing Register 0xb5 0x34: None
Pairing Name 0xb5 0x44: None
Pairing Register 0xb5 0x05: None
Pairing Register 0xb5 0x15: None
Pairing Register 0xb5 0x25: None
Pairing Register 0xb5 0x35: None
Pairing Name 0xb5 0x45: None
Firmware 0xf1 0x00: None
Firmware 0xf1 0x01: None
Firmware 0xf1 0x02: None
Firmware 0xf1 0x03: None
Firmware 0xf1 0x04: None
Battery status:
1.9V critical
2.3V low
2.5V full

View File

@@ -0,0 +1,42 @@
Unifying Receiver
Device path : /dev/hidraw2
USB id : 046d:c52b
Serial : C03E9E2E
Firmware : 12.01.B0019
Bootloader : 02.14
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 2=118
2: Wireless Keyboard K270(unifying)
Codename : K270(unifying)
Kind : keyboard
Wireless PID : 4003
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: FE8C8542
Firmware: RQK 35.00.B0017
The power switch is located on the top case.
Supports 12 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: unknown:1820 {1820} hidden
6: REPROG CONTROLS {1B00}
7: WIRELESS DEVICE STATUS {1D4B}
8: unknown:1DF0 {1DF0} hidden
9: unknown:1DF3 {1DF3} hidden
10: ENCRYPTION {4100}
11: KEYBOARD LAYOUT {4520}
Has 8 reprogrammable keys:
0: Play/Pause => Play/Pause nonstandard
1: Mute => Mute nonstandard
2: Volume Down => Volume Down nonstandard
3: Volume Up => Volume Up nonstandard
4: MY HOME => HomePage nonstandard, reprogrammable
5: Mail => Email nonstandard, reprogrammable
6: SLEEP => Sleep nonstandard, reprogrammable
7: Calculator => Calculator nonstandard, reprogrammable
Battery: 90%, discharging.

93
docs/devices/k360.txt Normal file
View File

@@ -0,0 +1,93 @@
Receiver
LZ22175-DJ
LZ30965-DJ (another receiver)
M/N:C-U0007
(ltunify)
Serial number: 53B19204
Serial number: 82C3964B (another receiver)
Firmware version: 012.001.00019
Bootloader version: BL.002.014
(solaar-cli)
-: Unifying Receiver
Device path : /dev/hidraw2
Serial : 53B19204
Serial : 82C3964B (another receiver)
Firmware : 12.01.B0019
Bootloader : 02.14
Has 1 paired device(s) out of a maximum of 6
Enabled notifications: 0x000900 = wireless, software present.
Keyboard
K360
P/N: 820-003472
S/N: 1223CE0521E8
S/N: 1311CE0097D8 (another keyboard)
M/N: Y-R0017
(ltunify)
HID++ version: 2.0
Device index 1
Keyboard
Name: K360
Wireless Product ID: 4004
Serial number: 60BA944E
Device was unavailable, version information not available.
Total number of HID++ 2.0 features: 12
0: [0000] IRoot
1: [0001] IFeatureSet
2: [0003] IFirmwareInfo
3: [0005] GetDeviceNameType
4: [1000] batteryLevelStatus
5: [1820] H unknown
6: [1B00] SpecialKeysMSEButtons
7: [1D4B] WirelessDeviceStatus
8: [1DF0] H unknown
9: [1DF3] H unknown
10: [40A0] FnInversion
11: [4100] Encryption
12: [4520] KeyboardLayout
(O = obsolete feature; H = SW hidden feature)
(solaar-cli)
1: Wireless Keyboard K360
Codename : K360
Kind : keyboard
Protocol : HID++ 2.0
Polling rate : 20 ms
Wireless PID : 4004
Serial number: 60BA944E
Serial number: 0D2694C9 (another keyboard)
Firmware : RQK 36.00.B0007
The power switch is located on the top case
Supports 13 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: unknown:1820 {1820} hidden
6: REPROG CONTROLS {1B00}
7: WIRELESS DEVICE STATUS {1D4B}
8: unknown:1DF0 {1DF0} hidden
9: unknown:1DF3 {1DF3} hidden
10: FN INVERSION {40A0}
11: ENCRYPTION {4100}
12: KEYBOARD LAYOUT {4520}
Has 18 reprogrammable keys:
0: MY HOME => HomePage FN sensitive, is FN, reprogrammable
1: Mail => Mail FN sensitive, is FN, reprogrammable
2: SEARCH => Search FN sensitive, is FN, reprogrammable
3: MEDIA PLAYER => Music FN sensitive, is FN, reprogrammable
4: Application Switcher => Application Switcher FN sensitive, is FN, reprogrammable
5: SHOW DESKTOP => ShowDesktop FN sensitive, is FN, reprogrammable
6: MINIMIZE AS WIN M => WindowsMinimize FN sensitive, is FN, reprogrammable
7: MAXIMIZE AS WIN SHIFT M => WindowsRestore FN sensitive, is FN, reprogrammable
8: MY COMPUTER AS WIN E => My Computer FN sensitive, is FN, reprogrammable
9: Lock PC => WindowsLock FN sensitive, is FN, reprogrammable
10: SLEEP => Sleep FN sensitive, is FN, reprogrammable
11: Calculator => Calculator FN sensitive, is FN, reprogrammable
12: Previous => Previous nonstandard
13: Play/Pause => Play/Pause nonstandard
14: Next => Next nonstandard
15: Mute => Mute nonstandard
16: Volume Down => Volume Down nonstandard
17: Volume Up => Volume Up nonstandard
Battery is 90% charged, discharging

39
docs/devices/k750.txt Normal file
View File

@@ -0,0 +1,39 @@
(from Julien Danjou)
(solaar)
2: Wireless Solar Keyboard K750
Codename : K750
Kind : keyboard
Wireless PID : 4002
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: 5692B2EC
Firmware: RQK 33.00.B0015
Bootloader: DFU 00.02.B0003
The power switch is located on the edge of top right corner.
Supports 11 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: REPROG CONTROLS {1B00}
5: WIRELESS DEVICE STATUS {1D4B}
6: unknown:1DF3 {1DF3} hidden
7: FN INVERSION {40A0}
8: ENCRYPTION {4100}
9: SOLAR DASHBOARD {4301}
10: KEYBOARD LAYOUT {4520}
Has 12 reprogrammable keys:
0: MY HOME => HomePage FN sensitive, is FN, reprogrammable
1: Mail => Email FN sensitive, is FN, reprogrammable
2: SEARCH => Search FN sensitive, is FN, reprogrammable
3: Calculator => Calculator FN sensitive, is FN, reprogrammable
4: MEDIA PLAYER => Music FN sensitive, is FN, reprogrammable
5: Previous => Previous FN sensitive, is FN
6: Play/Pause => Play/Pause FN sensitive, is FN
7: Next => Next FN sensitive, is FN
8: Mute => Mute FN sensitive, is FN
9: Volume Down => Volume Down FN sensitive, is FN
10: Volume Up => Volume Up FN sensitive, is FN
11: SLEEP => Sleep FN sensitive, is FN, reprogrammable
Battery status unavailable.

44
docs/devices/k780.txt Normal file
View File

@@ -0,0 +1,44 @@
2: K780 Multi-Device Keyboard
Codename : K780
Kind : keyboard
Wireless PID : 405B
Protocol : HID++ 4.5
Polling rate : 20 ms (50Hz)
Serial number: 4D71FEE1
Bootloader: BOT 25.00.B0005
Firmware: MPK 01.00.B0018
Other:
The power switch is located on the edge of top right corner.
Supports 31 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: unknown:0007 {0007}
7: BATTERY STATUS {1000}
8: CHANGE HOST {1814}
9: unknown:1815 {1815}
10: REPROG CONTROLS V4 {1B04}
11: unknown:1C00 {1C00}
12: NEW FN INVERSION {40A2}
13: ENCRYPTION {4100}
14: KEYBOARD DISABLE {4521}
15: unknown:4531 {4531}
16: LOCK KEY STATE {4220}
17: unknown:00C2 {00C2}
18: unknown:1803 {1803} internal, hidden
19: unknown:1806 {1806} internal, hidden
20: unknown:1805 {1805} internal, hidden
21: unknown:1813 {1813} internal, hidden
22: unknown:1830 {1830} internal, hidden
23: unknown:1861 {1861} internal, hidden
24: unknown:1890 {1890} internal, hidden
25: unknown:1891 {1891} internal, hidden
26: unknown:18A1 {18A1} internal, hidden
27: unknown:1DF3 {1DF3} internal, hidden
28: unknown:1E00 {1E00} hidden
29: unknown:1EB0 {1EB0} internal, hidden
30: unknown:18B0 {18B0} internal, hidden
Battery: 90%, discharging.

557
docs/devices/k800-new.txt Normal file
View File

@@ -0,0 +1,557 @@
[kamil@kamil-pc Solaar]$ bin/solaar -dd show
16:01:46,533 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 030000]
16:01:46,539 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 03DC279AB20A06090000000000000000]
16:01:46,539 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 80B2 000000]
16:01:46,550 DEBUG [MainThread] logitech_receiver.base: (3) => r[20 01 4101 71401E0000000400000000]
16:01:46,551 DEBUG [MainThread] logitech_receiver.base: (3) => r[20 02 4101 6E401A4000000400000000]
16:01:46,551 DEBUG [MainThread] logitech_receiver.base: (3) => r[20 00 4102 0000000000000000000000]
16:01:46,551 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 8F80 B20300]
16:01:46,551 DEBUG [MainThread] logitech_receiver.base: (3) device 0xFF error on request {80B2}: 3 = invalid value
16:01:46,551 DEBUG [MainThread] solaar.cli: [/dev/hidraw0] => <UnifyingReceiver(/dev/hidraw0,3)>
16:01:46,646 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 8102 000000]
16:01:46,651 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 8102 000200]
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : DC279AB2
16:01:46,652 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 81F1 010000]
16:01:46,657 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 81F1 012411]
16:01:46,658 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 81F1 020000]
16:01:46,664 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 81F1 020036]
16:01:46,664 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 81F1 040000]
16:01:46,669 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 81F1 040209]
16:01:46,670 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 81F1 030000]
16:01:46,675 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 81F1 03AAAC]
Firmware : 24.11.B0036
Bootloader : 02.09
Other : AA.AC
Has 2 paired device(s) out of a maximum of 6.
16:01:46,676 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 8100 000000]
16:01:46,681 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 8100 000900]
Notifications: wireless, software present (0x000900)
16:01:46,682 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B3 000000]
16:01:46,687 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B3 51060000000000000000000000000000]
Device activity counters: 1=81, 2=6
16:01:46,688 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 8102 000000]
16:01:46,693 DEBUG [MainThread] logitech_receiver.base: (3) => r[10 FF 8102 000200]
16:01:46,694 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 200000]
16:01:46,699 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 20090840710402020700000000000000]
16:01:46,700 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 400000]
16:01:46,705 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 40094D58204D61737465720000000000]
16:01:46,706 INFO [MainThread] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,3)>: found new device 1 (4071)
16:01:46,706 DEBUG [MainThread] logitech_receiver.base: (3) pinging device 1
16:01:46,706 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 001E 000016]
16:01:47,033 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 00000000000000000000000000000000]
16:01:47,049 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 001E 04051600000000000000000000000000]
1: Wireless Mouse MX Master
Codename : MX Master
Kind : mouse
Wireless PID : 4071
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
16:01:47,049 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 300000]
16:01:47,055 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 30A6A400641E00000001000000000000]
Serial number: A6A40064
16:01:47,055 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 000100]
16:01:47,061 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 00000000000000000000000000000000]
16:01:47,077 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 01000100000000000000000000000000]
16:01:47,077 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0108 000000]
16:01:47,093 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000D 00000000000000000000000000000000]
16:01:47,101 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0108 1F000000000000000000000000000000]
16:01:47,101 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 000300]
16:01:47,109 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 00000000000000000000000000000000]
16:01:47,117 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 02000200000000000000000000000000]
16:01:47,117 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 020D 000000]
16:01:47,125 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 00000000000000000000000000000000]
16:01:47,133 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 020D 040382B4290006B01E40710000030000]
16:01:47,134 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 021E 000000]
16:01:47,141 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 00000000000000000000000000000000]
16:01:47,149 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 021E 01424F54561000050040717622661101]
16:01:47,150 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 021C 010000]
16:01:47,171 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 021C 004D504D1210000500B01E7622661101]
16:01:47,171 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 021E 020000]
16:01:47,191 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 021E 004D504D121000050140717622661101]
16:01:47,191 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 021F 030000]
16:01:47,213 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 021F 050000000000005A0000000000000000]
Bootloader: BOT 56.10.B0005
Firmware: MPM 12.10.B0005
Firmware: MPM 12.10.B0005
Other:
The power switch is located on the base.
Supports 32 HID++ 2.0 features:
16:01:47,214 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000B 000000]
16:01:47,311 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 00000100000000000000000000000000]
0: ROOT {0000}
16:01:47,312 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 000100]
16:01:47,333 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 01000100000000000000000000000000]
1: FEATURE SET {0001}
16:01:47,334 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000F 000300]
16:01:47,431 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 02000200000000000000000000000000]
2: DEVICE FW VERSION {0003}
16:01:47,431 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011C 030000]
16:01:47,453 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011C 00050000000000000000000000000000]
16:01:47,454 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000F 000500]
16:01:47,475 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 03000000000000000000000000000000]
3: DEVICE NAME {0005}
16:01:47,475 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 040000]
16:01:47,575 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 1D4B0000000000000000000000000000]
16:01:47,575 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000A 1D4B00]
16:01:47,593 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000A 04000000000000000000000000000000]
4: WIRELESS DEVICE STATUS {1D4B}
16:01:47,593 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011A 050000]
16:01:47,617 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011A 00200000000000000000000000000000]
16:01:47,617 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 002000]
16:01:47,715 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 05000000000000000000000000000000]
5: RESET {0020}
16:01:47,715 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011E 060000]
16:01:47,735 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011E 00210000000000000000000000000000]
16:01:47,735 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000B 002100]
16:01:47,755 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 06000000000000000000000000000000]
6: unknown:0021 {0021}
16:01:47,755 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011C 070000]
16:01:47,775 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011C 10000000000000000000000000000000]
16:01:47,775 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 100000]
16:01:47,795 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 07000000000000000000000000000000]
7: BATTERY STATUS {1000}
16:01:47,795 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011F 080000]
16:01:47,815 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011F 18066000000000000000000000000000]
16:01:47,815 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 180600]
16:01:47,835 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 08600000000000000000000000000000]
8: unknown:1806 {1806} internal, hidden
16:01:47,835 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 090000]
16:01:47,855 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 18140001000000000000000000000000]
16:01:47,855 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000A 181400]
16:01:47,875 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000A 09000100000000000000000000000000]
9: CHANGE HOST {1814}
16:01:47,875 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011A 0A0000]
16:01:47,895 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011A 1B040003000000000000000000000000]
16:01:47,895 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000A 1B0400]
16:01:47,915 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000A 0A000300000000000000000000000000]
10: REPROG CONTROLS V4 {1B04}
16:01:47,915 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011E 0B0000]
16:01:47,935 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011E 22010001000000000000000000000000]
16:01:47,935 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000E 220100]
16:01:47,957 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000E 0B000100000000000000000000000000]
11: ADJUSTABLE DPI {2201}
16:01:47,957 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011A 0C0000]
16:01:47,977 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011A 21000000000000000000000000000000]
16:01:47,977 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 210000]
16:01:47,997 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 0C000000000000000000000000000000]
12: VERTICAL SCROLLING {2100}
16:01:47,998 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0C0C 000000]
16:01:48,017 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0C0C 03180000000000000000000000000000]
Roller type: 3G
Ratchet per turn: 24
Scroll lines: 0
16:01:48,017 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011A 0D0000]
16:01:48,037 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011A 21100000000000000000000000000000]
16:01:48,037 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0008 211000]
16:01:48,057 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0008 0D000000000000000000000000000000]
13: SMART SHIFT {2110}
16:01:48,057 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011C 0E0000]
16:01:48,077 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011C 21210000000000000000000000000000]
16:01:48,077 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 212100]
16:01:48,097 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 0E000000000000000000000000000000]
14: HIRES WHEEL {2121}
16:01:48,097 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0E09 000000]
16:01:48,117 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0E09 080C0000000000000000000000000000]
16:01:48,117 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0E1D 000000]
16:01:48,137 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0E1D 02000000000000000000000000000000]
16:01:48,137 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0E38 000000]
16:01:48,159 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0E38 01000000000000000000000000000000]
Multiplier: 8
Has invert
Normal wheel motion
Has ratchet switch
Normal wheel mode
High resolution mode
HID notification
16:01:48,159 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011F 0F0000]
16:01:48,179 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011F 65010000000000000000000000000000]
16:01:48,179 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000A 650100]
16:01:48,199 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000A 0F000000000000000000000000000000]
15: GESTURE 2 {6501}
16:01:48,199 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 100000]
16:01:48,219 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 00C20000000000000000000000000000]
16:01:48,219 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 00C200]
16:01:48,239 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 10000000000000000000000000000000]
16: unknown:00C2 {00C2}
16:01:48,240 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011B 110000]
16:01:48,259 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011B 18136000000000000000000000000000]
16:01:48,259 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 181300]
16:01:48,279 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 11600000000000000000000000000000]
17: unknown:1813 {1813} internal, hidden
16:01:48,279 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011C 120000]
16:01:48,299 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011C 18306000000000000000000000000000]
16:01:48,299 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 183000]
16:01:48,319 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 12600000000000000000000000000000]
18: unknown:1830 {1830} internal, hidden
16:01:48,319 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011B 130000]
16:01:48,339 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011B 18906000000000000000000000000000]
16:01:48,339 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0008 189000]
16:01:48,359 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0008 13600000000000000000000000000000]
19: unknown:1890 {1890} internal, hidden
16:01:48,359 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011B 140000]
16:01:48,381 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011B 18916000000000000000000000000000]
16:01:48,381 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0008 189100]
16:01:48,401 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0008 14600000000000000000000000000000]
20: unknown:1891 {1891} internal, hidden
16:01:48,401 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011C 150000]
16:01:48,421 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011C 18A16000000000000000000000000000]
16:01:48,421 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000F 18A100]
16:01:48,441 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 15600000000000000000000000000000]
21: unknown:18A1 {18A1} internal, hidden
16:01:48,441 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011A 160000]
16:01:48,461 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011A 18C06000000000000000000000000000]
16:01:48,461 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0008 18C000]
16:01:48,481 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0008 16600000000000000000000000000000]
22: unknown:18C0 {18C0} internal, hidden
16:01:48,481 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011E 170000]
16:01:48,501 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011E 1DF36000000000000000000000000000]
16:01:48,501 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 1DF300]
16:01:48,521 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 17600000000000000000000000000000]
23: unknown:1DF3 {1DF3} internal, hidden
16:01:48,521 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011E 180000]
16:01:48,541 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011E 1E004000000000000000000000000000]
16:01:48,541 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 1E0000]
16:01:48,561 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 18400000000000000000000000000000]
24: unknown:1E00 {1E00} hidden
16:01:48,561 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 190000]
16:01:48,581 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 1EB06000000000000000000000000000]
16:01:48,581 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 1EB000]
16:01:48,603 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 19600000000000000000000000000000]
25: unknown:1EB0 {1EB0} internal, hidden
16:01:48,603 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011F 1A0000]
16:01:48,623 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011F 18036000000000000000000000000000]
16:01:48,623 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000F 180300]
16:01:48,643 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 1A600000000000000000000000000000]
26: unknown:1803 {1803} internal, hidden
16:01:48,643 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0118 1B0000]
16:01:48,663 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0118 18616000000000000000000000000000]
16:01:48,663 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0009 186100]
16:01:48,683 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0009 1B600000000000000000000000000000]
27: unknown:1861 {1861} internal, hidden
16:01:48,683 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0118 1C0000]
16:01:48,703 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0118 90016000000000000000000000000000]
16:01:48,703 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000F 900100]
16:01:48,723 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000F 1C600000000000000000000000000000]
28: unknown:9001 {9001} internal, hidden
16:01:48,723 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 1D0000]
16:01:48,743 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 92006000000000000000000000000000]
16:01:48,743 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000D 920000]
16:01:48,763 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000D 1D600000000000000000000000000000]
29: unknown:9200 {9200} internal, hidden
16:01:48,763 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 011F 1E0000]
16:01:48,783 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 011F 92026000000000000000000000000000]
16:01:48,783 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000C 920200]
16:01:48,805 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000C 1E600000000000000000000000000000]
30: unknown:9202 {9202} internal, hidden
16:01:48,805 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0119 1F0000]
16:01:48,825 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0119 18056000000000000000000000000000]
16:01:48,825 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 000B 180500]
16:01:48,845 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 000B 1F600000000000000000000000000000]
31: unknown:1805 {1805} internal, hidden
16:01:48,845 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A0A 000000]
16:01:48,865 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A0A 08000000000000000000000000000000]
Has 8 reprogrammable keys:
16:01:48,865 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1C 000000]
16:01:48,885 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1C 00500038010001010000000000000000]
16:01:48,885 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2B 005000]
16:01:48,905 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2B 00500000000000000000000000000000]
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, pos:0, group:1, gmask:1
16:01:48,905 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1D 010000]
16:01:48,925 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1D 00510039010001010000000000000000]
16:01:48,925 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A28 005100]
16:01:48,945 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A28 00510000000000000000000000000000]
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, pos:0, group:1, gmask:1
16:01:48,945 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1B 020000]
16:01:48,965 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1B 0052003A310003070100000000000000]
16:01:48,965 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2B 005200]
16:01:48,985 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2B 00520000000000000000000000000000]
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
16:01:48,985 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1E 030000]
16:01:49,005 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1E 0053003C310002030100000000000000]
16:01:49,006 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A28 005300]
16:01:49,027 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A28 00530000000000000000000000000000]
3: BACK AS BUTTON 4 , default: BackEx => BACK AS BUTTON 4
mse, reprogrammable, divertable, pos:0, group:2, gmask:3
16:01:49,027 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1B 040000]
16:01:49,047 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1B 0056003E310002030100000000000000]
16:01:49,047 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2F 005600]
16:01:49,067 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2F 00560000000000000000000000000000]
4: FORWARD AS BUTTON 5 , default: BrowserForwardEx => FORWARD AS BUTTON 5
mse, reprogrammable, divertable, pos:0, group:2, gmask:3
16:01:49,067 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1C 050000]
16:01:49,087 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1C 00C300A9310003070100000000000000]
16:01:49,087 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2A 00C300]
16:01:49,107 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2A 00C30000000000000000000000000000]
5: unknown:00C3 , default: unknown:00A9 => unknown:00C3
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
16:01:49,107 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1A 060000]
16:01:49,127 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1A 00C4009D310003070100000000000000]
16:01:49,127 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2C 00C400]
16:01:49,147 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2C 00C40000000000000000000000000000]
6: unknown:00C4 , default: unknown:009D => unknown:00C4
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
16:01:49,147 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A1C 070000]
16:01:49,167 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A1C 00D700B4A00004000300000000000000]
16:01:49,167 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 0A2C 00D700]
16:01:49,187 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 0A2C 00D70000000000000000000000000000]
7: unknown:00D7 , default: unknown:00B4 => unknown:00D7
divertable, virtual, pos:0, group:4, gmask:0
16:01:49,187 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 01 070B 000000]
16:01:49,207 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 01 070B 32140000000000000000000000000000]
16:01:49,207 DEBUG [MainThread] logitech_receiver.hidpp20: device 1 battery 50% charged, next level 20% charge, status 0 = discharging
Battery: 50%, discharging.
16:01:49,207 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 210000]
16:01:49,213 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 210814406E0402010700000000000000]
16:01:49,213 INFO [MainThread] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,3)>: found new device 2 (406E)
16:01:49,213 DEBUG [MainThread] logitech_receiver.base: (3) pinging device 2
16:01:49,213 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 001F 0000F4]
16:01:49,245 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 001F 0405F400000000000000000000000000]
2: Wireless Illuminated Keyboard K800 new
Codename : new
Kind : keyboard
Wireless PID : 406E
Protocol : HID++ 4.5
Polling rate : 20 ms (50Hz)
16:01:49,245 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 FF 83B5 310000]
16:01:49,251 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 FF 83B5 31636E14131A40000007000000000000]
Serial number: 636E1413
16:01:49,251 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000A 000100]
16:01:49,285 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000A 01000100000000000000000000000000]
16:01:49,285 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 010B 000000]
16:01:49,325 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 010B 18000000000000000000000000000000]
16:01:49,325 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0009 000300]
16:01:49,365 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0009 02000200000000000000000000000000]
16:01:49,365 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 020C 000000]
16:01:49,405 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 020C 0254FC62F90004406E00000000010000]
16:01:49,405 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 021E 000000]
16:01:49,446 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 021E 01424F546000000200406ED4E7454501]
16:01:49,446 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 021C 010000]
16:01:49,487 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 021C 0052514B6801000901406ED4E7454501]
Bootloader: BOT 60.00.B0002
Firmware: RQK 68.01.B0009
The power switch is located on the top right corner.
Supports 25 HID++ 2.0 features:
16:01:49,487 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 000000]
16:01:49,527 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 00000100000000000000000000000000]
0: ROOT {0000}
16:01:49,527 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 000100]
16:01:49,567 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 01000100000000000000000000000000]
1: FEATURE SET {0001}
16:01:49,568 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000C 000300]
16:01:49,607 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000C 02000200000000000000000000000000]
2: DEVICE FW VERSION {0003}
16:01:49,607 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011A 030000]
16:01:49,647 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011A 00050000000000000000000000000000]
16:01:49,647 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000D 000500]
16:01:49,687 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000D 03000000000000000000000000000000]
3: DEVICE NAME {0005}
16:01:49,687 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011C 040000]
16:01:49,729 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011C 1D4B0000000000000000000000000000]
16:01:49,729 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000D 1D4B00]
16:01:49,770 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000D 04000000000000000000000000000000]
4: WIRELESS DEVICE STATUS {1D4B}
16:01:49,770 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0119 050000]
16:01:49,809 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0119 00200000000000000000000000000000]
16:01:49,809 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000D 002000]
16:01:49,849 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000D 05000000000000000000000000000000]
5: RESET {0020}
16:01:49,849 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 060000]
16:01:49,889 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 10000000000000000000000000000000]
16:01:49,889 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0009 100000]
16:01:49,929 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0009 06000000000000000000000000000000]
6: BATTERY STATUS {1000}
16:01:49,929 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011D 070000]
16:01:49,969 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011D 19830000000000000000000000000000]
16:01:49,969 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000B 198300]
16:01:50,009 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000B 07000000000000000000000000000000]
7: unknown:1983 {1983}
16:01:50,010 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011F 080000]
16:01:50,051 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011F 1B040003000000000000000000000000]
16:01:50,051 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000E 1B0400]
16:01:50,091 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000E 08000300000000000000000000000000]
8: REPROG CONTROLS V4 {1B04}
16:01:50,091 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0119 090000]
16:01:50,131 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0119 40A00000000000000000000000000000]
16:01:50,131 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0009 40A000]
16:01:50,171 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0009 09000000000000000000000000000000]
9: FN INVERSION {40A0}
16:01:50,171 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011C 0A0000]
16:01:50,211 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011C 41000000000000000000000000000000]
16:01:50,211 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000A 410000]
16:01:50,251 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000A 0A000000000000000000000000000000]
10: ENCRYPTION {4100}
16:01:50,251 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 0B0000]
16:01:50,293 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 45210000000000000000000000000000]
16:01:50,293 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 452100]
16:01:50,333 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 0B000000000000000000000000000000]
11: KEYBOARD DISABLE {4521}
16:01:50,334 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011E 0C0000]
16:01:50,373 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011E 00C20000000000000000000000000000]
16:01:50,373 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 00C200]
16:01:50,413 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 0C000000000000000000000000000000]
12: unknown:00C2 {00C2}
16:01:50,414 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 0D0000]
16:01:50,453 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 18036000000000000000000000000000]
16:01:50,454 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0008 180300]
16:01:50,493 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0008 0D600000000000000000000000000000]
13: unknown:1803 {1803} internal, hidden
16:01:50,494 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011D 0E0000]
16:01:50,533 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011D 18066001000000000000000000000000]
16:01:50,533 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000C 180600]
16:01:50,575 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000C 0E600100000000000000000000000000]
14: unknown:1806 {1806} internal, hidden
16:01:50,576 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011A 0F0000]
16:01:50,615 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011A 18116000000000000000000000000000]
16:01:50,615 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0008 181100]
16:01:50,655 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0008 0F600000000000000000000000000000]
15: unknown:1811 {1811} internal, hidden
16:01:50,656 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011B 100000]
16:01:50,695 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011B 18306000000000000000000000000000]
16:01:50,696 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 183000]
16:01:50,735 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 10600000000000000000000000000000]
16: unknown:1830 {1830} internal, hidden
16:01:50,736 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0119 110000]
16:01:50,775 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0119 18906000000000000000000000000000]
16:01:50,776 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000A 189000]
16:01:50,815 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000A 11600000000000000000000000000000]
17: unknown:1890 {1890} internal, hidden
16:01:50,816 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 120000]
16:01:50,858 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 18A16000000000000000000000000000]
16:01:50,858 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 18A100]
16:01:50,897 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 12600000000000000000000000000000]
18: unknown:18A1 {18A1} internal, hidden
16:01:50,898 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 130000]
16:01:50,937 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 1DF36000000000000000000000000000]
16:01:50,938 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000B 1DF300]
16:01:50,977 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000B 13600000000000000000000000000000]
19: unknown:1DF3 {1DF3} internal, hidden
16:01:50,978 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011B 140000]
16:01:51,017 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011B 1E004000000000000000000000000000]
16:01:51,018 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000E 1E0000]
16:01:51,057 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000E 14400000000000000000000000000000]
20: unknown:1E00 {1E00} hidden
16:01:51,058 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011B 150000]
16:01:51,097 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011B 1EB06000000000000000000000000000]
16:01:51,098 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000F 1EB000]
16:01:51,137 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000F 15600000000000000000000000000000]
21: unknown:1EB0 {1EB0} internal, hidden
16:01:51,138 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011D 160000]
16:01:51,179 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011D 18616000000000000000000000000000]
16:01:51,180 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000E 186100]
16:01:51,220 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000E 16600000000000000000000000000000]
22: unknown:1861 {1861} internal, hidden
16:01:51,220 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 011D 170000]
16:01:51,260 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 011D 1A206000000000000000000000000000]
16:01:51,260 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0008 1A2000]
16:01:51,300 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0008 17600000000000000000000000000000]
23: unknown:1A20 {1A20} internal, hidden
16:01:51,300 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0118 180000]
16:01:51,339 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0118 18B06000000000000000000000000000]
16:01:51,340 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 000E 18B000]
16:01:51,379 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 000E 18600000000000000000000000000000]
24: unknown:18B0 {18B0} internal, hidden
16:01:51,380 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 080E 000000]
16:01:51,419 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 080E 0F000000000000000000000000000000]
Has 15 reprogrammable keys:
16:01:51,420 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081C 000000]
16:01:51,461 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081C 0022001A3A0100000000000000000000]
16:01:51,462 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082F 002200]
16:01:51,501 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082F 00220000000000000000000000000000]
0: MY HOME , default: HomePage => MY HOME
is FN, FN sensitive, reprogrammable, divertable, pos:1, group:0, gmask:0
16:01:51,502 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0819 010000]
16:01:51,541 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0819 000E000E3A0200000000000000000000]
16:01:51,542 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0829 000E00]
16:01:51,581 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0829 000E0000000000000000000000000000]
1: Mail , default: Email => Mail
is FN, FN sensitive, reprogrammable, divertable, pos:2, group:0, gmask:0
16:01:51,582 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0818 020000]
16:01:51,621 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0818 003E002D3A0300000000000000000000]
16:01:51,622 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0828 003E00]
16:01:51,661 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0828 003E0000000000000000000000000000]
2: SEARCH , default: SearchForFiles => SEARCH
is FN, FN sensitive, reprogrammable, divertable, pos:3, group:0, gmask:0
16:01:51,662 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081B 030000]
16:01:51,701 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081B 000800083A0400000000000000000000]
16:01:51,702 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082E 000800]
16:01:51,743 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082E 00080000000000000000000000000000]
3: Application Switcher , default: Application Switcher => Application Switcher
is FN, FN sensitive, reprogrammable, divertable, pos:4, group:0, gmask:0
16:01:51,744 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081D 040000]
16:01:51,784 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081D 00E200C12A0500000000000000000000]
16:01:51,784 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082E 00E200]
16:01:51,824 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082E 00E20000000000000000000000000000]
4: unknown:00E2 , default: unknown:00C1 => unknown:00E2
is FN, FN sensitive, divertable, pos:5, group:0, gmask:0
16:01:51,824 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081A 050000]
16:01:51,864 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081A 00E300C22A0600000000000000000000]
16:01:51,864 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082B 00E300]
16:01:51,904 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082B 00E30000000000000000000000000000]
5: unknown:00E3 , default: unknown:00C2 => unknown:00E3
is FN, FN sensitive, divertable, pos:6, group:0, gmask:0
16:01:51,904 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0818 060000]
16:01:51,943 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0818 0040002F3A0800000000000000000000]
16:01:51,944 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082E 004000]
16:01:51,984 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082E 00400000000000000000000000000000]
6: SLEEP , default: Sleep => SLEEP
is FN, FN sensitive, reprogrammable, divertable, pos:8, group:0, gmask:0
16:01:51,984 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081D 070000]
16:01:52,025 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081D 0028001D3A0900000000000000000000]
16:01:52,026 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0828 002800]
16:01:52,065 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0828 00280000000000000000000000000000]
7: MEDIA PLAYER , default: Music => MEDIA PLAYER
is FN, FN sensitive, reprogrammable, divertable, pos:9, group:0, gmask:0
16:01:52,066 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081F 080000]
16:01:52,106 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081F 000600062A0A00000000000000000000]
16:01:52,106 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0828 000600]
16:01:52,145 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0828 00060000000000000000000000000000]
8: Previous , default: Previous => Previous
is FN, FN sensitive, divertable, pos:10, group:0, gmask:0
16:01:52,146 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081F 090000]
16:01:52,186 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081F 000400042A0B00000000000000000000]
16:01:52,186 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082B 000400]
16:01:52,225 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082B 00040000000000000000000000000000]
9: Play/Pause , default: Play/Pause => Play/Pause
is FN, FN sensitive, divertable, pos:11, group:0, gmask:0
16:01:52,226 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081B 0A0000]
16:01:52,265 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081B 000500052A0C00000000000000000000]
16:01:52,266 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0829 000500]
16:01:52,308 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0829 00050000000000000000000000000000]
10: Next , default: Next => Next
is FN, FN sensitive, divertable, pos:12, group:0, gmask:0
16:01:52,308 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0818 0B0000]
16:01:52,348 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0818 00010001240000000000000000000000]
16:01:52,348 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082C 000100]
16:01:52,387 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082C 00010000000000000000000000000000]
11: Volume Up , default: Volume Up => Volume Up
nonstandard, divertable, pos:0, group:0, gmask:0
16:01:52,388 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081C 0C0000]
16:01:52,427 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081C 00020002240000000000000000000000]
16:01:52,428 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082C 000200]
16:01:52,468 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082C 00020000000000000000000000000000]
12: Volume Down , default: Volume Down => Volume Down
nonstandard, divertable, pos:0, group:0, gmask:0
16:01:52,468 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 0819 0D0000]
16:01:52,507 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 0819 00030003240000000000000000000000]
16:01:52,508 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082D 000300]
16:01:52,547 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082D 00030000000000000000000000000000]
13: Mute , default: Mute => Mute
nonstandard, divertable, pos:0, group:0, gmask:0
16:01:52,548 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 081B 0E0000]
16:01:52,589 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 081B 000A000A340000000000000000000000]
16:01:52,590 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 082F 000A00]
16:01:52,630 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 082F 000A0000000000000000000000000000]
14: Calculator , default: Calculator => Calculator
nonstandard, reprogrammable, divertable, pos:0, group:0, gmask:0
16:01:52,630 DEBUG [MainThread] logitech_receiver.base: (3) <= w[10 02 060C 000000]
16:01:52,670 DEBUG [MainThread] logitech_receiver.base: (3) => r[11 02 060C 32140000000000000000000000000000]
16:01:52,670 DEBUG [MainThread] logitech_receiver.hidpp20: device 2 battery 50% charged, next level 20% charge, status 0 = discharging
Battery: 50%, discharging.

52
docs/devices/k800.txt Normal file
View File

@@ -0,0 +1,52 @@
# 0x00 - Enabled Notifications. rw (see HID++ 1.0 spec)
<< ( 0.055) [10 02 8100 000000] '\x10\x02\x81\x00\x00\x00\x00'
>> ( 0.084) [10 02 8100 000000] '\x10\x02\x81\x00\x00\x00\x00'
# 0x01 - Keyboard hand detection. rw, last param is 00 when hand detection is
# enabled, 30 when disabled. (when enabled, keyboard will light up if not
# already when hovering over the front)
<< ( 1.085) [10 02 8101 000000] '\x10\x02\x81\x01\x00\x00\x00'
>> ( 1.114) [10 02 8101 000000] '\x10\x02\x81\x01\x00\x00\x00'
# 0x07 - Battery status (3 = one bar; 1 = red/critical; 5=two bars; 7=three
# bars/full. Second returned param is 25 when keyboard is charging )
<< ( 7.327) [10 02 8107 000000] '\x10\x02\x81\x07\x00\x00\x00'
>> ( 7.368) [10 02 8107 030000] '\x10\x02\x81\x07\x03\x00\x00'
# 0x09 - F key function. rw (read: status, set/get: 00 01 00 means swap
# functions, 00 00 00 means do not swap functions)
<< ( 9.411) [10 02 8109 000000] '\x10\x02\x81\t\x00\x00\x00'
>> ( 9.440) [10 02 8109 000000] '\x10\x02\x81\t\x00\x00\x00'
# 0x17 - Illumination info r/w. Last param: 02 to disable backlight, 01 to
# enable backlight
<< ( 24.965) [10 02 8117 000000] '\x10\x02\x81\x17\x00\x00\x00'
>> ( 24.988) [10 02 8117 3C0001] '\x10\x02\x81\x17<\x00\x01'
# 0x51 - ?
<< ( 99.294) [10 02 8151 000000] '\x10\x02\x81Q\x00\x00\x00'
>> ( 99.543) [10 02 8151 000000] '\x10\x02\x81Q\x00\x00\x00'
# 0x54 - ?
<< ( 103.046) [10 02 8154 000000] '\x10\x02\x81T\x00\x00\x00'
>> ( 103.295) [10 02 8154 FF0000] '\x10\x02\x81T\xff\x00\x00'
# 0xD0 - ?
<< ( 253.860) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
>> ( 253.883) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
# 0xF1 - Version info (params 0n 00 00 where n is 1..4)
<< ( 289.991) [10 02 81F1 000000] '\x10\x02\x81\xf1\x00\x00\x00'
>> ( 290.032) [10 02 8F81 F10300] '\x10\x02\x8f\x81\xf1\x03\x00'
# 0xF3 - ?
<< ( 292.075) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'
>> ( 292.116) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'
# 0x0F - This changes, the last commented line was observed in an earlier run
<< ( 17.728) [10 02 830F 000000] '\x10\x02\x83\x0f\x00\x00\x00'
>> ( 17.976) [11 02 830F FFFB00000240025C000000000FF90080] '\x11\x02\x83\x0f\xff\xfb\x00\x00\x02@\x02\\\x00\x00\x00\x00\x0f\xf9\x00\x80'
#>> ( 17.999) [11 02 830F FFFC007F0243025D000000000FF60080] '\x11\x02\x83\x0f\xff\xfc\x00\x7f\x02C\x02]\x00\x00\x00\x00\x0f\xf6\x00\x80'
# See also https://git.lekensteyn.nl/ltunify/tree/registers.txt for a verbose
# meaning of registers and params.

41
docs/devices/k830.txt Normal file
View File

@@ -0,0 +1,41 @@
# Provided by Mikkel Munch Mortensen
(solaar)
3: Illuminated Living-Room Keyboard K830
Codename : K830
Kind : keyboard
Wireless PID : 4032
Protocol : HID++ 4.1
Polling rate : 8 ms (125Hz)
Serial number: 9F7C6FD7
Firmware: RQK 56.00.B0020
The power switch is located on the edge of top right corner.
Supports 27 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: unknown:0020 {0020}
6: BATTERY STATUS {1000}
7: BACKLIGHT {1981}
8: unknown:1B04 {1B04}
9: unknown:2005 {2005}
10: NEW FN INVERSION {40A2}
11: ENCRYPTION {4100}
12: unknown:4521 {4521}
13: TOUCHPAD RAW XY {6100} hidden
14: unknown:6501 {6501}
15: unknown:00C1 {00C1}
16: unknown:1811 {1811} internal, hidden
17: unknown:1830 {1830} internal, hidden
18: unknown:1890 {1890} internal, hidden
19: unknown:18A0 {18A0} internal, hidden
20: unknown:1DF3 {1DF3} internal, hidden
21: unknown:1E00 {1E00} hidden
22: unknown:1EB0 {1EB0} internal, hidden
23: unknown:1861 {1861} internal, hidden
24: unknown:1A20 {1A20} internal, hidden
25: unknown:18B0 {18B0} internal, hidden
26: unknown:1F07 {1F07} internal, hidden
Battery: 50%, discharging.

48
docs/devices/m185_new.txt Normal file
View File

@@ -0,0 +1,48 @@
P/N: 810-005238
Unifying Receiver
Device path : /dev/hidraw3
USB id : 046d:c534
Serial : 0
Firmware : 29.01.B0016
Has 1 paired device(s) out of a maximum of 6.
Notifications: (none)
2: Wireless Mouse M185
Codename : M185
Kind : mouse
Wireless PID : 4054
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 1377ED51
Firmware: RQM 64.00.B0008
The power switch is located on the base.
Supports 20 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: RESET {0020}
5: REPROG CONTROLS V4 {1B04}
6: WIRELESS DEVICE STATUS {1D4B}
7: LOWRES WHEEL {2130}
8: POINTER SPEED {2205}
9: unknown:1802 {1802} internal, hidden
10: unknown:1810 {1810} internal, hidden
11: unknown:1830 {1830} internal, hidden
12: unknown:1850 {1850} internal, hidden
13: unknown:1869 {1869} internal, hidden
14: unknown:1890 {1890} internal, hidden
15: unknown:18B1 {18B1} internal, hidden
16: unknown:1DF3 {1DF3} internal, hidden
17: unknown:1E00 {1E00} hidden
18: unknown:1F03 {1F03} internal, hidden
19: unknown:1E80 {1E80} internal, hidden
Has 3 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
Battery status unavailable.

50
docs/devices/m185_old.txt Normal file
View File

@@ -0,0 +1,50 @@
P/N: 810-003496
Unifying Receiver
Device path : /dev/hidraw3
USB id : 046d:c52f
Serial : 6D0342C5
Firmware : 30.00.B0009
Has 1 paired device(s) out of a maximum of 1.
Notifications: (none)
1: Wireless Mouse
Codename : Wireless Mouse
Kind : mouse
Wireless PID : 4055
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 6D0342C5
Firmware: RQM 65.00.B0003
The power switch is located on the base.
Supports 22 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: RESET {0020}
5: BATTERY STATUS {1000}
6: unknown:1810 {1810} internal, hidden
7: unknown:1830 {1830} internal, hidden
8: unknown:1802 {1802} internal, hidden
9: unknown:1862 {1862} internal, hidden
10: unknown:1890 {1890} internal, hidden
11: unknown:18A0 {18A0} internal, hidden
12: unknown:18B1 {18B1} internal, hidden
13: REPROG CONTROLS V4 {1B04}
14: WIRELESS DEVICE STATUS {1D4B}
15: unknown:1DF0 {1DF0} hidden
16: unknown:1DF3 {1DF3} internal, hidden
17: unknown:1E00 {1E00} hidden
18: unknown:1EB0 {1EB0} internal, hidden
19: unknown:1F03 {1F03} internal, hidden
20: LOWRES WHEEL {2130}
21: POINTER SPEED {2205}
Has 3 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
Battery: 5%, discharging.

40
docs/devices/m235.txt Normal file
View File

@@ -0,0 +1,40 @@
Wireless Mouse M235
Codename : M235
Kind : mouse
Wireless PID : 4055
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 00000000
Firmware: RQM 65.00.B0003
The power switch is located on the base.
Supports 22 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: RESET {0020}
5: BATTERY STATUS {1000}
6: unknown:1810 {1810} internal, hidden
7: unknown:1830 {1830} internal, hidden
8: unknown:1802 {1802} internal, hidden
9: unknown:1862 {1862} internal, hidden
10: unknown:1890 {1890} internal, hidden
11: unknown:18A0 {18A0} internal, hidden
12: unknown:18B1 {18B1} internal, hidden
13: REPROG CONTROLS V4 {1B04}
14: WIRELESS DEVICE STATUS {1D4B}
15: unknown:1DF0 {1DF0} hidden
16: unknown:1DF3 {1DF3} internal, hidden
17: unknown:1E00 {1E00} hidden
18: unknown:1EB0 {1EB0} internal, hidden
19: unknown:1F03 {1F03} internal, hidden
20: LOWRES WHEEL {2130}
21: POINTER SPEED {2205}
Has 3 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
divertable, mse, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
divertable, mse, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
Battery: 70%, discharging.

29
docs/devices/m325.txt Normal file
View File

@@ -0,0 +1,29 @@
Wireless Mouse M325
Codename : M325
Kind : mouse
Wireless PID : 400A
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: ABB05E01
Firmware: RQM 27.02.B0028
The power switch is located on the base.
Supports 13 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: WIRELESS DEVICE STATUS {1D4B}
6: unknown:1DF3 {1DF3} hidden
7: REPROG CONTROLS {1B00}
8: unknown:1DF0 {1DF0} hidden
9: unknown:1F03 {1F03} hidden
10: VERTICAL SCROLLING {2100}
11: HI RES SCROLLING {2120}
12: MOUSE POINTER {2200}
Has 5 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
3: BACK AS BUTTON 4 => Back mse, reprogrammable
4: FORWARD AS BUTTON 5 => BrowserForward mse, reprogrammable

56
docs/devices/m345.txt Normal file
View File

@@ -0,0 +1,56 @@
Receiver
LZ141AX-DJ
M/N: C-U0008
(ltunify)
Serial number: 574197D3
Firmware version: 024.000.00018
Bootloader version: BL.000.006
Mouse
HID++ version: 2.0
Device index 1
Mouse
Name: M345
Wireless Product ID: 4017
Serial number: 920DC223
Device was unavailable, version information not available.
Total number of HID++ 2.0 features: 12
0: [0000] IRoot
1: [0001] IFeatureSet
2: [0003] IFirmwareInfo
3: [0005] GetDeviceNameType
4: [1000] batteryLevelStatus
5: [1D4B] WirelessDeviceStatus
6: [1DF3] H unknown
7: [1B00] SpecialKeysMSEButtons
8: [1DF0] H unknown
9: [1F03] H unknown
10: [2100] VerticalScrolling
11: [2120] HiResScrolling
12: [2200] MousePointer
(O = obsolete feature; H = SW hidden feature)
(solaar-cli)
1: Wireless Mouse M345
Codename : M345
Kind : mouse
Wireless PID : 4017
Protocol : HID++ 2.0
Polling rate : 8 ms
Serial number: 920DC223
Firmware: RQM 27.02.B0028
The power switch is located on the base.
Supports 13 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: WIRELESS DEVICE STATUS {1D4B}
6: unknown:1DF3 {1DF3} hidden
7: REPROG CONTROLS {1B00}
8: unknown:1DF0 {1DF0} hidden
9: unknown:1F03 {1F03} hidden
10: VERTICAL SCROLLING {2100}
11: HI RES SCROLLING {2120}
12: MOUSE POINTER {2200}
Battery: 90%, discharging,

35
docs/devices/m510.txt Normal file
View File

@@ -0,0 +1,35 @@
# notification flags
<< ( 0.001) [10 01 8100 000000] '\x10\x01\x81\x00\x00\x00\x00'
>> ( 0.062) [10 01 8100 000000] '\x10\x01\x81\x00\x00\x00\x00'
# smooth scroll
<< ( 1.063) [10 01 8101 000000] '\x10\x01\x81\x01\x00\x00\x00'
>> ( 1.078) [10 01 8101 820000] '\x10\x01\x81\x01\x82\x00\x00'
# ?
<< ( 2.079) [10 01 8102 000000] '\x10\x01\x81\x02\x00\x00\x00'
>> ( 2.094) [10 01 8102 000080] '\x10\x01\x81\x02\x00\x00\x80'
# battery status
<< ( 7.263) [10 01 8107 000000] '\x10\x01\x81\x07\x00\x00\x00'
>> ( 7.278) [10 01 8107 050000] '\x10\x01\x81\x07\x05\x00\x00'
# ?
<< ( 41.121) [10 01 8128 000000] '\x10\x01\x81(\x00\x00\x00'
>> ( 41.136) [10 01 8128 000200] '\x10\x01\x81(\x00\x02\x00'
# ?
<< ( 215.788) [10 01 81D0 000000] '\x10\x01\x81\xd0\x00\x00\x00'
>> ( 215.802) [10 01 81D0 000000] '\x10\x01\x81\xd0\x00\x00\x00'
# read-only, 01-04 firmware info
<< ( 250.779) [10 01 81F1 000000] '\x10\x01\x81\xf1\x00\x00\x00'
>> ( 250.794) [10 01 8F81 F10300] '\x10\x01\x8f\x81\xf1\x03\x00'
# ?
<< ( 252.809) [10 01 81F3 000000] '\x10\x01\x81\xf3\x00\x00\x00'
>> ( 252.824) [10 01 81F3 000000] '\x10\x01\x81\xf3\x00\x00\x00'
# ?
<< ( 253.825) [10 01 81F4 000000] '\x10\x01\x81\xf4\x00\x00\x00'
>> ( 253.838) [10 01 81F4 800000] '\x10\x01\x81\xf4\x80\x00\x00'

34
docs/devices/m515.txt Normal file
View File

@@ -0,0 +1,34 @@
1: Couch Mouse M515
Codename : M515
Kind : mouse
Wireless PID : 4007
Protocol : HID++ 2.0
Polling rate : 8 ms
Serial number: BED587E9
Firmware: RQM 24.00.B0023
Bootloader: DFU 00.02.B0010
The power switch is located on the base.
Supports 16 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: DFUCONTROL {00C0}
5: BATTERY STATUS {1000}
6: unknown:1A30 {1A30} hidden
7: REPROG CONTROLS {1B00}
8: WIRELESS DEVICE STATUS {1D4B}
9: unknown:1DF3 {1DF3} hidden
10: VERTICAL SCROLLING {2100}
11: HI RES SCROLLING {2120}
12: MOUSE POINTER {2200}
13: unknown:1F02 {1F02} hidden
14: unknown:1F03 {1F03} hidden
15: unknown:1E80 {1E80} hidden
Has 5 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
3: BACK AS BUTTON 4 => BackEx mse, reprogrammable
4: FORWARD AS BUTTON 5 => BrowserForwardEx mse, reprogrammable
Battery: 65%, discharging,

56
docs/devices/m525.txt Normal file
View File

@@ -0,0 +1,56 @@
Mouse
(ltunify)
HID++ version: 2.0
Device index 1
Mouse
Name: M525
Wireless Product ID: 4013
Serial number: DAFA335E
Device was unavailable, version information not available.
Total number of HID++ 2.0 features: 12
0: [0000] IRoot
1: [0001] IFeatureSet
2: [0003] IFirmwareInfo
3: [0005] GetDeviceNameType
4: [1000] batteryLevelStatus
5: [1D4B] WirelessDeviceStatus
6: [1DF3] H unknown
7: [1B00] SpecialKeysMSEButtons
8: [1DF0] H unknown
9: [1F03] H unknown
10: [2100] VerticalScrolling
11: [2120] HiResScrolling
12: [2200] MousePointer
(O = obsolete feature; H = SW hidden feature;
I = reserved for internal use)
(solaar)
1: Wireless Mouse M525
Codename : M525
Kind : mouse
Wireless PID : 4013
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: DAFA335E
Firmware: RQM 27.02.B0028
The power switch is located on the base.
Supports 13 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: WIRELESS DEVICE STATUS {1D4B}
6: unknown:1DF3 {1DF3} hidden
7: REPROG CONTROLS {1B00}
8: unknown:1DF0 {1DF0} hidden
9: unknown:1F03 {1F03} hidden
10: VERTICAL SCROLLING {2100}
11: HI RES SCROLLING {2120}
12: MOUSE POINTER {2200}
Has 5 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
3: BACK AS BUTTON 4 => Back mse, reprogrammable
4: FORWARD AS BUTTON 5 => BrowserForward mse, reprogrammable
Battery: 90%, discharging.

41
docs/devices/m560.txt Normal file
View File

@@ -0,0 +1,41 @@
1: Wireless Mouse M560
Codename : M560
Kind : mouse
Wireless PID : 402D
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 16E6E42A
Firmware: RQM 48.00.B0015
The power switch is located on the base.
Supports 22 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: unknown:1830 {1830} internal, hidden
6: unknown:1850 {1850} internal, hidden
7: unknown:1860 {1860} internal, hidden
8: unknown:1890 {1890} internal, hidden
9: unknown:18A0 {18A0} internal, hidden
10: REPROG CONTROLS V3 {1B03}
11: WIRELESS DEVICE STATUS {1D4B}
12: unknown:1DF3 {1DF3} internal, hidden
13: REPROG CONTROLS {1B00}
14: unknown:1DF0 {1DF0} hidden
15: unknown:1E00 {1E00} hidden
16: unknown:18B0 {18B0} internal, hidden
17: unknown:1E90 {1E90} internal, hidden
18: unknown:1F03 {1F03} internal, hidden
19: VERTICAL SCROLLING {2100}
20: HI RES SCROLLING {2120}
21: MOUSE POINTER {2200}
Has 7 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: BACK AS BUTTON 4 => Win8BackHorzLeft mse, reprogrammable
3: FORWARD AS BUTTON 5 => Win8ForwardHorzRight mse, reprogrammable
4: unknown:00B0 => Win8MetroWin7Forward mse, reprogrammable
5: SHOW DESKTOP HPP => Win8ShowDesktopWin7Back mse, reprogrammable
6: unknown:00AF => Win8Charm Appswitch GifAnimation mse, reprogrammable, unknown:000020
Battery: 70%, discharging.

24
docs/devices/m570.txt Normal file
View File

@@ -0,0 +1,24 @@
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : BAFF9007
Firmware : 12.03.B0025
Bootloader : 02.15
Other : AA.AA
Has 1 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=221
1: Wireless Trackball M570
Codename : M570
Kind : mouse
Wireless PID : 1028
Protocol : HID++ 1.0
Polling rate : 8 ms (125Hz)
Serial number: 891DC05A
Firmware: 26.00.B0003
Bootloader: 02.06
Other: 00.01
The power switch is located on the base.
Notifications: battery status (0x100000).
Battery: 100%, discharging.

82
docs/devices/m585.txt Normal file
View File

@@ -0,0 +1,82 @@
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : E21FAD57
Firmware : 24.06.B0030
Bootloader : 01.08
Other : AA.AC
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=190, 2=66
2: Multi Device Silent Mouse M585/M590
Codename : M585/M590
Kind : mouse
Wireless PID : 406B
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: 22AEB299
Bootloader: BOT 48.01.B0002
Firmware: MPM 05.10.B0011
Other:
The power switch is located on the base.
Supports 35 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: unknown:0021 {0021}
7: unknown:0007 {0007}
8: BATTERY STATUS {1000}
9: CHANGE HOST {1814}
10: unknown:1815 {1815}
11: REPROG CONTROLS V4 {1B04}
12: unknown:1C00 {1C00}
13: POINTER SPEED {2205}
Pointer Speed: 1.31640625
14: VERTICAL SCROLLING {2100}
Roller type: standard
Ratchet per turn: 18
Scroll lines: 0
15: unknown:00C2 {00C2}
16: unknown:1802 {1802} internal, hidden
17: unknown:1803 {1803} internal, hidden
18: unknown:1806 {1806} internal, hidden
19: unknown:1805 {1805} internal, hidden
20: unknown:1813 {1813} internal, hidden
21: unknown:1830 {1830} internal, hidden
22: unknown:1861 {1861} internal, hidden
23: unknown:1890 {1890} internal, hidden
24: unknown:1891 {1891} internal, hidden
25: unknown:18A1 {18A1} internal, hidden
26: unknown:1DF3 {1DF3} internal, hidden
27: unknown:1E00 {1E00} hidden
28: unknown:1EB0 {1EB0} internal, hidden
29: unknown:18B1 {18B1} internal, hidden
30: unknown:1850 {1850} internal, hidden
31: unknown:1E22 {1E22}
32: unknown:1F03 {1F03} internal, hidden
33: unknown:18C0 {18C0} internal, hidden
34: LOWRES WHEEL {2130}
Wheel Reports: HID
Has 8 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, reprogrammable, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, persistently divertable, reprogrammable, pos:0, group:2, gmask:3
3: BACK AS BUTTON 4 , default: BackEx => BACK AS BUTTON 4
divertable, mse, persistently divertable, reprogrammable, pos:0, group:2, gmask:3
4: FORWARD AS BUTTON 5 , default: BrowserForwardEx => FORWARD AS BUTTON 5
divertable, mse, persistently divertable, reprogrammable, pos:0, group:2, gmask:3
5: LEFT SCROLL AS AC PAN , default: HorzScrollLeftSet => LEFT SCROLL AS AC PAN
divertable, mse, persistently divertable, reprogrammable, pos:0, group:2, gmask:3
6: RIGHT SCROLL AS AC PAN , default: HorzScrollRightSet => RIGHT SCROLL AS AC PAN
divertable, mse, persistently divertable, reprogrammable, pos:0, group:2, gmask:3
7: unknown:00D7 , default: unknown:00B4 => unknown:00D7
divertable, virtual, pos:0, group:3, gmask:0
Battery: 50%, discharging.

42
docs/devices/m705.txt Normal file
View File

@@ -0,0 +1,42 @@
registers:
# writing 0x10 in this register will generate an event
# 10 02 0Dxx yyzz00
# where 0D happens to be the battery register number
# xx is the battery charge
# yy, zz ?
<< ( 0.001) [10 02 8100 000000] '\x10\x02\x81\x00\x00\x00\x00'
>> ( 1.132) [10 02 8100 100000] '\x10\x02\x81\x00\x10\x00\x00'
# smooth scroll - possible values
# - 00 (off)
# - 02 ?, apparently off as well, default value at power-on
# - 0x40 (on)
<< ( 2.005) [10 02 8101 000000] '\x10\x02\x81\x01\x00\x00\x00'
>> ( 2.052) [10 02 8101 020000] '\x10\x02\x81\x01\x02\x00\x00'
# battery status: percentage full, ?, ?
<< ( 14.835) [10 02 810D 000000] '\x10\x02\x81\r\x00\x00\x00'
>> ( 14.847) [10 02 810D 644734] '\x10\x02\x81\rdG4'
# accepts mask 0xF1
# setting 0x10 turns off the movement events (but buttons still work)
<< ( 221.495) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
>> ( 221.509) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
# appears to be read-only?
<< ( 223.527) [10 02 81D2 000000] '\x10\x02\x81\xd2\x00\x00\x00'
>> ( 223.540) [10 02 81D2 000003] '\x10\x02\x81\xd2\x00\x00\x03'
# appears to be read-only?
<< ( 225.557) [10 02 81D4 000000] '\x10\x02\x81\xd4\x00\x00\x00'
>> ( 225.571) [10 02 81D4 000004] '\x10\x02\x81\xd4\x00\x00\x04'
# read-only, 01-04 firmware info
<< ( 259.270) [10 02 81F1 000000] '\x10\x02\x81\xf1\x00\x00\x00'
>> ( 259.283) [10 02 8F81 F10300] '\x10\x02\x8f\x81\xf1\x03\x00'
# writing 01 here will trigger an avalanche of events, most likely
# raw input from the mouse; disable by writing 00
<< ( 261.300) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'
>> ( 261.315) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'

View File

@@ -0,0 +1,81 @@
Unifying Receiver
Device path : /dev/hidraw1
USB id : 046d:c534
Serial : 0
Firmware : 29.00.B0015
Has 2 paired device(s) out of a maximum of 6.
Notifications: (none)
1: Wireless Keyboard MK270
Codename : MK270
Kind : keyboard
Wireless PID : 4023
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: 00000000
Firmware: RQK 49.00.B0029
Supports 18 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: REPROG CONTROLS {1B00}
6: WIRELESS DEVICE STATUS {1D4B}
7: FN INVERSION {40A0}
8: ENCRYPTION {4100}
9: KEYBOARD LAYOUT {4520}
10: unknown:1810 {1810} internal, hidden
11: unknown:1830 {1830} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18A0 {18A0} internal, hidden
14: unknown:18B0 {18B0} internal, hidden
15: unknown:1DF3 {1DF3} internal, hidden
16: unknown:1E00 {1E00} hidden
17: unknown:1868 {1868} internal, hidden
Has 11 reprogrammable keys:
0: MY HOME => HomePage is FN, FN sensitive, reprogrammable
1: Mail => Email is FN, FN sensitive, reprogrammable
2: SEARCH => Search is FN, FN sensitive, reprogrammable
3: Calculator => Calculator is FN, FN sensitive, reprogrammable
4: MEDIA PLAYER => Music is FN, FN sensitive, reprogrammable
5: Previous => Previous is FN, FN sensitive
6: Play/Pause => Play/Pause is FN, FN sensitive
7: Next => Next is FN, FN sensitive
8: Mute => Mute is FN, FN sensitive
9: Volume Down => Volume Down is FN, FN sensitive
10: Volume Up => Volume Up is FN, FN sensitive
Battery: 30%, discharging.
2: Wireless Mouse
Codename :
Kind : mouse
Wireless PID : 4022
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 00000000
Firmware: RQM 38.00.B0044
Supports 18 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: REPROG CONTROLS {1B00}
6: WIRELESS DEVICE STATUS {1D4B}
7: VERTICAL SCROLLING {2100}
8: MOUSE POINTER {2200}
9: unknown:1810 {1810} internal, hidden
10: unknown:1830 {1830} internal, hidden
11: unknown:1850 {1850} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18B0 {18B0} internal, hidden
14: unknown:1DF3 {1DF3} internal, hidden
15: unknown:1868 {1868} internal, hidden
16: unknown:1869 {1869} internal, hidden
17: unknown:1E00 {1E00} hidden
Has 3 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
Battery: 30%, discharging.

77
docs/devices/mk220.txt Normal file
View File

@@ -0,0 +1,77 @@
Unifying Receiver
Device path : /dev/hidraw1
USB id : 046d:c52e
Serial : 758596BF
Firmware : 23.01.B0006
Has 2 paired device(s) out of a maximum of 2.
Notifications: wireless, software present (0x000900)
1: Wireless Mouse M150
Codename : M150
Kind : mouse
Wireless PID : 400C
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 93850883
Firmware: RQM 29.00.B0010
The power switch is located on the base.
Supports 16 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: unknown:1850 {1850} hidden
5: unknown:1860 {1860} hidden
6: BATTERY STATUS {1000}
7: WIRELESS DEVICE STATUS {1D4B}
8: unknown:1DF3 {1DF3} hidden
9: REPROG CONTROLS {1B00}
10: unknown:1DF0 {1DF0} hidden
11: unknown:1E00 {1E00} hidden
12: unknown:1E80 {1E80} hidden
13: unknown:1F03 {1F03} hidden
14: VERTICAL SCROLLING {2100}
15: MOUSE POINTER {2200}
Has 3 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
Battery: 90%, discharging.
2: Wireless Keyboard K220
Codename : K220
Kind : keyboard
Wireless PID : 4005
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: 5BB1D72E
Firmware: RQK 37.00.B0011
Supports 14 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: FEATURE INFO {0002}
3: DEVICE FW VERSION {0003}
4: DEVICE NAME {0005}
5: BATTERY STATUS {1000}
6: unknown:1820 {1820} hidden
7: REPROG CONTROLS {1B00}
8: REPROG CONTROLS V2 {1B01}
9: WIRELESS DEVICE STATUS {1D4B}
10: unknown:1DF0 {1DF0} hidden
11: unknown:1DF3 {1DF3} hidden
12: ENCRYPTION {4100}
13: KEYBOARD LAYOUT {4520}
Has 12 reprogrammable keys:
0: FN F1 => Do Nothing One is FN, reprogrammable
1: FN F2 => Do Nothing One is FN, reprogrammable
2: FN F3 => Do Nothing One is FN, reprogrammable
3: FN F4 => Do Nothing One is FN, reprogrammable
4: FN F5 => Do Nothing One is FN, reprogrammable
5: FN F6 => Do Nothing One is FN, reprogrammable
6: FN F7 => Do Nothing One is FN, reprogrammable
7: FN F8 => Do Nothing One is FN, reprogrammable
8: FN F9 => Do Nothing One is FN, reprogrammable
9: Mute => Mute is FN
10: Volume Down => Volume Down is FN
11: Volume Up => Volume Up is FN
Battery: 90%, discharging.

129
docs/devices/mk240-nano.md Normal file
View File

@@ -0,0 +1,129 @@
# Logitech MK240 NANO Device Information
## `solaar show all` Dump
```
Unifying Receiver (NOTE: NOT claimed to be supporting Unifying from the package box, the only advanced feature that may be related is 128-bit AES encryption) (M/N: C-U0010)
Device path : /dev/hidraw0
USB id : 046d:c534
Serial : 0
Firmware : 29.01.B0016
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
1: Wireless Keyboard MK270 (NOTE: The Product is actually "MK240 NANO Wireless Keyboard and Mouse Combo" with the "K240"(M/N: Y-R0036) keyboard model)
Codename : MK270
Kind : keyboard
Wireless PID : 4023
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: 4BBBBA4A
Firmware: RQK 49.00.B0029
Supports 18 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: REPROG CONTROLS {1B00}
6: WIRELESS DEVICE STATUS {1D4B}
7: FN INVERSION {40A0}
8: ENCRYPTION {4100}
9: KEYBOARD LAYOUT {4520}
10: unknown:1810 {1810} internal, hidden
11: unknown:1830 {1830} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18A0 {18A0} internal, hidden
14: unknown:18B0 {18B0} internal, hidden
15: unknown:1DF3 {1DF3} internal, hidden
16: unknown:1E00 {1E00} hidden
17: unknown:1868 {1868} internal, hidden
Has 11 reprogrammable keys:
0: MY HOME => HomePage is FN, FN sensitive, reprogrammable
1: Mail => Email is FN, FN sensitive, reprogrammable
2: SEARCH => Search is FN, FN sensitive, reprogrammable
3: Calculator => Calculator is FN, FN sensitive, reprogrammable
4: MEDIA PLAYER => Music is FN, FN sensitive, reprogrammable
5: Previous => Previous is FN, FN sensitive
6: Play/Pause => Play/Pause is FN, FN sensitive
7: Next => Next is FN, FN sensitive
8: Mute => Mute is FN, FN sensitive
9: Volume Down => Volume Down is FN, FN sensitive
10: Volume Up => Volume Up is FN, FN sensitive
Battery: 30%, discharging. (NOTE: Capacity readings appears to be faked, or in extremely low sensitivity)
2: Wireless Mouse M150 (NOTE: The Product is actually "MK240 NANO Wireless Keyboard and Mouse Combo" with the "M212"(M/N: M-R0041) mouse model)
Codename : M150
Kind : mouse
Wireless PID : 4022
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 00000000
Firmware: RQM 38.00.B0044
Supports 18 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: REPROG CONTROLS {1B00}
6: WIRELESS DEVICE STATUS {1D4B}
7: VERTICAL SCROLLING {2100}
8: MOUSE POINTER {2200}
9: unknown:1810 {1810} internal, hidden
10: unknown:1830 {1830} internal, hidden
11: unknown:1850 {1850} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18B0 {18B0} internal, hidden
14: unknown:1DF3 {1DF3} internal, hidden
15: unknown:1868 {1868} internal, hidden
16: unknown:1869 {1869} internal, hidden
17: unknown:1E00 {1E00} hidden
Has 3 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
Battery: 30%, discharging. (NOTE: Capacity readings appears to be faked, or in extremely low sensitivity, in the Logitech SetPoint utility battery level is displayed as "HIGH")
```
## Connect Utility Report
```
Re-Connect Software Version : 2.00.3
Dj Api Version : 2, 50, 25
接收器(Receiver)
Name : 無線接收器(Wireless Receiver)
ModelId : 0x46dc534
Serial Number :
Handle : 0xff000001
Wireless Status : 0x3
Firmware version : 029.001.00016
Bootloader version :
Dfu Status : 0x1
Is Dfu Cancellable : Yes
Max Device Capacity : 6
滑鼠(Mouse)
Name :
ModelId : 0x0
Serial Number : 4022-00-00-00-00
Handle : 0x2000003
Wireless Status : 0x0
Firmware version : 038.000.00044
Bootloader version :
Dfu Status : 0x1
Is Dfu Cancellable : No
Battery Status : 0x2
Parent Handle : 0xff000001
鍵盤(Keyboard)
Name :
ModelId : 0x0
Serial Number : 4023-4B-BB-BA-4A
Handle : 0x1000002
Wireless Status : 0x0
Firmware version : 049.000.00029
Bootloader version :
Dfu Status : 0x1
Is Dfu Cancellable : No
Battery Status : 0x2
Parent Handle : 0xff000001
```

85
docs/devices/mk270.txt Normal file
View File

@@ -0,0 +1,85 @@
Unifying Receiver
Device path : /dev/hidraw9
USB id : 046d:c534
Serial : 00000000
Firmware : 29.00.B0015
Has 2 paired device(s) out of a maximum of 6.
Notifications: (none)
1: Wireless Keyboard
Codename : MK270
Kind : keyboard
Wireless PID : 4023
Protocol : HID++ 2.0
Polling rate : 20 ms (50Hz)
Serial number: 00000000
Firmware: RQK 49.00.B0029
Supports 18 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: REPROG CONTROLS {1B00}
6: WIRELESS DEVICE STATUS {1D4B}
7: FN INVERSION {40A0}
8: ENCRYPTION {4100}
9: KEYBOARD LAYOUT {4520}
10: unknown:1810 {1810} internal, hidden
11: unknown:1830 {1830} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18A0 {18A0} internal, hidden
14: unknown:18B0 {18B0} internal, hidden
15: unknown:1DF3 {1DF3} internal, hidden
16: unknown:1E00 {1E00} hidden
17: unknown:1868 {1868} internal, hidden
Has 11 reprogrammable keys:
0: MY HOME => HomePage FN sensitive, is FN, reprogrammable
1: Mail => Email FN sensitive, is FN, reprogrammable
2: SEARCH => Search FN sensitive, is FN, reprogrammable
3: Calculator => Calculator FN sensitive, is FN, reprogrammable
4: MEDIA PLAYER => Music FN sensitive, is FN, reprogrammable
5: Previous => Previous FN sensitive, is FN
6: Play/Pause => Play/Pause FN sensitive, is FN
7: Next => Next FN sensitive, is FN
8: Mute => Mute FN sensitive, is FN
9: Volume Down => Volume Down FN sensitive, is FN
10: Volume Up => Volume Up FN sensitive, is FN
Battery: 30%, discharging.
2: Wireless Mouse
Codename : M185
Kind : mouse
Wireless PID : 4038
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 00000000
Firmware: RQM 54.00.B0004
Supports 22 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: unknown:1830 {1830} internal, hidden
6: unknown:1850 {1850} internal, hidden
7: unknown:1860 {1860} internal, hidden
8: unknown:1890 {1890} internal, hidden
9: unknown:18A0 {18A0} internal, hidden
10: unknown:18C0 {18C0} internal, hidden
11: WIRELESS DEVICE STATUS {1D4B}
12: unknown:1DF3 {1DF3} internal, hidden
13: REPROG CONTROLS {1B00}
14: unknown:1DF0 {1DF0} hidden
15: unknown:1E00 {1E00} hidden
16: unknown:1E80 {1E80} internal, hidden
17: unknown:1E90 {1E90} internal, hidden
18: unknown:1F03 {1F03} internal, hidden
19: VERTICAL SCROLLING {2100}
20: MOUSE POINTER {2200}
21: unknown:18B0 {18B0} internal, hidden
Has 3 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
Battery: 70%, discharging.

60
docs/devices/mk520.txt Normal file
View File

@@ -0,0 +1,60 @@
Unifying Receiver
Device path : /dev/hidraw3
USB id : 046d:c52b
Serial : AF9C98A0
Firmware : 12.03.B0025
Bootloader : 02.15
Other : AA.AA
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=22, 2=167
1: Wireless Mouse M310/M310t
Codename : M310/M310t
Kind : mouse
Wireless PID : 4031
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 03E8C0B4
Firmware: RQM 40.01.B0017
The power switch is located on the base.
Supports 21 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: BATTERY STATUS {1000}
5: unknown:1830 {1830} internal, hidden
6: unknown:1850 {1850} internal, hidden
7: unknown:1860 {1860} internal, hidden
8: unknown:1890 {1890} internal, hidden
9: unknown:18A0 {18A0} internal, hidden
10: unknown:18C0 {18C0} internal, hidden
11: WIRELESS DEVICE STATUS {1D4B}
12: unknown:1DF3 {1DF3} internal, hidden
13: REPROG CONTROLS {1B00}
14: unknown:1DF0 {1DF0} hidden
15: unknown:1E00 {1E00} hidden
16: unknown:1E80 {1E80} internal, hidden
17: unknown:1E90 {1E90} internal, hidden
18: unknown:1F03 {1F03} internal, hidden
19: VERTICAL SCROLLING {2100}
20: MOUSE POINTER {2200}
Has 3 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
Battery: 70%, discharging.
2: Wireless Keyboard K520
Codename : K520
Kind : keyboard
Wireless PID : 2011
Protocol : HID++ 1.0
Polling rate : 20 ms (50Hz)
Serial number: ACDE97EF
Firmware: 26.00.B0012
Other: 00.07
The power switch is located on the top case.
Notifications: (none).
Battery: full, discharging.

26
docs/devices/mk700.txt Normal file
View File

@@ -0,0 +1,26 @@
# Enabled Notifications
# 10 - battery status
# 02 + 01 - remap FN keys (multimedia + power buttons)
>> ( 1.412) [10 02 8100 130000] '\x10\x02\x81\x00\x13\x00\x00'
<< ( 0.011) [10 02 8101 000000] '\x10\x02\x81\x01\x00\x00\x00'
>> ( 0.276) [10 02 8101 000000] '\x10\x02\x81\x01\x00\x00\x00'
# Battery status
<< ( 6.033) [10 02 8107 000000] '\x10\x02\x81\x07\x00\x00\x00'
>> ( 6.344) [10 02 8107 070000] '\x10\x02\x81\x07\x07\x00\x00'
# FN status
<< ( 8.055) [10 02 8109 000000] '\x10\x02\x81\t\x00\x00\x00'
>> ( 8.144) [10 02 8109 000000] '\x10\x02\x81\t\x00\x00\x00'
# ?
<< ( 208.316) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
>> ( 208.353) [10 02 81D0 000000] '\x10\x02\x81\xd0\x00\x00\x00'
# version info
<< ( 237.436) [10 02 81F1 000000] '\x10\x02\x81\xf1\x00\x00\x00'
>> ( 237.744) [10 02 8F81 F10300] '\x10\x02\x8f\x81\xf1\x03\x00'
# ?
<< ( 239.459) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'
>> ( 239.766) [10 02 81F3 000000] '\x10\x02\x81\xf3\x00\x00\x00'

View File

@@ -0,0 +1,84 @@
Unifying Receiver
Device path : /dev/hidraw7
USB id : 046d:c52b
Serial : BB7D9447
Firmware : 24.01.B0023
Bootloader : 01.08
Other : AA.AD
Has 2 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 2=156
1: Wireless Mouse MX Master 2S
Codename : MX Master 2S
Kind : mouse
Wireless PID : 4069
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: EAB71F76
Bootloader: BOT 56.01.B0006
Firmware: MPM 12.01.B0006
Firmware: MPM 12.01.B0006
Other:
The power switch is located on the base.
Supports 32 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: unknown:0021 {0021}
7: BATTERY STATUS {1000}
8: unknown:1806 {1806} internal, hidden
9: CHANGE HOST {1814}
10: REPROG CONTROLS V4 {1B04}
11: ADJUSTABLE DPI {2201}
12: VERTICAL SCROLLING {2100}
Roller type: 3G
Ratchet per turn: 24
Scroll lines: 0
13: SMART SHIFT {2110}
14: HIRES WHEEL {2121}
Multiplier: 8
Has invert
Normal wheel motion
Has ratchet switch
Normal wheel mode
High resolution mode
HID notification
15: GESTURE 2 {6501}
16: unknown:00C2 {00C2}
17: unknown:1813 {1813} internal, hidden
18: unknown:1830 {1830} internal, hidden
19: unknown:1890 {1890} internal, hidden
20: unknown:1891 {1891} internal, hidden
21: unknown:18A1 {18A1} internal, hidden
22: unknown:18C0 {18C0} internal, hidden
23: unknown:1DF3 {1DF3} internal, hidden
24: unknown:1E00 {1E00} hidden
25: unknown:1EB0 {1EB0} internal, hidden
26: unknown:1803 {1803} internal, hidden
27: unknown:1861 {1861} internal, hidden
28: unknown:9001 {9001} internal, hidden
29: unknown:9200 {9200} internal, hidden
30: unknown:9202 {9202} internal, hidden
31: unknown:1805 {1805} internal, hidden
Has 8 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
3: BACK AS BUTTON 4 , default: BackEx => BACK AS BUTTON 4
mse, reprogrammable, divertable, pos:0, group:2, gmask:3
4: FORWARD AS BUTTON 5 , default: BrowserForwardEx => FORWARD AS BUTTON 5
mse, reprogrammable, divertable, pos:0, group:2, gmask:3
5: unknown:00C3 , default: unknown:00A9 => unknown:00C3
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
6: unknown:00C4 , default: unknown:009D => unknown:00C4
mse, reprogrammable, divertable, pos:0, group:3, gmask:7
7: unknown:00D7 , default: unknown:00B4 => unknown:00D7
divertable, virtual, pos:0, group:4, gmask:0
Battery: 50%, discharging.

View File

@@ -0,0 +1,82 @@
Unifying Receiver
Device path : /dev/hidraw0
USB id : 046d:c52b
Serial : 32A29DF4
Firmware : 12.09.B0030
Bootloader : 04.16
Other : AA.AA
Has 1 paired device(s) out of a maximum of 6.
Notifications: wireless (0x000100)
Device activity counters: 1=18
1: Wireless Mouse MX Master 3
Codename : MX Master 3
Kind : mouse
Wireless PID : 4082
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: B0C9EC6E
Bootloader: BOT 95.00.B0013
Firmware: MPM 19.00.B0013
Other:
The power switch is located on the base.
Supports 34 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: unknown:0021 {0021}
7: BATTERY STATUS {1000}
8: REPROG CONTROLS V4 {1B04}
9: CHANGE HOST {1814}
10: unknown:2250 {2250}
11: ADJUSTABLE DPI {2201}
12: SMART SHIFT {2110}
13: HIRES WHEEL {2121}
Multiplier: 15
Has invert
Normal wheel motion
Has ratchet switch
Normal wheel mode
Low resolution mode
HID notification
14: unknown:2150 {2150}
15: unknown:2251 {2251}
16: unknown:00C2 {00C2}
17: unknown:1802 {1802} internal, hidden
18: unknown:1803 {1803} internal, hidden
19: unknown:1806 {1806} internal, hidden
20: unknown:1813 {1813} internal, hidden
21: unknown:1805 {1805} internal, hidden
22: unknown:1830 {1830} internal, hidden
23: unknown:1890 {1890} internal, hidden
24: unknown:1891 {1891} internal, hidden
25: unknown:18A1 {18A1} internal, hidden
26: unknown:1DF3 {1DF3} internal, hidden
27: unknown:1E00 {1E00} hidden
28: unknown:1EB0 {1EB0} internal, hidden
29: unknown:1861 {1861} internal, hidden
30: unknown:9001 {9001} internal, hidden
31: unknown:9203 {9203} internal, hidden
32: unknown:9205 {9205} internal, hidden
33: unknown:9300 {9300} internal, hidden
Has 8 reprogrammable keys:
0: LEFT CLICK , default: LeftClick => LEFT CLICK
mse, pos:0, group:1, gmask:1
1: RIGHT CLICK , default: RightClick => RIGHT CLICK
mse, pos:0, group:1, gmask:1
2: MIDDLE BUTTON , default: MiddleMouseButton => MIDDLE BUTTON
divertable, mse, reprogrammable, pos:0, group:3, gmask:7
3: BACK AS BUTTON 4 , default: BackEx => BACK AS BUTTON 4
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
4: FORWARD AS BUTTON 5 , default: BrowserForwardEx => FORWARD AS BUTTON 5
divertable, mse, reprogrammable, pos:0, group:2, gmask:3
5: unknown:00C3 , default: unknown:00A9 => unknown:00C3
divertable, mse, reprogrammable, pos:0, group:3, gmask:7
6: unknown:00C4 , default: unknown:009D => unknown:00C4
divertable, mse, reprogrammable, pos:0, group:3, gmask:7
7: unknown:00D7 , default: unknown:00B4 => unknown:00D7
divertable, virtual, pos:0, group:4, gmask:0
Battery: 100%, discharging.

View File

@@ -0,0 +1,54 @@
Unifying Receiver
Device path : /dev/hidraw3
USB id : 046d:c52b
Serial : 0E039B8F
Firmware : 24.01.B0023
Bootloader : 01.08
Other : AA.AC
Has 1 paired device(s) out of a maximum of 6.
Notifications: wireless, software present (0x000900)
Device activity counters: 1=134
1: Wireless Mouse MX Master
Codename : MX Master
Kind : mouse
Wireless PID : 4041
Protocol : HID++ 4.5
Polling rate : 8 ms (125Hz)
Serial number: A975E230
Bootloader: BOT 18.00.B0012
Firmware: MPM 11.00.B0012
Firmware: MPM 11.00.B0012
Other:
The power switch is located on the base.
Supports 29 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
3: DEVICE NAME {0005}
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: BATTERY STATUS {1000}
7: CHANGE HOST {1814}
8: REPROG CONTROLS V4 {1B04}
9: ADJUSTABLE DPI {2201}
10: VERTICAL SCROLLING {2100}
11: SMART SHIFT {2110}
12: HIRES WHEEL {2121}
13: GESTURE 2 {6501}
14: DFUCONTROL 2 {00C1}
15: unknown:1813 {1813} internal, hidden
16: unknown:1830 {1830} internal, hidden
17: unknown:1890 {1890} internal, hidden
18: unknown:18A1 {18A1} internal, hidden
19: unknown:18C0 {18C0} internal, hidden
20: unknown:1DF3 {1DF3} internal, hidden
21: unknown:1E00 {1E00} hidden
22: unknown:1EB0 {1EB0} internal, hidden
23: unknown:1803 {1803} internal, hidden
24: unknown:1861 {1861} internal, hidden
25: unknown:9000 {9000} internal, hidden
26: unknown:9200 {9200} internal, hidden
27: unknown:9240 {9240} internal, hidden
28: unknown:1805 {1805} internal, hidden
Battery: 50%, discharging.

View File

@@ -0,0 +1,40 @@
# Notifications (r1_bit0 = battery status?)
<< ( 0.113) [10 01 8100 000000] '\x10\x01\x81\x00\x00\x00\x00'
>> ( 0.157) [10 01 8100 100000] '\x10\x01\x81\x00\x10\x00\x00'
# ?
<< ( 1.050) [10 01 8101 000000] '\x10\x01\x81\x01\x00\x00\x00'
>> ( 1.097) [10 01 8101 020000] '\x10\x01\x81\x01\x02\x00\x00'
# battery (07 means full)
<< ( 7.335) [10 01 8107 000000] '\x10\x01\x81\x07\x00\x00\x00'
>> ( 7.382) [10 01 8107 070000] '\x10\x01\x81\x07\x07\x00\x00'
# Set LEDS - ab cd 00, where a/b/c/d values are 1=off, 2=on, 3=flash
# a = lower led
# b = red led
# c = upper led
# d = middle led
# below: all leds are off
<< ( 86.592) [10 01 8151 000000] '\x10\x01\x81Q\x00\x00\x00'
>> ( 86.639) [10 01 8151 111100] '\x10\x01\x81Q\x11\x11\x00'
# DPI (values in range 0x81..0x8F; logical value: 100..1500)
<< ( 108.430) [10 01 8163 000000] '\x10\x01\x81c\x00\x00\x00'
>> ( 108.477) [10 01 8163 890000] '\x10\x01\x81c\x89\x00\x00'
# ?
<< ( 240.505) [10 01 81D0 000000] '\x10\x01\x81\xd0\x00\x00\x00'
>> ( 240.550) [10 01 81D0 000000] '\x10\x01\x81\xd0\x00\x00\x00'
# ?
<< ( 245.690) [10 01 81D4 000000] '\x10\x01\x81\xd4\x00\x00\x00'
>> ( 245.737) [10 01 81D4 000012] '\x10\x01\x81\xd4\x00\x00\x12'
# Firmware/bootloader version
<< ( 281.016) [10 01 81F1 000000] '\x10\x01\x81\xf1\x00\x00\x00'
>> ( 282.177) [10 01 8F81 F10300] '\x10\x01\x8f\x81\xf1\x03\x00'
# ?
<< ( 284.106) [10 01 81F3 000000] '\x10\x01\x81\xf3\x00\x00\x00'
>> ( 284.153) [10 01 81F3 000000] '\x10\x01\x81\xf3\x00\x00\x00'

109
docs/devices/t400.txt Normal file
View File

@@ -0,0 +1,109 @@
Receiver
LZ2388S-DJ
M/N:C-U0007
(ltunify)
Serial number: E6B794F8
Firmware version: 012.001.00019
Bootloader version: BL.002.014
Mouse
(ltunify)
HID++ version: 2.0
Device index 1
Mouse
Name: T400
Wireless Product ID: 4026
Serial number: 131A3093
Device was unavailable, version information not available.
Total number of HID++ 2.0 features: 27
0: [0000] IRoot
1: [0001] IFeatureSet
2: [0002] unknown
3: [0003] IFirmwareInfo
4: [0005] GetDeviceNameType
5: [00C0] DFUControl
6: [1000] batteryLevelStatus
7: [1802] HI unknown
8: [1810] HI unknown
9: [1830] HI unknown
10: [1850] HI unknown
11: [1860] HI unknown
12: [1890] HI unknown
13: [18A0] HI unknown
14: [18E3] HI unknown
15: [1B00] SpecialKeysMSEButtons
16: [1D4B] WirelessDeviceStatus
17: [1DF3] HI unknown
18: [1E00] H unknown
19: [1E80] HI unknown
20: [1F03] HI unknown
21: [1F04] HI unknown
22: [2100] VerticalScrolling
23: [2101] H unknown
24: [2120] HiResScrolling
25: [2200] MousePointer
26: [6110] H TouchmouseRawPoints
27: [1B03] ReprogControlsV3
(O = obsolete feature; H = SW hidden feature;
I = reserved for internal use)
(solaar)
Unifying Receiver
Device path : /dev/hidraw2
USB id : 046d:c52b
Serial : E6B794F8
Firmware : 12.01.B0019
Bootloader : 02.14
Has 1 paired device(s) out of a maximum of 6.
Notifications: (none)
Device activity counters: 1=134
1: Zone Touch Mouse T400
Codename : T400
Kind : mouse
Wireless PID : 4026
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 131A3093
Firmware: RQM 39.00.B0029
Bootloader: BL 03.00
Hardware: 72
Other:
The power switch is located on the base.
Supports 28 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: FEATURE INFO {0002}
3: DEVICE FW VERSION {0003}
4: DEVICE NAME {0005}
5: DFUCONTROL {00C0}
6: BATTERY STATUS {1000}
7: unknown:1802 {1802} internal, hidden
8: unknown:1810 {1810} internal, hidden
9: unknown:1830 {1830} internal, hidden
10: unknown:1850 {1850} internal, hidden
11: unknown:1860 {1860} internal, hidden
12: unknown:1890 {1890} internal, hidden
13: unknown:18A0 {18A0} internal, hidden
14: unknown:18E3 {18E3} internal, hidden
15: REPROG CONTROLS {1B00}
16: WIRELESS DEVICE STATUS {1D4B}
17: unknown:1DF3 {1DF3} internal, hidden
18: unknown:1E00 {1E00} hidden
19: unknown:1E80 {1E80} internal, hidden
20: unknown:1F03 {1F03} internal, hidden
21: unknown:1F04 {1F04} internal, hidden
22: VERTICAL SCROLLING {2100}
23: unknown:2101 {2101} hidden
24: HI RES SCROLLING {2120}
25: MOUSE POINTER {2200}
26: TOUCHMOUSE RAW POINTS {6110} hidden
27: REPROG CONTROLS V3 {1B03}
Has 7 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
2: MIDDLE BUTTON => MiddleMouseButton mse, reprogrammable
3: METRO START SCREEN => MetroStartScreen mse, reprogrammable
4: ZOOMIN => Do Nothing mse, reprogrammable
5: ZOOMOUT => Do Nothing mse, reprogrammable
6: BACK HSCROLL => TouchBackForwardHorzScroll
Battery: 100%, discharging.

94
docs/devices/t650.txt Normal file
View File

@@ -0,0 +1,94 @@
Receiver
LZ2458D-DJ
M/N:C-U0008
(ltunify)
Serial number: 28E69A3E
Firmware version: 024.000.00018
Bootloader version: BL.000.006
Touchpad
(ltunify)
HID++ version: 2.0
Device index 1
Touchpad
Name: T650
Wireless Product ID: 4101
Serial number: 22205A4D
Device was unavailable, version information not available.
Total number of HID++ 2.0 features: 22
0: [0000] IRoot
1: [0001] IFeatureSet
2: [0002] unknown
3: [0003] IFirmwareInfo
4: [0005] GetDeviceNameType
5: [1000] batteryLevelStatus
6: [1D4B] WirelessDeviceStatus
7: [1DF3] HI unknown
8: [1B00] SpecialKeysMSEButtons
9: [1F03] HI unknown
10: [2100] VerticalScrolling
11: [2120] HiResScrolling
12: [2200] MousePointer
13: [00C0] DFUControl
14: [1E80] HI unknown
15: [6100] TouchpadRawXy
16: [1860] HI unknown
17: [1E00] H unknown
18: [1B01] ReprogControlsV2
19: [1890] HI unknown
20: [18E5] HI unknown
21: [18A0] HI unknown
22: [1830] HI unknown
(O = obsolete feature; H = SW hidden feature;
I = reserved for internal use)
(solaar)
Unifying Receiver
Device path : /dev/hidraw2
USB id : 046d:c52b
Serial : 28E69A3E
Firmware : 24.00.B0018
Bootloader : 00.06
Has 1 paired device(s) out of a maximum of 6.
Notifications: (none)
Device activity counters: 1=221
1: Wireless Rechargeable Touchpad T650
Codename : T650
Kind : touchpad
Wireless PID : 4101
Protocol : HID++ 2.0
Polling rate : 8 ms (125Hz)
Serial number: 22205A4D
Firmware: RQM 41.01.B0037
Bootloader: BL 03.00
Hardware: 72
Other:
The power switch is located on the base.
Supports 23 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: FEATURE INFO {0002}
3: DEVICE FW VERSION {0003}
4: DEVICE NAME {0005}
5: BATTERY STATUS {1000}
6: WIRELESS DEVICE STATUS {1D4B}
7: unknown:1DF3 {1DF3} internal, hidden
8: REPROG CONTROLS {1B00}
9: unknown:1F03 {1F03} internal, hidden
10: VERTICAL SCROLLING {2100}
11: HI RES SCROLLING {2120}
12: MOUSE POINTER {2200}
13: DFUCONTROL {00C0}
14: unknown:1E80 {1E80} internal, hidden
15: TOUCHPAD RAW XY {6100}
16: unknown:1860 {1860} internal, hidden
17: unknown:1E00 {1E00} hidden
18: REPROG CONTROLS V2 {1B01}
19: unknown:1890 {1890} internal, hidden
20: unknown:18E5 {18E5} internal, hidden
21: unknown:18A0 {18A0} internal, hidden
22: unknown:1830 {1830} internal, hidden
Has 2 reprogrammable keys:
0: LEFT CLICK => LeftClick mse, reprogrammable
1: RIGHT CLICK => RightClick mse, reprogrammable
Battery: 50%, discharging.

205
docs/features.md Normal file
View File

@@ -0,0 +1,205 @@
---
title: List of HID++ 2.0 features
layout: page
---
# List of HID++ 2.0 features
## Feature status
See functions in `hidpp20.py` and `settings_templates.py`
Feature | ID | Status | Notes
---------------------------------------|----------|:------------------:|------
`ROOT` | `0x0000` | Supported | System
`FEATURE_SET` | `0x0001` | Supported | System
`FEATURE_INFO` | `0x0002` | Supported | System
`DEVICE_FW_VERSION` | `0x0003` | Supported | `get_firmware`, `get_ids`, read only
`DEVICE_UNIT_ID` | `0x0004` | Unsupported |
`DEVICE_NAME` | `0x0005` | Supported | `get_kind`, `get_name`, read only
`DEVICE_GROUPS` | `0x0006` | Unsupported |
`DEVICE_FRIENDLY_NAME` | `0x0007` | Supported | `get_friendly_name`, read only
`KEEP_ALIVE` | `0x0008` | Unsupported |
`RESET` | `0x0020` | Unsupported | aka “Config Change”
`CRYPTO_ID` | `0x0021` | Unsupported |
`TARGET_SOFTWARE` | `0x0030` | Unsupported |
`WIRELESS_SIGNAL_STRENGTH` | `0x0080` | Unsupported |
`DFUCONTROL_LEGACY` | `0x00C0` | Unsupported |
`DFUCONTROL_UNSIGNED` | `0x00C1` | Unsupported |
`DFUCONTROL_SIGNED` | `0x00C2` | Unsupported |
`DFU` | `0x00D0` | Unsupported |
`BATTERY_STATUS` | `0x1000` | Supported | `get_battery`, read only
`BATTERY_VOLTAGE` | `0x1001` | Supported | `get_voltage`, read only
`UNIFIED_BATTERY` | `0x1004` | Supported | `get_battery`, read only
`CHARGING_CONTROL` | `0x1010` | Unsupported |
`LED_CONTROL` | `0x1300` | Unsupported |
`GENERIC_TEST` | `0x1800` | Unsupported |
`DEVICE_RESET` | `0x1802` | Unsupported |
`OOBSTATE` | `0x1805` | Unsupported |
`CONFIG_DEVICE_PROPS` | `0x1806` | Unsupported |
`CHANGE_HOST` | `0x1814` | Supported | `ChangeHost`
`HOSTS_INFO` | `0x1815` | Partial Support | `get_host_names`, partial listing only
`BACKLIGHT` | `0x1981` | Unsupported |
`BACKLIGHT2` | `0x1982` | Supported | `Backlight2`
`BACKLIGHT3` | `0x1983` | Unsupported |
`PRESENTER_CONTROL` | `0x1A00` | Unsupported |
`SENSOR_3D` | `0x1A01` | Unsupported |
`REPROG_CONTROLS` | `0x1B00` | Unsupported |
`REPROG_CONTROLS_V2` | `0x1B01` | Listing Only | `get_keys`
`REPROG_CONTROLS_V2_2` | `0x1B02` | Unsupported |
`REPROG_CONTROLS_V3` | `0x1B03` | Unsupported |
`REPROG_CONTROLS_V4` | `0x1B04` | Partial Support | `ReprogrammableKeys`, `DivertKeys`, `MouseGesture`, `get_keys`
`REPORT_HID_USAGE` | `0x1BC0` | Unsupported |
`PERSISTENT_REMAPPABLE_ACTION` | `0x1C00` | Supported | `PersistentRemappableAction`
`WIRELESS_DEVICE_STATUS` | `0x1D4B` | Read only | status reporting from device
`REMAINING_PAIRING` | `0x1DF0` | Unsupported |
`FIRMWARE_PROPERTIES` | `0x1F1F` | Unsupported |
`ADC_MEASUREMENT` | `0x1F20` | Unsupported |
`LEFT_RIGHT_SWAP` | `0x2001` | Unsupported |
`SWAP_BUTTON_CANCEL` | `0x2005` | Unsupported |
`POINTER_AXIS_ORIENTATION` | `0x2006` | Unsupported |
`VERTICAL_SCROLLING` | `0x2100` | Supported | `get_vertical_scrolling_info`, read only
`SMART_SHIFT` | `0x2110` | Supported | `SmartShift`
`SMART_SHIFT_ENHANCED` | `0x2111` | Supported | `SmartShiftEnhanced`
`HI_RES_SCROLLING` | `0x2120` | Supported | `HiResScroll`, `get_hi_res_scrolling_info`
`HIRES_WHEEL` | `0x2121` | Supported | `HiresSmoothInvert`, `HiresSmoothResolution`, `get_hires_wheel`
`LOWRES_WHEEL` | `0x2130` | Supported | `LowresSmoothScroll`, `get_lowres_wheel_status`
`THUMB_WHEEL` | `0x2150` | Supported | `ThumbMode`, `ThumbInvert`
`MOUSE_POINTER` | `0x2200` | Supported | `get_mouse_pointer_info`, read only
`ADJUSTABLE_DPI` | `0x2201` | Supported | `AdjustableDpi`, `DpiSliding`
`POINTER_SPEED` | `0x2205` | Supported | `PointerSpeed`, `SpeedChange`, `get_pointer_speed_info`
`ANGLE_SNAPPING` | `0x2230` | Unsupported |
`SURFACE_TUNING` | `0x2240` | Unsupported |
`HYBRID_TRACKING` | `0x2400` | Unsupported |
`FN_INVERSION` | `0x40A0` | Supported | `FnSwap`
`NEW_FN_INVERSION` | `0x40A2` | Supported | `NewFnSwap`, `get_new_fn_inversion
`K375S_FN_INVERSION` | `0x40A3` | Supported | `K375sFnSwap`
`ENCRYPTION` | `0x4100` | Unsupported |
`LOCK_KEY_STATE` | `0x4220` | Unsupported |
`SOLAR_DASHBOARD` | `0x4301` | Unsupported |
`KEYBOARD_LAYOUT` | `0x4520` | Unsupported | read only
`KEYBOARD_DISABLE_KEYS` | `0x4521` | Supported | `DisableKeyboardKeys`
`KEYBOARD_DISABLE_BY_USAGE` | `0x4522` | Unsupported |
`DUALPLATFORM` | `0x4530` | Supported | `Dualplatform`, untested
`MULTIPLATFORM` | `0x4531` | Supported | `Multiplatform`
`KEYBOARD_LAYOUT_2` | `0x4540` | Unsupported | read only
`CROWN` | `0x4600` | Supported | `DivertCrown`, `CrownSmooth`
`TOUCHPAD_FW_ITEMS` | `0x6010` | Unsupported |
`TOUCHPAD_SW_ITEMS` | `0x6011` | Unsupported |
`TOUCHPAD_WIN8_FW_ITEMS` | `0x6012` | Unsupported |
`TAP_ENABLE` | `0x6020` | Unsupported |
`TAP_ENABLE_EXTENDED` | `0x6021` | Unsupported |
`CURSOR_BALLISTIC` | `0x6030` | Unsupported |
`TOUCHPAD_RESOLUTION` | `0x6040` | Unsupported |
`TOUCHPAD_RAW_XY` | `0x6100` | Unsupported |
`TOUCHMOUSE_RAW_POINTS` | `0x6110` | Unsupported |
`TOUCHMOUSE_6120` | `0x6120` | Unsupported |
`GESTURE` | `0x6500` | Unsupported |
`GESTURE_2` | `0x6501` | Partial Support | `Gesture2Gestures`, `Gesture2Params`
`GKEY` | `0x8010` | Partial Support | `DivertGkeys`
`MKEYS` | `0x8020` | Unsupported |
`MR` | `0x8030` | Unsupported |
`BRIGHTNESS_CONTROL` | `0x8040` | Unsupported |
`REPORT_RATE` | `0x8060` | Supported | `ReportRate`
`COLOR_LED_EFFECTS` | `0x8070` | Unsupported |
`RGB_EFFECTS` | `0X8071` | Unsupported |
`PER_KEY_LIGHTING` | `0x8080` | Unsupported |
`PER_KEY_LIGHTING_V2` | `0x8081` | Unsupported |
`MODE_STATUS` | `0x8090` | Unsupported |
`ONBOARD_PROFILES` | `0x8100` | Unsupported |
`MOUSE_BUTTON_SPY` | `0x8110` | Unsupported |
`LATENCY_MONITORING` | `0x8111` | Unsupported |
`GAMING_ATTACHMENTS` | `0x8120` | Unsupported |
`FORCE_FEEDBACK` | `0x8123` | Unsupported |
`SIDETONE` | `0x8300` | Unsupported |
`EQUALIZER` | `0x8310` | Unsupported |
`HEADSET_OUT` | `0x8320` | Unsupported |
A “read only” note means the feature is a read-only feature.
## Implementing a feature
Features are implemented as settable features in
lib/logitech_receiver/settings_templates.py
some features also have direct implementation in
lib/logitech_receiver/hidpp20.py
In most cases it should suffice to only implement the settable feature
interface for each setting in the feature. That will add one or more
widgets in the Solaar main window to show and change the setting,
will permit storing and restoring changed settings, and
will output the feature settings in `solaar show`.
A setting implementation is a subclass of one of the built-in setting classes
illustrated by the pointer speed setting implementation.
```python
class PointerSpeed(_Setting):
name = 'pointer_speed'
label = _('Sensitivity (Pointer Speed)')
description = _('Speed multiplier for mouse (256 is normal multiplier).')
feature = _F.POINTER_SPEED
validator_class = _RangeV
min_value = 0x002e
max_value = 0x01ff
validator_options = {'byte_count': 2}
```
A setting implementation needs a name, a label, and a description.
The name is used in the persistent settings structure to store and restore changed settings and
should be a valid Python identifier. (Some older settings have dashes.)
The label is displayed in the Solaar main window and the description is used as a tooltip there.
The label and description should be specified as translatable strings.
A setting implementation for a feature (for modern devices that use the HID++ 2.0 protocol)
needs a feature identifier.
A setting implementation needs a reader/writer and a validator.
The reader/writer is resposible for actually writing settings to the device
and reading them from the device, writing and reading the byte strings that
represent the setting values on the device.
For most feature settings the setting implementation can just inherit
the standard feature reader/writer, `FeatureRW`.
Options for `FeatureRW` are supplied by the `rw_options` class variable,
which is used to provide command numbers for reading and writing as well
as other information needed to identify the parts of the command and reponse
that hold the setting value and modify the reading and writing procedure.
`PointerSpeed` uses the defaults; here is an example of specifying non-default commands
for reading and writing:
```
rw_options = {'read_fnid': 0x10, 'write_fnid': 0x20}
```
Some old devices use registers instead and the setting needs to use the register reader/writer.
Only implement a register interface for the setting if you are very brave and
you have access to a device that has a register interface for the setting.
Register interfaces cannot be auto-discovered and need to be stated in descriptors.py
for each device with the register interface.
The validator instance is responsible for turning raw values read from the device into Python data
and Python data into raw values to be written to the device and validating that the Python data is
acceptable for the setting.
There are several possible kinds of Python data for setting interfaces,
ranging from simple toggles, to ranges, to fixed lists, to
dynamic choices, to maps of dynamic choices.
Pointer speed is a setting whose values are integers in a range so _RangeV validator is used.
Arguments to validators are specified as class variables.
The _RangeV validator requires the minimum and maximum for the value as separate class variables
and the byte size of the value on the device as part of `validator_options`.
Splitting the minimum and maximum makes it easier for code that works with
settings to determine this information.
Settings that are toggles or choices work similarly,
but their validators have different arguments.
Map settings have more complicated validators and more arguments.
Settings where the acceptable values are determined from the device
subclass the validator and provide a build class method that queries the device
and creates an instance of the validator.
This method can also return `None`, indicating that even though the
device implements the feature it does not usefully support the setting.
Settings need to be added to the `SETTINGS` list so that setting discovery can be done.
For more information on implementing feature settings
see the comments in lib/logitech_receiver/settings_templates.py.

View File

@@ -0,0 +1,2 @@
Documentation on HID++ can be found in the Google drive directory
https://drive.google.com/drive/folders/0BxbRzx7vEV7eWmgwazJ3NUFfQ28

66
docs/i18n.md Normal file
View File

@@ -0,0 +1,66 @@
---
title: Translating Solaar
layout: page
---
# Translating Solaar
First, make sure you have installed the `gettext` package.
Here are the steps to add/update a translation (you should run all scripts from
the source root):
1. Get an up-to-date copy of the source files. Preferably, make a clone on
GitHub and clone it locally on your machine; this way you can later make a
pull request to the main project.
2. Run `./tools/po-update.sh <language>`; it will create/update the file
`./po/<language>.po`.
3. Edit `./po/<language>.po` with your favorite editor (just make sure it saves
the file with the UTF-8 encoding). For each string in English (msgid), edit
the translation (msgstr); if you leave msgstr empty, the string will remain
untranslated.
Alternatively, you can use the excellent `poedit`.
4. Run `./tools/po-compile.sh`. It will bring up-to-date all the compiled
language files, necessary at runtime.
5. Start Solaar (`./bin/solaar`). By default, it will pick up the system language
from your environment; to start it in another language, run
`LANGUAGE=<language> ./bin/solaar`.
You can edit the translation iteratively, just repeat from step 3.
If the upstream changes, do a `git pull` and then repeat from step 2.
Before opening a pull request, please run `./tools/po-update.sh <language>` again. This will
format and sort the translation file, and ensure a minimal diff when updating
a translation.
## Supported languages
Currently Solaar has been translated in the following languages:
- Chinese (Simplified): [Rongrong][Rongronggg9]
- Français: [Papoteur][papoteur], [David Geiger][david-geiger],
[Damien Lallement][damsweb]
- Italiano: [Michele Olivo][micheleolivo]
- Polski: [Adrian Piotrowicz][nexces]
- Portuguese-BR: [Drovetto][drovetto], [Josenivaldo Benito Jr.][jrbenito]
- Română: Daniel Pavel
- Russian: [Dimitriy Ryazantcev][DJm00n]
- Slovak: [Jose Riha][jose1711]
- Svensk: [Daniel Zippert][zipperten], Emelie Snecker
[Rongronggg9]: https://github.com/Rongronggg9
[papoteur]: http://github.com/papoteur
[david-geiger]: http://github.com/david-geiger
[damsweb]: http://github.com/damsweb
[DJm00n]: https://github.com/DJm00n
[jose1711]: https://github.com/jose1711
[nexces]: http://github.com/nexces
[zipperten]: http://github.com/zipperten
[micheleolivo]: http://github.com/micheleolivo
[drovetto]: https://github.com/drovetto
[jrbenito]: https://github.com/jrbenito/

197
docs/index.md Normal file
View File

@@ -0,0 +1,197 @@
---
title: Solaar
layout: default
---
**Solaar** is a Linux manager for many Logitech keyboards, mice, and trackpads
that connect wirelessly to a USB [Unifying][unifying], Bolt, Lightspeed, or Nano receiver,
connect directly via a USB cable, or connect via Bluetooth.
Solaar does not work with peripherals from other companies.
Documentation here is for the current version of Solaar.
Some Linux distributions distribute old versions of Solaar.
If you are using an old version and something described here does not work you should upgrade
using one of the methods described below.
Solaar can be used as a GUI application or via its command-line interface.
Both interfaces are able to list the connected devices and
show information about each device, often including battery status.
Solaar is able to pair and unpair devices with
receivers as supported by the device and receiver.
Solaar can also control some changeable settings of devices,
such as scroll wheel direction and function key behavior.
Solaar keeps track of most of these settings on a per-computer basis,
because devices forget most settings when powered down,
and the GUI application restores them whenever a device connects.
For more information on how to use Solaar see
[the usage page](https://pwr-solaar.github.io/Solaar/usage),
and for more information on its capabilities see
[the capabilities page](https://pwr-solaar.github.io/Solaar/capabilities).
Solaar's GUI normally uses an icon in the system tray and starts with its main window visible.
This aspect of Solaar depends on having an active system tray, which is not the default
situation for recent versions of Gnome. For information on to set up a system tray under Gnome see
[the capabilities page](https://pwr-solaar.github.io/Solaar/capabilities).
Solaar's GUI can be started in several ways
- `--window=show` (the default) starts with its main window visible,
- `--window=hide` starts with its main window hidden,
- `--window=only` does not use the system tray, and starts with main window visible.
For more information on Solaar's command-line interface use the help option,
as in `solaar --help`.
Solaar does not process normal input from devices. It is thus unable
to fix problems that arise from incorrect handling of mouse movements or keycodes
by Linux drivers or other software.
Solaar has progressed past version 1.1. Problems with earlier versions should
not be reported as bugs. Instead, upgrade to a recent version or manually install
the current version from [GitHub](https://github.com/pwr-Solaar/Solaar).
Some capabilities of Solaar have been developed by observing the behavior of
Logitech receivers and devices and generalizing from these observations.
If your Logitech receiver or device behaves strangely this may be caused by
an incorrect behavior generalization.
Please report such experiences by creating an issue in
[the Solaar repository](https://github.com/pwr-Solaar/Solaar/issues).
[unifying]: https://en.wikipedia.org/wiki/Logitech_Unifying_receiver
## Supported Devices
Solaar will detect all devices paired with supported Unifying, Bolt, Lightspeed, or Nano
receivers, and at the very least display some basic information about them.
Solaar will detect some Logitech devices that connect via a USB cable or Bluetooth.
Solaar can pair and unpair a Logitech device showing the Unifying logo
(Solaar's version of the [logo][logo])
with any Unifying receiver,
and pair and unpair a Logitech device showing the Bolt logo
with any Bolt receiver,
and
can pair and unpair Lightspeed devices with Lightspeed receivers for the same model.
Solaar can pair some Logitech devices with Logitech Nano receivers but not all Logitech
devices can be paired with Nano receivers.
Logitech devices without a Unifying or Bolt logo
generally cannot be paired with Unifying or Bolt receivers.
Solaar does not handle connecting or disconnecting via Bluetooth,
which is done using the usual Bluetooth mechanisms.
For a partial list of supported devices
and their features, see [the devices page](https://pwr-solaar.github.io/Solaar/devices).
[logo]: https://pwr-solaar.github.io/Solaar/assets/solaar.svg
## Prebuilt packages
Up-to-date prebuilt packages are available for some Linux distros
(e.g., Fedora 33+) 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 [community repository][arch]
- Ubuntu/Kubuntu 16.04+: use the solaar package from [universe repository][universe repository]
- Ubuntu/Kubuntu stable packages: use the [Solaar stable ppa][ppa2], courtesy of [gogo][ppa4]
- Ubuntu/Kubuntu git build packages: use the [Solaar git ppa][ppa1], courtesy of [gogo][ppa4]
- a [Gentoo package][gentoo], courtesy of Carlos Silva and Tim Harder
- a [Mageia package][mageia], courtesy of David Geiger
Solaar uses a standard system tray implementation; solaar-gnome3 is no longer required for gnome or unity integration.
[ppa4]: https://launchpad.net/~trebelnik-stefina
[ppa2]: https://launchpad.net/~solaar-unifying/+archive/ubuntu/stable
[ppa1]: https://launchpad.net/~solaar-unifying/+archive/ubuntu/ppa
[ppa]: http://launchpad.net/~daniel.pavel/+archive/solaar
[arch]: https://www.archlinux.org/packages/community/any/solaar/
[gentoo]: https://packages.gentoo.org/packages/app-misc/solaar
[mageia]: http://mageia.madb.org/package/show/release/cauldron/application/0/name/solaar
[universe repository]: http://packages.ubuntu.com/search?keywords=solaar&searchon=names&suite=all&section=all
## Manual installation
See [the installation page](https://pwr-solaar.github.io/Solaar/installation)
for the step-by-step procedure for manual installation.
## Known Issues
- If some icons appear broken in the application, make sure you've properly
configured the Gtk theme and icon theme in your control panel.
- Solaar normally uses icon names for its icons, which in some system tray implementatations
results in missing or wrong-sized icons.
The `--tray-icon-size` option forces Solaar to use icon files of appropriate size
for tray icons instead, which produces better results in some system tray implementatations.
To use icon files close to 32 pixels in size use `--tray-icon-size=32`.
- The icon in the system tray can show up as 'black on black' in dark
themes or as non-symbolic when the theme uses symbolic icons. This is due to problems
in some system tray implementations. Changing to a different theme may help.
The `--battery-icons=symbolic` option can be used to force symbolic icons.
- Sometimes the system tray icon does not show up. The cause of this is unknown.
Either wait a while and try again or try with the `--window=hide` option.
- Running the command-line application while the GUI
application is also running *may* occasionally cause either of them to become
confused about the state of the devices.
- Some Linux drivers view or modify the setting Scroll Wheel Resolution to
implement smooth scrolling. If Solaar changes this setting after the driver is
set up scrolling can be either very fast or very slow. To fix this problem
click on the icon at the right edge of the setting to set it to
"Ignore this setting".
The mouse has to be reset (e.g., by turning it off and on again) before this fix will take effect.
- Many gaming mice and keyboards have the ONBOARD PROFILES feature.
This feature can override other features, including polling rate and key lighting.
To make the Polling Rate and M-Key LEDs settings effective the Onboard Profiles setting has to be disabled.
This may have other effects, such as turning off backlighting.
- Solaar will try to use uinput to simulate input from rules if Xtest is not available
but this needs write permission on /dev/uinput.
For more information see [the rules page](https://pwr-solaar.github.io/Solaar/rules).
## Contributing to Solaar
Conributions to Solaaar are very welcome.
Solaar has complete or partial translations of its GUI strings into several languages.
If you want to update a translation or add a new one see
[the translation page](https://pwr-solaar.github.io/Solaar/i18n) for moe information.
If you find a bug and have a fix for it, please open a bug issue and also a GitHub pull request.
Label your commits using the naming conventions in recent commits to Solaar.
If you want to enhance Solaar open an enhancement issue to discuss your proposal.
There are also usually several open issues for enhancements that have already been requested.
## License
This software is distributed under the terms of the
[GNU Public License, v2](COPYING).
## Thanks
This project began as a third-hand clone of [Noah K. Tilton](https://github.com/noah)'s
logitech-solar-k750 project on GitHub (no longer available). It was developed
further thanks to the diggings in Logitech's HID++ protocol done by many other
people:
- [Julien Danjou](http://julien.danjou.info/blog/2012/logitech-k750-linux-support),
who also provided some internal
[Logitech documentation](http://julien.danjou.info/blog/2012/logitech-unifying-upower)
- [Lars-Dominik Braun](http://6xq.net/git/lars/lshidpp.git)
- [Alexander Hofbauer](http://derhofbauer.at/blog/blog/2012/08/28/logitech-performance-mx)
- [Clach04](http://bitbucket.org/clach04/logitech-unifying-receiver-tools)
- [Peter Wu](https://lekensteyn.nl/logitech-unifying.html)
- [Nestor Lopez Casado](http://drive.google.com/folderview?id=0BxbRzx7vEV7eWmgwazJ3NUFfQ28)
provided some more Logitech specifications for the HID++ protocol
Also, thanks to Douglas Wagner, Julien Gascard, and Peter Wu for helping with
application testing and supporting new devices.

113
docs/installation.md Normal file
View File

@@ -0,0 +1,113 @@
---
title: Manual Installation
layout: page
---
# Manual installation
## Downloading
Clone Solaar from GitHub by `git clone https://github.com/pwr-Solaar/Solaar.git`
## Requirements for Solaar
Installing Solaar from a repository should have set up all these requirements
so in this situation you should be able to skip this section.
Solaar needs a reasonably new kernel with kernel modules `hid-logitech-dj`
and `hid-logitech-hidpp` loaded.
Most of Solaar should work fine with any kernel more recent than 5.2,
but newer kernels might be needed for some devices to be correctly recognized and handled.
The `udev` package must be installed and its daemon running.
Solaar requires Python 3.6+ and requires several packages to be installed.
If you are running the system version of Python you should have the
`python3-pyudev`, `python3-psutil`, `python3-xlib`, `python3-evdev`,
and `python3-yaml` or `python3-pyyaml` packages installed.
To run the GUI Solaar also requires Gtk3 and its GObject introspection bindings.
If you are running the system version of Python
the Debian/Ubuntu packages you should have
`python3-gi` and `gir1.2-gtk-3.0` installed.
in Fedora you need `gtk3` and `python3-gobject`.
You may have to install `gcc` and the Python development package (`python3-dev` or `python3-devel`,
depending on your distribution).
If you are running a version of Python different from the system version,
you may need to use pip to install projects that provide the above Python packages.
If desktop notifications bindings are also installed
(`gir1.2-notify-0.7` for Debian/Ubuntu),
you will also see desktop notifications when devices come online/go offline.
For GNOME Shell/Budgie Desktop/KDE/XFCE support, you also need to have
`gir1.2-ayatanaappindicator3-0.1` installed in Debian/Ubuntu. Although it is
recommended to install and use `gir1.2-ayatanaappindicator3-0.1` if it is
available, you can also use `gir1.2-appindicator3-0.1` if necessary (e.g.,
for Unity in Ubuntu).
### Installing Solaar's udev rule
Solaar needs to write to HID devices for receivers and devices.
To be able to do this without running as root requires a udev rule
that gives seated users write access to the HID devices for Logitech receiver and devices.
You can install this rule by copying, as root,
`rules.d/42-logitech-unify-permissions.rules` from Solaar to
`/etc/udev/rules.d`.
You will probably also have to tell udev to reload its rule via
`sudo udevadm control --reload-rules`.
For this rule to set up the correct permissions for your receivers and devices
you will then need to either disconnect your receivers and
any USB-connected or Bluetooth-connected devices and
re-connect them or reboot your computer.
## Running from the Download Directories
To run Solaar from the download directories, first install the Solaar udev rule if necessary.
Then cd to the solaar directory and run `bin/solaar` for the GUI
or `bin/solaar <command> <arguments>` for the CLI.
Do not run Solaar as root, you may encounter problems with X11 integration and with the system tray.
## Installing Solaar Using Pip
Python programs are usually installed using [pip][pip].
The pip instructions for Solaar are in `setup.py`, the standard place to put such instructions.
To install Solaar for yourself only run `pip install --user .` from the solaar directory.
This tells pip to install into your `.local` directory, but does not install Solaar's udev rule.
(See above for installing the udev rule.)
Once the udev rule has been installed you can then run Solaar as `~/.local/bin/solaar`.
Installing python programs to system directories using pip is generally frowned on both
because this runs arbitrary code as root and because this can override existing python libraries
that other users or even the system depend on. If you want to install solaar to /usr/local run
`sudo bash -c 'umask 022 ; pip install .'` in the solaar directory.
(The umask is needed so that the created files and directories can be read and executed by everyone.)
Then solaar can be run as /usr/local/bin/solaar.
You will also have to install the udev rule.
[pip]: https://en.wikipedia.org/wiki/Pip_(package_manager)
## Solaar in other languages
If you want to have Solaar's user messages in some other language you need to run
`tools/po-compile.sh` to create the translation files before running or installing Solaar
and set the LANGUAGE environment variable appropriately when running Solaar.
## Running Solaar at Startup
Distributions can cause Solaar can be run automatically at user login by installing a desktop file at
`/etc/xdg/autostart/solaar.desktop`. An example of this file content can be seen in the repository at
[share/autostart/solaar.desktop](https://github.com/pwr-Solaar/Solaar/blob/master/share/autostart/solaar.desktop).
If you install Solaar yourself you may need to create or modify this file or install a startup file under your home directory.
## Installing from PyPI
As an alternative to downloading and installing you can install the most recent release
(but not the current github version) of Solaar from PyPI.
Just run `pip install --user solaar`.
This will not install the Solaar udev rule, which you will need to copy from
`~/.local/share/solaar/udev-rules.d/42-logitech-unify-permissions.rules`
to `/etc/udev/rules.d` as root.

240
docs/rules.md Normal file
View File

@@ -0,0 +1,240 @@
---
title: Rule Processing of HID++ Notifications
layout: page
---
Creating and editing most rules can be done in the Solaar GUI, by pressing the 'Rule Editor' button in the
Solaar main window.
Rule processing is an experimental feature. Significant changes might be made in response to problems.
*Note that rule processing only fully works under X11.
When running under Wayland with X11 libraries loaded some features will not be available.
When running under Wayland without X11 libraries loaded even more features will not be available.
Rule features known not to work under Wayland include process and mouse process conditions.
Under Wayland using keyboard groups may result in incorrect symbols being input for simulated input.
Under Wayland simulating inputs when modifier keys are pressed may result in incorrect symbols being input.
Simulated input uses Xtest if available or uinput if the user has write access to /dev/uinput.
To get access to /dev/uinput run `sudo setfacl -m u:${user}:rw /dev/uinput`*
Logitech devices that use HID++ version 2.0 or greater produce feature-based
notifications that Solaar can process using a simple rule language. For
example, using rules Solaar can emulate an `XF86_MonBrightnessDown` key tap
in response to the pressing of the `Brightness Down` key on Craft keyboards,
which normally does not produce any input at all when the keyboard is in
Windows mode.
Solaar's rules only trigger on HID++ notifications so device actions that
normally produce HID output have to be first be set (diverted) to
produce HID++ notifications instead of their normal behavior.
Currently Solaar can divert some mouse scroll wheels, some
mouse thumb wheels, the crown of Craft keyboards, and some keys and buttons.
If the scroll wheel, thumb wheel, crown, key, or button is
not diverted by setting the appropriate setting then no HID++ notification is
generated and rules will not be triggered by manipulating the wheel, crown, key, or button.
Look for `HID++` or `Diversion` settings to see what
diversion can be done with your devices.
Running Solaar with the `-ddd`
option will show information about notifications, including their feature
name, report number, and data.
Solaar can also create special notifications in response to mouse movements on some mice.
Setting the `Mouse Gestures` setting to a key enables special processing of mouse movements
while the key is depressed. Moving the mouse creates a mouse movement event.
Stopping the mouse for a little while and moving it again creates another mouse movement event.
Pressing a diverted key creates a key event.
When the key is released the sequence of events is sent as a synthetic notification
that can be matched with `Mouse Gesture` conditions.
In response to a feature-based HID++ notification Solaar runs a sequence of
rules. A `Rule` is a sequence of components, which are either sub-rules,
conditions, or actions. Conditions and actions are dictionaries with one
entry whose key is the name of the condition or action and whose value is
the argument of the action.
If the last thing that a rule does is execute an action, no more rules are
processed for the notification.
Rules are evaluated by evaluating each of their components in order. The
evaluation of a rule is terminated early if a condition component evaluates
to false or the last evaluated sub-component of a component is an action. A
rule is false if its last evaluated component evaluates to a false value.
`Not` conditions take a single component and are true if their component
evaluates to a false value.
`Or` conditions take a sequence of components and are evaluated by
evaluating each of their components in order.
An Or condition is terminated early if a component evaluates to true or the
last evaluated sub-component of a component is an action.
A Or condition is true if its last evaluated component evaluates to a true
value. `And` conditions take a sequence of components are evaluted the same
as rules.
`Feature` conditions are if true if the name of the feature of the current
notification is their string argument.
`Report` conditions are if true if the report number in the current
notification is their integer argument.
`Key` conditions are true if the Logitech name of the last diverted key or button pressed is their
string argument. Alternatively, if the argument is a list `[name, action]` where `action`
is either `'pressed'` or `'released'`, the key down or key up events of `name` argument are
matched, respectively. Logitech key and button names are shown in the `Key/Button Diversion`
setting. Some keyboards have Gn, Mn, or MR keys, which are diverted using the 'Divert G Keys' setting.
`Modifiers` conditions take either a string or a sequence of strings, which
can only be `Shift`, `Control`, `Alt`, and `Super`.
Modifiers conditions are true if their argument is the current keyboard
modifiers.
`Process` conditions are true if the process for focus input window
or the window's Window manager class or instance name starts with their string argument.
`MouseProcess` conditions are true if the process for the window under the mouse
or the window's Window manager class or instance name starts with their string argument.
`Setting` conditions checks the value of a Solaar setting on a device.
`Setting` conditions take three or four arguments, depending on the setting:
the Serial number or Unit ID of a device, as shown in Solaar's detail pane,
or null for the device that initiated rule processing;
the internal name of a setting (which can be found from solaar config <device>);
one or two arguments for the setting.
For settings that use keys or buttons as an argument the Logtech name can be used
as shown in the Solaar main window for these settings,
or the numeric value for the key or button.
For settings that use gestures as an argument the internal name of the gesture is used,
which can be found in the GESTURE2_GESTURES_LABELS structure in lib/logitech_receiver/settings_templates.
For settings that need one of a set of names as an argument the name can be used or its internal integer value,
as used in the Solaar config file.
`Test` and `TestBytes` conditions are true if their test evaluates to true on the feature,
report, and data of the current notification.
`TestBytes` conditions can return a number instead of a boolean.
`TestBytes` conditions consist of a sequence of three or four integers and use the first
two to select bytes of the notification data.
Writing this kind of test condition is not trivial.
Three-element `TestBytes` conditions are true if the selected bytes bit-wise anded
with its third element is non-zero.
The value of these test conditions is the result of the and.
Four-element `TestBytes` conditions are true if the selected bytes form a signed
integer between the third and fourth elements.
The value of these conditions is the signed value of the selected bytes
if that is non-zero otherwise True.
`Test` conditions are mnemonic shorthands for meaningful feature,
report, and data combinations in notifications.
A `crown_right` test is the rotation amount of a `CROWN` right rotation notification.
A `crown_left` test is the rotation amount of a `CROWN` left rotation notification.
A `crown_right_ratchet` test is the ratchet amount of a `CROWN` right ratchet rotation notification.
A `crown_left_ratchet` test is the ratchet amount of a `CROWN` left ratchet rotation notification.
A `crown_tap` test is true for a `CROWN` tap notification.
A `crown_start_press` test is true for the start of a `CROWN` press notification.
A `crown_stop_press` test is true for the end of a `CROWN` press notification.
A `crown_pressed` test is true for a `CROWN` notification with the Crown pressed.
A `thumb_wheel_up` test is the rotation amount of a `THUMB WHEEL` upward rotation notification.
A `thumb_wheel_down` test is the rotation amount of a `THUMB WHEEL` downward rotation notification.
`lowres_wheel_up`, `lowres_wheel_down`, `hires_wheel_up`, `hires_wheel_down` are the
same but for `LOWRES WHEEL` and `HIRES WHEEL`.
`True` and `False` tests return True and False, respectively.
`Mouse Gesture` conditions are true if the actions taken while the mouse's 'Gesture' button is held match the configured list when the 'Gesture' button is released.
The available actions are `Mouse Up`, `Mouse Down`, `Mouse Left`, `Mouse Right`, `Mouse Up-left`, `Mouse Up-Right`, `Mouse Down-left`, `Mouse Down-right`, and buttons that are diverted.
An example would be mapping `Mouse Up` -> `Mouse Up`. To perform this gesture, you would hold down the 'Gesture' button, move the mouse upwards, pause momentarily, move the mouse upwards, and release the 'Gesture' button.
Another example would be mapping `Back Button` -> `Back Button`. With this one, you would hold down the 'Gesture' button, double-tap the 'Back' button, and then release the 'Gesture' button.
Mouse movements and buttons can be mixed and chained together however you like.
It's possible to create a `No-op` gesture by clicking 'Delete' on the initial Action when you first create the rule. This gesture will trigger when you simply click the 'Gesture' button.
`Setting` conditions check device settings of devices, provided the device is on-line.
The first arguments to the condition are the Serial number or Unit ID of a device, as shown in Solaar's detail pane,
or null for the device that initiated rule processing; and
the internal name of a setting (which can be found from solaar config <device>).
Most simple settings take one extra argument, the value to check the setting value against.
Range setting can also take two arguments, which form an inclusive range to check against.
Other settings take two arguments, a key indicating which sub-setting to check and the value to check it against.
For settings that use gestures as an argument the internal name of the gesture is used,
which can be found in the GESTURE2_GESTURES_LABELS structure in lib/logitech_receiver/settings_templates.
For boolean settings '~' can be used to toggle the setting.
A `KeyPress` action takes a sequence of X11 key symbols and simulates a chorded keypress on the keyboard, such as "A", "Shift+A", or "Control+A".
Any key symbols that correspond to modifier keys that are in the current keyboard modifiers are ignored.
Use separate `KeyPress` actions for multiple characters.
A `MouseScroll` action takes a sequence of two numbers and simulates a horizontal and vertical mouse scroll of these amounts.
If the previous condition in the parent rule returns a number the scroll amounts are multiplied by this number.
A `MouseClick` action takes a mouse button name (`left`, `middle` or `right`) and a positive number, and simulates that number of clicks of the specified button.
An `Execute` action takes a program and arguments and executes it asynchronously.
A `Set` action changes a Solaar setting for a device, provided that the device is on-line.
`Set` actions take three or four arguments, depending on the setting.
The first two are the Serial number or Unit ID of a device, as shown in Solaar's detail pane,
or null for the device that initiated rule processing; and
the internal name of a setting (which can be found from solaar config <device>).
Simple settings take one extra argument, the value to set the setting to.
For boolean settings '~' can be used to toggle the setting.
Other simple settings take two extra arguments, a key indicating which sub-setting to set and the value to set it to.
For settings that use gestures as an argument the internal name of the gesture is used,
which can be found in the GESTURE2_GESTURES_LABELS structure in lib/logitech_receiver/settings_templates.
All settings are supported.
Solaar has several built-in rules, which are run after user-created rules and so can be overridden by user-created rules.
One rule turns
`Brightness Down` key press notifications into `XF86_MonBrightnessDown` key taps
and `Brightness Up` key press notifications into `XF86_MonBrightnessUp` key taps.
Another rule makes Craft crown ratchet movements move between tabs when the crown is pressed
and up and down otherwise.
A third rule turns Craft crown ratchet movements into `XF86_AudioNext` or `XF86_AudioPrev` key taps when the crown is pressed and `XF86_AudioRaiseVolume` or `XF86_AudioLowerVolume` otherwise.
A fourth rule doubles the speed of `THUMB WHEEL` movements unless the `Control` modifier is on.
All of these rules are only active if the key or feature is diverted, of course.
Solaar reads rules from a YAML configuration file (normally `~/.config/solaar/rules.yaml`).
This file contains zero or more documents, each a rule.
Here is a file with six rules:
```
%YAML 1.3
---
- Key: [M2, pressed]
- Set: [198E3EB8, dpi, 3000]
- Execute: [notify-send, Incresed mouse speed]
...
---
- Key: [Host Switch Channel 2, pressed]
- Set: [43DAF041, change-host, 1]
- Set: [198E3EB8, change-host, 1]
- Execute: [notify-send, Switched to host 2]
...
---
- MouseGesture: [Mouse Up, Mouse Down]
- Execute: [notify-send, Locking]
- Execute: xflock4
...
- Feature: CROWN
- Process: quodlibet
- Rule: [ Test: crown_start_press, KeyPress: XF86_AudioMute ]
- Rule: [ Test: crown_pressed, Test: crown_right_ratchet, KeyPress: XF86_AudioNext ]
- Rule: [ Test: crown_pressed, Test: crown_left_ratchet, KeyPress: XF86_AudioPrev ]
- Rule: [ Test: crown_right_ratchet, KeyPress: XF86_AudioRaiseVolume ]
- Rule: [ Test: crown_left_ratchet, KeyPress: XF86_AudioLowerVolume ]
...
---
- Feature: THUMB WHEEL
- Rule: [ Modifiers: Control, Test: thumb_wheel_up, MouseScroll: [-2, 0] ]
- Rule:
- Modifiers: Control
- Test: thumb_wheel_down
- MouseScroll: [-2, 0]
- Rule: [ Or: [ Test: thumb_wheel_up, Test: thumb_wheel_down ], MouseScroll: [-1, 0] ]
...
---
- Feature: LOWRES WHEEL
- Rule: [ Or: [ Test: lowres_wheel_up, Test: lowres_wheel_down ], MouseScroll: [0, 2] ]
...
```
Here is an example showing how to divert the Back Button on an MX Master 3 so that pressing
the button will initiate rule processing and a rule that triggers on this notification and
switches the mouse to host 3 after popping up a simple notification.
![Solaar-divert-back](Solaar-main-window-back-divert.png)
![Solaar-rule-back-host](Solaar-rule-editor.png)

176
docs/usage.md Normal file
View File

@@ -0,0 +1,176 @@
---
title: Solaar Usage
layout: page
---
# Solaar usage
Under normal usage Solaar creates an icon in your system tray. This icon is
usually a battery icon showing the approximate battery level for your device
with the lowest known battery level. If there are no devices with battery information,
then the icon is one of the Solaar icons.
Solaar also has a main window. When the main window is invisible,
click on the icon in the system tray to bring up the menu, and then
click on a receiver or device in the menu to see information about
that receiver or device.
The following is an image of the Solaar menu and the icon (the battery
symbol is in the system tray at the left of the image). The icon can
also be other battery icons or versions of the Logitech Unifying icon.
![Solaar-menu](Solaar-menu.png)
Clicking on “Quit” in the Solaar menu terminates the program, and “About Solaar” pops up a window with further information.
## Solaar options
There are several options that affect how Solaar behaves:
* `--help` shows a help message and then quits
* `---window=show` starts Solaar with the main window showing
* `---window=hide` starts Solaar with the main window not showing
* `---window=only` starts Solaar with no system tray icon and the main window showing
* `--battery-icons=symbolic` uses symbolic icons for battery levels
## Solaar main window
The Solaar main window shows your Logitech receivers and devices that Solaar
knows about and can be used to pair new devices, unpair paired devices, and
view and change some settings of the selected receiver or device.
To select a receiver or device click on it in the left side of the window.
Closing the main window does not terminate Solaar (unless Solaar is not using the system tray).
Clicking on “Quit Solaar” terminates the program, and “About Solaar” pops up a window with further information.
The light bulb (or a similar icon) displays detailed information
about the selected receiver or device (useful for debugging).
### Pairing and unpairing devices
When a receiver is selected in the main window, you can pair a new device by
clicking on the “Pair new device” button.
Then turn on the device and it should pair with the receiver if that is possible
and the device is not already paired with another active receiver.
For multi-host devices first select the host position that you want.
Bolt devices and some Lightspeed devices pair by pressing a special pairing button.
To pair with a Bolt receiver you have to type a passcode followed by enter
or click the left and right buttons in the correct sequence followed by
clicking both buttons simultaneously.
![Solaar-main-window-receiver](Solaar-main-window-receiver.png)
When a device is selected you can unpair the device if your receiver supports
unpairing. To unpair the device, just click on the “Unpair” button and
confirm in the window that pops up.
A receiver with the Unifying logo should be able to pair with any device
with the Unifying logo
and a receiver with the Bolt logo should be able to pair with any device
with the Bolt logo.
If there are no open pairing slots, however, you will
not be able to pair a new device. In this case to pair a new device you
first need to unpair a device.
Other receivers can only pair with certain kinds of devices.
Most of these receivers do not allow unpairing - instead
pairing a new device replaces an existing paired device of the same kind.
Some receivers can only pair a limited number of times.
### Viewing and changing device settings
When a device is selected you can see the approximate battery level of the
device, if that is reported by the device, and the status of the link
between the device and its receiver.
You can also see and change the settings of devices.
Changing settings is performed by clicking on buttons,
moving sliders, or selecting from alternatives.
![Solaar-main-window-keyboard](Solaar-main-window-keyboard.png)
![Solaar-main-window-mouse](Solaar-main-window-mouse.png)
Device setings now have a clickable icon that determines whether the
setting can be changed and whether the setting is ignored.
![Solaar-divert-back](Solaar-main-window-back-divert.png)
If the selected device that is paired with a receiver is powered down or
otherwise disconnected its settings cannot be changed
but it still can be unpaired if its receiver allows unpairing.
![Solaar-main-window-offline](Solaar-main-window-offline.png)
If a device is paired with a receiver but directly connected via USB or Bluetooth
the receiver pairing will show up as well as the direct connection.
The device can only be manipulated using the direct connection.
![Solaar-main-window-multiple](Solaar-main-window-multiple.png)
#### Remapping key and button actions
For many devices Solaar can remap some of their keys or buttons to
perform a different action. (This changes the information that the
device sends when the key or button is activated.) Only some keys on some
devices can be remapped and they can only be remapped to a limited
number of actions. The remapping is done by selecting a key
or button in the left-hand box on the “Action” setting line and then
selecting the action to be performed in the right-hand box. The default
action is always the shown first in the list. As with all settings,
Solaar will remember past action settings and restore them on the device
from then on.
![Solaar-main-window-actions](Solaar-main-window-button-actions.png)
The names of the keys, buttons, and actions are mostly taken from Logitech
documentation and may not be completely obvious.
It is possible to end up with an unusable system, for example by having no
way to do a mouse left click, so exercise caution when remapping keys or
buttons that are needed to operate your system.
## Solaar command line interface
Solaar also has a command line interface that can do most of what can be
done using the main window. For more information on the
command line interface, run `solaar --help` to see the commands and
then `solaar <command> --help` to see the arguments to any of the commands.
## Solaar settings
Solaar supports at least the following settings:
Setting | Description
---------------------------------|------------
Hand Detection | Turn on backlight when your hands hover over the keyboard
Scroll Wheel Smooth Scrolling | Higher-speed vertical scrolling
Side Scrolling | When off, side scrolling sends custom button events
Scroll Wheel High Resolution | Higher-speed vertical scrolling
Scroll Wheel HID++ Scrolling | When on, vertical scrolling uses HID++ events
Scroll Wheel Direction | Reverse direction of vertical scrolling
Scroll Wheel Resolution | Higher-speed vertical scrolling (use with caution)
Scroll Wheel Rachet | Shift wheel ratchet on and off based on wheel speed
Thumb Wheel HID++ Scrolling | When on, thumb-wheel scrolling uses HID++ events
Thumb Wheel Direction | Reverse direction of thumb-wheel scrolling
Sensitivity (DPI) | Mouse movement sensitivity
Sensitivity (Pointer Speed) | Mouse movement sensitivity
Backlight | Turn on backlight
Swap Fx function | Change Fn keys to normally do their special action
DPI Sliding Adjustment | Change Sensitivity (DPI) by holding a button and moving the mouse
Mouse Gestures | Create HID++ events by holding a button and moving the mouse
Key/Button Actions | Change what a key or button does
Key/Button Diversion | Divert keys and buttons to create HID++ events
Divert crown events | Divert crown actions to create HID++ events
Divert G Keys | Divert G keys to create HID++ events
Disable keys | Disable one or more keys
Set OS | Change keys to match OS
Change Host | Connect to a different host
Gestures | Turn on and off various (mostly touchpad) gestures
Gesture params | Modify parameters for gestures
HID++ events are mostly not processed by Linux input drivers.
Settings that involve sending HID++ events exist so that these events can be
processed by Solaar rules instead of by Linux.
Different Logitech devices may implement the same functionality in different ways,
thus the different settings that do the same thing.

429
docs/usb.ids.txt Normal file
View File

@@ -0,0 +1,429 @@
#
# List of USB ID's
#
# Maintained by Stephen J. Gowdy <linux.usb.ids@gmail.com>
# If you have any new entries, please submit them via
# http://www.linux-usb.org/usb-ids.html
# or send entries as patches (diff -u old new) in the
# body of your email (a bot will attempt to deal with it).
# The latest version can be obtained from
# http://www.linux-usb.org/usb.ids
#
# Version: 2019.11.05
# Date: 2019-11-05 20:34:06
#
# Vendors, devices and interfaces. Please keep sorted.
# Syntax:
# vendor vendor_name
# device device_name <-- single tab
# interface interface_name <-- two tabs
046d Logitech, Inc.
0082 Acer Aspire 5672 Webcam
0200 WingMan Extreme Joystick
0203 M2452 Keyboard
0242 Chillstream for Xbox 360
0301 M4848 Mouse
0401 HP PageScan
0402 NEC PageScan
040f Logitech/Storm PageScan
0430 Mic (Cordless)
0801 QuickCam Home
0802 Webcam C200
0804 Webcam C250
0805 Webcam C300
0807 Webcam B500
0808 Webcam C600
0809 Webcam Pro 9000
080a Portable Webcam C905
080f Webcam C120
0810 QuickCam Pro
0819 Webcam C210
081a Webcam C260
081b Webcam C310
081d HD Webcam C510
0820 QuickCam VC
0821 HD Webcam C910
0823 HD Webcam B910
0825 Webcam C270
0826 HD Webcam C525
0828 HD Webcam B990
082b Webcam C170
082c HD Webcam C615
082d HD Pro Webcam C920
0830 QuickClip
0836 B525 HD Webcam
0837 BCC950 ConferenceCam
0840 QuickCam Express
0843 Webcam C930e
0850 QuickCam Web
085c C922 Pro Stream Webcam
0870 QuickCam Express
0890 QuickCam Traveler
0892 OrbiCam
0894 CrystalCam
0895 QuickCam for Dell Notebooks
0896 OrbiCam
0897 QuickCam for Dell Notebooks
0899 QuickCam for Dell Notebooks
089d QuickCam E2500 series
08a0 QuickCam IM
08a1 QuickCam IM with sound
08a2 Labtec Webcam Pro
08a3 QuickCam QuickCam Chat
08a6 QuickCam IM
08a7 QuickCam Image
08a9 Notebook Deluxe
08aa Labtec Notebooks
08ac QuickCam Cool
08ad QuickCam Communicate STX
08ae QuickCam for Notebooks
08af QuickCam Easy/Cool
08b0 QuickCam 3000 Pro [pwc]
08b1 QuickCam Notebook Pro
08b2 QuickCam Pro 4000
08b3 QuickCam Zoom
08b4 QuickCam Zoom
08b5 QuickCam Sphere
08b9 QuickCam IM
08bd Microphone (Pro 4000)
08c0 QuickCam Pro 3000
08c1 QuickCam Fusion
08c2 QuickCam PTZ
08c3 Camera (Notebooks Pro)
08c5 QuickCam Pro 5000
08c6 QuickCam for DELL Notebooks
08c7 QuickCam OEM Cisco VT Camera II
08c9 QuickCam Ultra Vision
08ca Mic (Fusion)
08cb Mic (Notebooks Pro)
08cc Mic (PTZ)
08ce QuickCam Pro 5000
08cf QuickCam UpdateMe
08d0 QuickCam Express
08d7 QuickCam Communicate STX
08d8 QuickCam for Notebook Deluxe
08d9 QuickCam IM/Connect
08da QuickCam Messenger
08dd QuickCam for Notebooks
08e0 QuickCam Express
08e1 Labtec Webcam
08f0 QuickCam Messenger
08f1 QuickCam Express
08f2 Microphone (Messenger)
08f3 QuickCam Express
08f4 Labtec Webcam
08f5 QuickCam Messenger Communicate
08f6 QuickCam Messenger Plus
0900 ClickSmart 310
0901 ClickSmart 510
0903 ClickSmart 820
0905 ClickSmart 820
0910 QuickCam Cordless
0920 QuickCam Express
0921 Labtec Webcam
0922 QuickCam Live
0928 QuickCam Express
0929 Labtec Webcam Pro
092a QuickCam for Notebooks
092b Labtec Webcam Plus
092c QuickCam Chat
092d QuickCam Express / Go
092e QuickCam Chat
092f QuickCam Express Plus
0950 Pocket Camera
0960 ClickSmart 420
0970 Pocket750
0990 QuickCam Pro 9000
0991 QuickCam Pro for Notebooks
0992 QuickCam Communicate Deluxe
0994 QuickCam Orbit/Sphere AF
09a1 QuickCam Communicate MP/S5500
09a2 QuickCam Communicate Deluxe/S7500
09a4 QuickCam E 3500
09a5 Quickcam 3000 For Business
09a6 QuickCam Vision Pro
09b0 Acer OrbiCam
09b2 Fujitsu Webcam
09c0 QuickCam for Dell Notebooks Mic
09c1 QuickCam Deluxe for Notebooks
0a01 USB Headset
0a02 Premium Stereo USB Headset 350
0a03 Logitech USB Microphone
0a04 V20 portable speakers (USB powered)
0a07 Z-10 Speakers
0a0b ClearChat Pro USB
0a0c Clear Chat Comfort USB Headset
0a13 Z-5 Speakers
0a14 USB Headset
0a15 G35 Headset
0a17 G330 Headset
0a1f G930
0a29 H600 [Wireless Headset]
0a37 USB Headset H540
0a38 Headset H340
0a44 Headset H390
0a45 960 Headset
0a4d G430 Surround Sound Gaming Headset
0a5b G933 Wireless Headset Dongle
0a66 [G533 Wireless Headset Dongle]
0b02 C-UV35 [Bluetooth Mini-Receiver] (HID proxy mode)
8801 Video Camera
b014 Bluetooth Mouse M336/M337/M535
b305 BT Mini-Receiver
bfe4 Premium Optical Wheel Mouse
c000 N43 [Pilot Mouse]
c001 N48/M-BB48/M-UK96A [FirstMouse Plus]
c002 M-BA47 [MouseMan Plus]
c003 MouseMan
c004 WingMan Gaming Mouse
c005 WingMan Gaming Wheel Mouse
c00b MouseMan Wheel
c00c Optical Wheel Mouse
c00d MouseMan Wheel+
c00e M-BJ58/M-BJ69 Optical Wheel Mouse
c00f MouseMan Traveler/Mobile
c011 Optical MouseMan
c012 Mouseman Dual Optical
c014 Corded Workstation Mouse
c015 Corded Workstation Mouse
c016 Optical Wheel Mouse
c018 Optical Wheel Mouse
c019 Optical Tilt Wheel Mouse
c01a M-BQ85 Optical Wheel Mouse
c01b MX310 Optical Mouse
c01c Optical Mouse
c01d MX510 Optical Mouse
c01e MX518 Optical Mouse
c024 MX300 Optical Mouse
c025 MX500 Optical Mouse
c030 iFeel Mouse
c031 iFeel Mouse+
c032 MouseMan iFeel
c033 iFeel MouseMan+
c034 MouseMan Optical
c035 Mouse
c036 Mouse
c037 Mouse
c038 Mouse
c03d M-BT96a Pilot Optical Mouse
c03e Premium Optical Wheel Mouse (M-BT58)
c03f M-BT85 [UltraX Optical Mouse]
c040 Corded Tilt-Wheel Mouse
c041 G5 Laser Mouse
c042 G3 Laser Mouse
c043 MX320/MX400 Laser Mouse
c044 LX3 Optical Mouse
c045 Optical Mouse
c046 RX1000 Laser Mouse
c047 Laser Mouse M-UAL120
c048 G9 Laser Mouse
c049 G5 Laser Mouse
c050 RX 250 Optical Mouse
c051 G3 (MX518) Optical Mouse
c053 Laser Mouse
c054 Bluetooth mini-receiver
c058 M115 Mouse
c05a M90/M100 Optical Mouse
c05b M-U0004 810-001317 [B110 Optical USB Mouse]
c05d Optical Mouse
c05f M115 Optical Mouse
c061 RX1500 Laser Mouse
c062 M-UAS144 [LS1 Laser Mouse]
c063 DELL Laser Mouse
c064 M110 corded optical mouse (M-B0001)
c066 G9x Laser Mouse
c068 G500 Laser Mouse
c069 M-U0007 [Corded Mouse M500]
c06a USB Optical Mouse
c06b G700 Wireless Gaming Mouse
c06c Optical Mouse
c077 M105 Optical Mouse
c07c M-R0017 [G700s Rechargeable Gaming Mouse]
c07d G502 Mouse
c07e G402 Gaming Mouse
c080 G303 Gaming Mouse
c083 G403 Prodigy Gaming Mouse
c084 G203 Gaming Mouse
c101 UltraX Media Remote
c110 Harmony 785/880/885 Remote
c111 Harmony 525 Remote
c112 Harmony 890 Remote
c11f Harmony 900/1100 Remote
c121 Harmony One Remote
c122 Harmony 650/700 Remote
c124 Harmony 300/350 Remote
c125 Harmony 200 Remote
c126 Harmony Link
c129 Harmony Hub
c12b Harmony Touch/Ultimate Remote
c201 WingMan Extreme Joystick with Throttle
c202 WingMan Formula
c207 WingMan Extreme Digital 3D
c208 WingMan Gamepad Extreme
c209 WingMan Gamepad
c20a WingMan RumblePad
c20b WingMan Action Pad
c20c WingMan Precision
c20d WingMan Attack 2
c20e WingMan Formula GP
c211 iTouch Cordless Receiver
c212 WingMan Extreme Digital 3D
c213 J-UH16 (Freedom 2.4 Cordless Joystick)
c214 ATK3 (Attack III Joystick)
c215 Extreme 3D Pro
c216 F310 Gamepad [DirectInput Mode]
c218 F510 Gamepad [DirectInput Mode]
c219 F710 Gamepad [DirectInput Mode]
c21a Precision Gamepad
c21c G13 Advanced Gameboard
c21d F310 Gamepad [XInput Mode]
c21e F510 Gamepad [XInput Mode]
c21f F710 Wireless Gamepad [XInput Mode]
c221 G11/G15 Keyboard / Keyboard
c222 G15 Keyboard / LCD
c223 G11/G15 Keyboard / USB Hub
c225 G11/G15 Keyboard / G keys
c226 G15 Refresh Keyboard
c227 G15 Refresh Keyboard
c228 G19 Gaming Keyboard
c229 G19 Gaming Keyboard Macro Interface
c22a Gaming Keyboard G110
c22b Gaming Keyboard G110 G-keys
c22d G510 Gaming Keyboard
c22e G510 Gaming Keyboard onboard audio
c231 G13 Virtual Mouse
c245 G400 Optical Mouse
c246 Gaming Mouse G300
c248 G105 Gaming Keyboard
c24a G600 Gaming Mouse
c24c G400s Optical Mouse
c24d G710 Gaming Keyboard
c24e G500s Laser Gaming Mouse
c281 WingMan Force
c283 WingMan Force 3D
c285 WingMan Strike Force 3D
c286 Force 3D Pro
c287 Flight System G940
c291 WingMan Formula Force
c293 WingMan Formula Force GP
c294 Driving Force
c295 Momo Force Steering Wheel
c298 Driving Force Pro
c299 G25 Racing Wheel
c29b G27 Racing Wheel
c29c Speed Force Wireless Wheel for Wii
c2a0 Wingman Force Feedback Mouse
c2a1 WingMan Force Feedback Mouse
c2ab G13 Joystick
c301 iTouch Keyboard
c302 iTouch Pro Keyboard
c303 iTouch Keyboard
c305 Internet Keyboard
c307 Internet Keyboard
c308 Internet Navigator Keyboard
c309 Y-BF37 [Internet Navigator Keyboard]
c30a iTouch Composite
c30b NetPlay Keyboard
c30c Internet Keys (X)
c30d Internet Keys
c30e UltraX Keyboard (Y-BL49)
c30f Logicool HID-Compliant Keyboard (106 key)
c311 Y-UF49 [Internet Pro Keyboard]
c312 DeLuxe 250 Keyboard
c313 Internet 350 Keyboard
c315 Classic Keyboard 200
c316 HID-Compliant Keyboard
c317 Wave Corded Keyboard
c318 Illuminated Keyboard
c31a Comfort Wave 450
c31b Compact Keyboard K300
c31c Keyboard K120
c31d Media Keyboard K200
c31f Comfort Keyboard K290
c326 Washable Keyboard K310
c328 Corded Keyboard K280e
c332 G502 Proteus Spectrum Optical Mouse
c335 G910 Orion Spectrum Mechanical Keyboard
c33a G413 Gaming Keyboard
c401 TrackMan Marble Wheel
c402 Marble Mouse (2-button)
c403 Turbo TrackMan Marble FX
c404 TrackMan Wheel
c408 Marble Mouse (4-button)
c501 Cordless Mouse Receiver
c502 Cordless Mouse & iTouch Keys
c503 Cordless Mouse+Keyboard Receiver
c504 Cordless Mouse+Keyboard Receiver
c505 Cordless Mouse+Keyboard Receiver
c506 MX700 Cordless Mouse Receiver
c508 Cordless Trackball
c509 Cordless Keyboard & Mouse
c50a Cordless Mouse
c50b Cordless Desktop Optical
c50c Cordless Desktop S510
c50d Cordless Mouse
c50e Cordless Mouse Receiver
c510 Cordless Mouse
c512 LX-700 Cordless Desktop Receiver
c513 MX3000 Cordless Desktop Receiver
c514 Cordless Mouse
c515 Cordless 2.4 GHz Presenter Presentation remote control
c517 LX710 Cordless Desktop Laser
c518 MX610 Laser Cordless Mouse
c51a MX Revolution/G7 Cordless Mouse
c51b V220 Cordless Optical Mouse for Notebooks
c521 Cordless Mouse Receiver
c525 MX Revolution Cordless Mouse
c526 Nano Receiver
c529 Logitech Keyboard + Mice
c52b Unifying Receiver
c52d R700 Remote Presenter receiver
c52e MK260 Wireless Combo Receiver
c52f Unifying Receiver
c531 C-U0007 [Unifying Receiver]
c532 Unifying Receiver
c534 Unifying Receiver
c603 3Dconnexion Spacemouse Plus XT
c605 3Dconnexion CADman
c606 3Dconnexion Spacemouse Classic
c621 3Dconnexion Spaceball 5000
c623 3Dconnexion Space Traveller 3D Mouse
c625 3Dconnexion Space Pilot 3D Mouse
c626 3Dconnexion Space Navigator 3D Mouse
c627 3Dconnexion Space Explorer 3D Mouse
c628 3Dconnexion Space Navigator for Notebooks
c629 3Dconnexion SpacePilot Pro 3D Mouse
c62b 3Dconnexion Space Mouse Pro
c640 NuLOOQ navigator
c702 Cordless Presenter
c703 Elite Keyboard Y-RP20 + Mouse MX900 (Bluetooth)
c704 diNovo Wireless Desktop
c705 MX900 Bluetooth Wireless Hub (C-UJ16A)
c707 Bluetooth wireless hub
c708 Bluetooth wireless hub
c709 BT Mini-Receiver (HCI mode)
c70a MX5000 Cordless Desktop
c70b BT Mini-Receiver (HID proxy mode)
c70c BT Mini-Receiver (HID proxy mode)
c70d Bluetooth wireless hub
c70e MX1000 Bluetooth Laser Mouse
c70f Bluetooth wireless hub
c712 Bluetooth wireless hub
c714 diNovo Edge Keyboard
c715 Bluetooth wireless hub
c71a Bluetooth wireless hub
c71d Bluetooth wireless hub
c71f diNovo Mini Wireless Keyboard
c720 Bluetooth wireless hub
ca03 MOMO Racing
ca04 Formula Vibration Feedback Wheel
ca84 Cordless Controller for Xbox
ca88 Thunderpad for Xbox
ca8a Precision Vibration Feedback Wheel for Xbox
caa3 DriveFX Racing Wheel
cab1 Cordless Keyboard for Wii HID Receiver
d001 QuickCam Pro
f301 Controller

BIN
jekyll/images/bg_hr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,10 +1,33 @@
# -*- python-mode -*-
## Copyright (C) 2012-2013 Daniel Pavel
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""Generic Human Interface Device API."""
__author__ = "Daniel Pavel"
__license__ = "GPL"
__version__ = "0.4"
from hidapi.udev import close # noqa: F401
from hidapi.udev import enumerate # noqa: F401
from hidapi.udev import find_paired_node # noqa: F401
from hidapi.udev import find_paired_node_wpid # noqa: F401
from hidapi.udev import get_manufacturer # noqa: F401
from hidapi.udev import get_product # noqa: F401
from hidapi.udev import get_serial # noqa: F401
from hidapi.udev import monitor_glib # noqa: F401
from hidapi.udev import open # noqa: F401
from hidapi.udev import open_path # noqa: F401
from hidapi.udev import read # noqa: F401
from hidapi.udev import write # noqa: F401
try:
from hidapi.udev import *
except ImportError:
from hidapi.native import *
__version__ = '0.9'

View File

@@ -1,109 +1,268 @@
#!/usr/bin/env python
# -*- python-mode -*-
## Copyright (C) 2012-2013 Daniel Pavel
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import os
import sys
from select import select as _select
import time
from binascii import hexlify, unhexlify
_hex = lambda d: hexlify(d).decode('ascii').upper()
from binascii import hexlify, unhexlify
from select import select as _select
from threading import Lock
import hidapi as _hid
#
#
#
try:
read_packet = raw_input
except NameError:
# Python 3 equivalent of raw_input
read_packet = input
interactive = os.isatty(0)
start_time = 0
prompt = '?? Input: ' if interactive else ''
start_time = time.time()
strhex = lambda d: hexlify(d).decode('ascii').upper()
try:
read_packet = raw_input
except:
read_packet = input
unicode # noqa: F821
# this is certanly Python 2
is_string = lambda d: isinstance(d, unicode) # noqa: F821
# no easy way to distinguish between b'' and '' :(
# or (isinstance(d, str) \
# and not any((chr(k) in d for k in range(0x00, 0x1F))) \
# and not any((chr(k) in d for k in range(0x80, 0xFF))) \
# )
except Exception:
# this is certanly Python 3
# In Py3, unicode and str are equal (the unicode object does not exist)
is_string = lambda d: isinstance(d, str)
#
#
#
print_lock = Lock()
del Lock
def _print(marker, data, scroll=False):
t = time.time() - start_time
t = time.time() - start_time
if is_string(data):
s = marker + ' ' + data
else:
hexs = strhex(data)
s = '%s (% 8.3f) [%s %s %s %s] %s' % (marker, t, hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(data))
if interactive and scroll:
sys.stdout.write('\033[s')
sys.stdout.write('\033[S') # scroll up
sys.stdout.write('\033[A\033[L\033[G') # insert new line above the current one, position on first column
with print_lock:
# allow only one thread at a time to write to the console, otherwise
# the output gets garbled, especially with ANSI codes.
hexs = _hex(data)
s = '%s (% 8.3f) [%s %s %s %s] %s' % (marker, t, hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(data))
sys.stdout.write(s)
if interactive and scroll:
# scroll the entire screen above the current line up by 1 line
sys.stdout.write(
'\033[s' # save cursor position
'\033[S' # scroll up
'\033[A' # cursor up
'\033[L' # insert 1 line
'\033[G'
) # move cursor to column 1
sys.stdout.write(s)
if interactive and scroll:
# restore cursor position
sys.stdout.write('\033[u')
else:
sys.stdout.write('\n')
if interactive and scroll:
sys.stdout.write('\033[u')
else:
sys.stdout.write('\n')
# flush stdout manually...
# because trying to open stdin/out unbuffered programmatically
# works much too differently in Python 2/3
sys.stdout.flush()
def _continuous_read(handle, timeout=1000):
while True:
reply = hidapi.read(handle, 128, timeout)
if reply is None:
print ("!! Read failed, aborting")
break
elif reply:
_print('>>', reply, True)
def _error(text, scroll=False):
_print('!!', text, scroll)
def _continuous_read(handle, timeout=2000):
while True:
try:
reply = _hid.read(handle, 128, timeout)
except OSError as e:
_error('Read failed, aborting: ' + str(e), True)
break
assert reply is not None
if reply:
_print('>>', reply, True)
def _validate_input(line, hidpp=False):
try:
data = unhexlify(line.encode('ascii'))
except Exception as e:
_error('Invalid input: ' + str(e))
return None
if hidpp:
if len(data) < 4:
_error('Invalid HID++ request: need at least 4 bytes')
return None
if data[:1] not in b'\x10\x11':
_error('Invalid HID++ request: first byte must be 0x10 or 0x11')
return None
if data[1:2] not in b'\xFF\x01\x02\x03\x04\x05\x06':
_error('Invalid HID++ request: second byte must be 0xFF or one of 0x01..0x06')
return None
if data[:1] == b'\x10':
if len(data) > 7:
_error('Invalid HID++ request: maximum length of a 0x10 request is 7 bytes')
return None
while len(data) < 7:
data = (data + b'\x00' * 7)[:7]
elif data[:1] == b'\x11':
if len(data) > 20:
_error('Invalid HID++ request: maximum length of a 0x11 request is 20 bytes')
return None
while len(data) < 20:
data = (data + b'\x00' * 20)[:20]
return data
def _open(args):
def matchfn(bid, vid, pid):
if vid == 0x046d:
return {'vid': 0x046d}
device = args.device
if args.hidpp and not device:
for d in _hid.enumerate(matchfn):
if d.driver == 'logitech-djreceiver':
device = d.path
break
if not device:
sys.exit('!! No HID++ receiver found.')
if not device:
sys.exit('!! Device path required.')
print('.. Opening device', device)
handle = _hid.open_path(device)
if not handle:
sys.exit('!! Failed to open %s, aborting.' % device)
print(
'.. Opened handle %r, vendor %r product %r serial %r.' %
(handle, _hid.get_manufacturer(handle), _hid.get_product(handle), _hid.get_serial(handle))
)
if args.hidpp:
if _hid.get_manufacturer(handle) != b'Logitech':
sys.exit('!! Only Logitech devices support the HID++ protocol.')
print('.. HID++ validation enabled.')
else:
if (_hid.get_manufacturer(handle) == b'Logitech' and b'Receiver' in _hid.get_product(handle)):
args.hidpp = True
print('.. Logitech receiver detected, HID++ validation enabled.')
return handle
#
#
#
def _parse_arguments():
import argparse
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--history', help='history file (default ~/.hidconsole-history)')
arg_parser.add_argument('--hidpp', action='store_true', help='ensure input data is a valid HID++ request')
arg_parser.add_argument(
'device',
nargs='?',
help='linux device to connect to (/dev/hidrawX); '
'may be omitted if --hidpp is given, in which case it looks for the first Logitech receiver'
)
return arg_parser.parse_args()
def main():
args = _parse_arguments()
handle = _open(args)
if interactive:
print('.. Press ^C/^D to exit, or type hex bytes to write to the device.')
import readline
if args.history is None:
import os.path
args.history = os.path.join(os.path.expanduser('~'), '.hidconsole-history')
try:
readline.read_history_file(args.history)
except Exception:
# file may not exist yet
pass
try:
from threading import Thread
t = Thread(target=_continuous_read, args=(handle, ))
t.daemon = True
t.start()
if interactive:
# move the cursor at the bottom of the screen
sys.stdout.write('\033[300B') # move cusor at most 300 lines down, don't scroll
while t.is_alive():
line = read_packet(prompt)
line = line.strip().replace(' ', '')
# print ("line", line)
if not line:
continue
data = _validate_input(line, args.hidpp)
if data is None:
continue
_print('<<', data)
_hid.write(handle, data)
# wait for some kind of reply
if args.hidpp and not interactive:
rlist, wlist, xlist = _select([handle], [], [], 1)
if data[1:2] == b'\xFF':
# the receiver will reply very fast, in a few milliseconds
time.sleep(0.010)
else:
# the devices might reply quite slow
time.sleep(0.700)
except EOFError:
if interactive:
print('')
else:
time.sleep(1)
finally:
print('.. Closing handle %r' % handle)
_hid.close(handle)
if interactive:
readline.write_history_file(args.history)
if __name__ == '__main__':
import argparse
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--history', help='history file')
arg_parser.add_argument('device', default=None, help='linux device to connect to')
args = arg_parser.parse_args()
import hidapi
print (".. Opening device %s" % args.device)
handle = hidapi.open_path(args.device.encode('utf-8'))
if handle:
print (".. Opened handle %X, vendor %s product %s serial %s" % (handle,
repr(hidapi.get_manufacturer(handle)),
repr(hidapi.get_product(handle)),
repr(hidapi.get_serial(handle))))
if interactive:
print (".. Press ^C/^D to exit, or type hex bytes to write to the device.")
import readline
if args.history is None:
import os.path
args.history = os.path.join(os.path.expanduser("~"), ".hidconsole-history")
try:
readline.read_history_file(args.history)
except:
# file may not exist yet
pass
start_time = time.time()
try:
from threading import Thread
t = Thread(target=_continuous_read, args=(handle,))
t.daemon = True
t.start()
prompt = '?? Input: ' if interactive else ''
while t.is_alive():
line = read_packet(prompt).strip().replace(' ', '')
if line:
try:
data = unhexlify(line.encode('ascii'))
except Exception as e:
print ("!! Invalid input.")
else:
_print('<<', data)
hidapi.write(handle, data)
# wait for some kind of reply
if not interactive:
rlist, wlist, xlist = _select([handle], [], [], 1)
time.sleep(0.1)
except EOFError:
pass
except Exception as e:
print ('%s: %s' % (type(e).__name__, e))
print (".. Closing handle %X" % handle)
hidapi.close(handle)
if interactive:
readline.write_history_file(args.history)
else:
print ("!! Failed to open %s, aborting" % args.device)
main()

View File

@@ -1,380 +0,0 @@
"""Generic Human Interface Device API.
It is little more than a thin ctypes layer over a native hidapi implementation.
The docstrings are mostly copied from the hidapi API header, with changes where
necessary.
The native HID API implemenation is available at
https://github.com/signal11/hidapi.
The native implementation comes in two flavors, hidraw (``libhidapi-hidraw.so``)
and libusb (``libhidapi-libusb.so``). For this API to work, at least one of them
must be in ``LD_LIBRARY_PATH``; otherwise an ImportError will be raised.
Using the native hidraw implementation is recommended.
Currently the native libusb implementation (temporarily) detaches the device's
USB driver from the kernel, and it may cause the device to become unresponsive.
"""
__version__ = '0.3-hidapi-0.7.0'
import ctypes as _C
from struct import pack as _pack
#
# look for a native implementation in the same directory as this file
#
# The CDLL native library object.
_native = None
for native_implementation in ('hidraw', 'libusb'):
try:
_native = _C.cdll.LoadLibrary('libhidapi-' + native_implementation + '.so')
break
except OSError:
pass
if _native is None:
raise ImportError('hidapi: failed to load any HID API native implementation')
#
# Structures used by this API.
#
# used by the native implementation when enumerating, no need to expose it
class _NativeDeviceInfo(_C.Structure):
pass
_NativeDeviceInfo._fields_ = [
('path', _C.c_char_p),
('vendor_id', _C.c_ushort),
('product_id', _C.c_ushort),
('serial', _C.c_wchar_p),
('release', _C.c_ushort),
('manufacturer', _C.c_wchar_p),
('product', _C.c_wchar_p),
('usage_page', _C.c_ushort),
('usage', _C.c_ushort),
('interface', _C.c_int),
('next_device', _C.POINTER(_NativeDeviceInfo))
]
# the tuple object we'll expose when enumerating devices
from collections import namedtuple
DeviceInfo = namedtuple('DeviceInfo', [
'path',
'vendor_id',
'product_id',
'serial',
'release',
'manufacturer',
'product',
'interface',
'driver',
])
del namedtuple
# create a DeviceInfo tuple from a hid_device object
def _makeDeviceInfo(native_device_info):
return DeviceInfo(
path=native_device_info.path.decode('ascii'),
vendor_id=hex(native_device_info.vendor_id)[2:].zfill(4),
product_id=hex(native_device_info.product_id)[2:].zfill(4),
serial=native_device_info.serial if native_device_info.serial else None,
release=hex(native_device_info.release)[2:],
manufacturer=native_device_info.manufacturer,
product=native_device_info.product,
interface=native_device_info.interface,
driver=None)
#
# set-up arguments and return types for each hidapi function
#
_native.hid_init.argtypes = None
_native.hid_init.restype = _C.c_int
_native.hid_exit.argtypes = None
_native.hid_exit.restype = _C.c_int
_native.hid_enumerate.argtypes = [_C.c_ushort, _C.c_ushort]
_native.hid_enumerate.restype = _C.POINTER(_NativeDeviceInfo)
_native.hid_free_enumeration.argtypes = [_C.POINTER(_NativeDeviceInfo)]
_native.hid_free_enumeration.restype = None
_native.hid_open.argtypes = [_C.c_ushort, _C.c_ushort, _C.c_wchar_p]
_native.hid_open.restype = _C.c_void_p
_native.hid_open_path.argtypes = [_C.c_char_p]
_native.hid_open_path.restype = _C.c_void_p
_native.hid_close.argtypes = [_C.c_void_p]
_native.hid_close.restype = None
_native.hid_write.argtypes = [_C.c_void_p, _C.c_char_p, _C.c_size_t]
_native.hid_write.restype = _C.c_int
_native.hid_read.argtypes = [_C.c_void_p, _C.c_char_p, _C.c_size_t]
_native.hid_read.restype = _C.c_int
_native.hid_read_timeout.argtypes = [_C.c_void_p, _C.c_char_p, _C.c_size_t, _C.c_int]
_native.hid_read_timeout.restype = _C.c_int
_native.hid_set_nonblocking.argtypes = [_C.c_void_p, _C.c_int]
_native.hid_set_nonblocking.restype = _C.c_int
_native.hid_send_feature_report.argtypes = [_C.c_void_p, _C.c_char_p, _C.c_size_t]
_native.hid_send_feature_report.restype = _C.c_int
_native.hid_get_feature_report.argtypes = [_C.c_void_p, _C.c_char_p, _C.c_size_t]
_native.hid_get_feature_report.restype = _C.c_int
_native.hid_get_manufacturer_string.argtypes = [_C.c_void_p, _C.c_wchar_p, _C.c_size_t]
_native.hid_get_manufacturer_string.restype = _C.c_int
_native.hid_get_product_string.argtypes = [_C.c_void_p, _C.c_wchar_p, _C.c_size_t]
_native.hid_get_product_string.restype = _C.c_int
_native.hid_get_serial_number_string.argtypes = [_C.c_void_p, _C.c_wchar_p, _C.c_size_t]
_native.hid_get_serial_number_string.restype = _C.c_int
_native.hid_get_indexed_string.argtypes = [_C.c_void_p, _C.c_int, _C.c_wchar_p, _C.c_size_t]
_native.hid_get_indexed_string.restype = _C.c_int
_native.hid_error.argtypes = [_C.c_void_p]
_native.hid_error.restype = _C.c_wchar_p
#
# exposed API
# docstrings mostly copied from hidapi.h
#
def init():
"""Initialize the HIDAPI library.
This function initializes the HIDAPI library. Calling it is not strictly
necessary, as it will be called automatically by enumerate() and any of the
open_*() functions if it is needed. This function should be called at the
beginning of execution however, if there is a chance of HIDAPI handles
being opened by different threads simultaneously.
:returns: ``True`` if successful.
"""
return _native.hid_init() == 0
def exit():
"""Finalize the HIDAPI library.
This function frees all of the static data associated with HIDAPI. It should
be called at the end of execution to avoid memory leaks.
:returns: ``True`` if successful.
"""
return _native.hid_exit() == 0
def enumerate(vendor_id=None, product_id=None, interface_number=None):
"""Enumerate the HID Devices.
List all the HID devices attached to the system, optionally filtering by
vendor_id, product_id, and/or interface_number.
:returns: an iterable of matching ``DeviceInfo`` tuples.
"""
devices = _native.hid_enumerate(vendor_id, product_id)
d = devices
while d:
if interface_number is None or interface_number == d.contents.interface:
yield _makeDeviceInfo(d.contents)
d = d.contents.next_device
if devices:
_native.hid_free_enumeration(devices)
def open(vendor_id, product_id, serial=None):
"""Open a HID device by its Vendor ID, Product ID and optional serial number.
If no serial is provided, the first device with the specified IDs is opened.
:returns: an opaque device handle, or ``None``.
"""
return _native.hid_open(vendor_id, product_id, serial) or None
def open_path(device_path):
"""Open a HID device by its path name.
:param device_path: the path of a ``DeviceInfo`` tuple returned by
enumerate().
:returns: an opaque device handle, or ``None``.
"""
if type(device_path) == str:
device_path = device_path.encode('ascii')
return _native.hid_open_path(device_path) or None
def close(device_handle):
"""Close a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
_native.hid_close(device_handle)
def write(device_handle, data):
"""Write an Output report to a HID device.
:param device_handle: a device handle returned by open() or open_path().
:param data: the data bytes to send including the report number as the
first byte.
The first byte of data[] must contain the Report ID. For
devices which only support a single report, this must be set
to 0x0. The remaining bytes contain the report data. Since
the Report ID is mandatory, calls to hid_write() will always
contain one more byte than the report contains. For example,
if a hid report is 16 bytes long, 17 bytes must be passed to
hid_write(), the Report ID (or 0x0, for devices with a
single report), followed by the report data (16 bytes). In
this example, the length passed in would be 17.
write() will send the data on the first OUT endpoint, if
one exists. If it does not, it will send the data through
the Control Endpoint (Endpoint 0).
:returns: ``True`` if the write was successful.
"""
bytes_written = _native.hid_write(device_handle, _C.c_char_p(data), len(data))
return bytes_written > -1
def read(device_handle, bytes_count, timeout_ms=-1):
"""Read an Input report from a HID device.
:param device_handle: a device handle returned by open() or open_path().
:param bytes_count: maximum number of bytes to read.
:param timeout_ms: can be -1 (default) to wait for data indefinitely, 0 to
read whatever is in the device's input buffer, or a positive integer to
wait that many milliseconds.
Input reports are returned to the host through the INTERRUPT IN endpoint.
The first byte will contain the Report number if the device uses numbered
reports.
:returns: the data packet read, an empty bytes string if a timeout was
reached, or None if there was an error while reading.
"""
out_buffer = _C.create_string_buffer(b'\x00' * (bytes_count + 1))
bytes_read = _native.hid_read_timeout(device_handle, out_buffer, bytes_count, timeout_ms)
if bytes_read == -1:
return None
if bytes_read == 0:
return b''
return out_buffer[:bytes_read]
def send_feature_report(device_handle, data, report_number=None):
"""Send a Feature report to the device.
:param device_handle: a device handle returned by open() or open_path().
:param data: the data bytes to send including the report number as the
first byte.
:param report_number: if set, it is sent as the first byte with the data.
Feature reports are sent over the Control endpoint as a
Set_Report transfer. The first byte of data[] must
contain the Report ID. For devices which only support a
single report, this must be set to 0x0. The remaining bytes
contain the report data. Since the Report ID is mandatory,
calls to send_feature_report() will always contain one
more byte than the report contains. For example, if a hid
report is 16 bytes long, 17 bytes must be passed to
send_feature_report(): the Report ID (or 0x0, for
devices which do not use numbered reports), followed by the
report data (16 bytes).
:returns: ``True`` if the report was successfully written to the device.
"""
if report_number is not None:
data = _pack('!B', report_number) + data
bytes_written = _native.hid_send_feature_report(device_handle, _C.c_char_p(data), len(data))
return bytes_written > -1
def get_feature_report(device_handle, bytes_count, report_number=None):
"""Get a feature report from a HID device.
:param device_handle: a device handle returned by open() or open_path().
:param bytes_count: how many bytes to read.
:param report_number: if set, it is sent as the report number.
:returns: the feature report data.
"""
out_buffer = _C.create_string_buffer('\x00' * (bytes_count + 2))
if report_number is not None:
out_buffer[0] = _pack('!B', report_number)
bytes_read = _native.hid_get_feature_report(device_handle, out_buffer, bytes_count)
if bytes_read > -1:
return out_buffer[:bytes_read]
def _read_wchar(func, device_handle, index=None):
_BUFFER_SIZE = 64
buf = _C.create_unicode_buffer('\x00' * _BUFFER_SIZE)
if index is None:
ok = func(device_handle, buf, _BUFFER_SIZE)
else:
ok = func(device_handle, index, buf, _BUFFER_SIZE)
if ok == 0:
return buf.value
def get_manufacturer(device_handle):
"""Get the Manufacturer String from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
return _read_wchar(_native.hid_get_manufacturer_string, device_handle)
def get_product(device_handle):
"""Get the Product String from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
return _read_wchar(_native.hid_get_product_string, device_handle)
def get_serial(device_handle):
"""Get the serial number from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
serial = _read_wchar(_native.hid_get_serial_number_string, device_handle)
if serial is not None:
return ''.join(hex(ord(c)) for c in serial)
def get_indexed_string(device_handle, index):
"""Get a string from a HID device, based on its string index.
Note: currently not working in the ``hidraw`` native implementation.
:param device_handle: a device handle returned by open() or open_path().
:param index: the index of the string to get.
"""
return _read_wchar(_native.hid_get_indexed_string, device_handle, index)

View File

@@ -1,3 +1,20 @@
# -*- python-mode -*-
## Copyright (C) 2012-2013 Daniel Pavel
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""Generic Human Interface Device API.
It is currently a partial pure-Python implementation of the native HID API
@@ -7,28 +24,43 @@ The docstrings are mostly copied from the hidapi API header, with changes where
necessary.
"""
import errno as _errno
import os as _os
from select import select as _select
from pyudev import Context as _Context
from pyudev import Device as _Device
native_implementation = 'udev'
# the tuple object we'll expose when enumerating devices
from collections import namedtuple
DeviceInfo = namedtuple('DeviceInfo', [
'path',
'vendor_id',
'product_id',
'serial',
'release',
'manufacturer',
'product',
'interface',
'driver',
])
from logging import DEBUG as _DEBUG
from logging import getLogger
from select import select as _select
from time import sleep
from time import time as _timestamp
from pyudev import Context as _Context
from pyudev import Device as _Device
from pyudev import DeviceNotFoundError
from pyudev import Devices as _Devices
from pyudev import Monitor as _Monitor
_log = getLogger(__name__)
del getLogger
native_implementation = 'udev'
DeviceInfo = namedtuple(
'DeviceInfo', [
'path',
'vendor_id',
'product_id',
'serial',
'release',
'manufacturer',
'product',
'interface',
'driver',
'bus_id',
'isDevice',
]
)
del namedtuple
#
@@ -36,222 +68,378 @@ del namedtuple
# docstrings mostly copied from hidapi.h
#
def init():
"""This function is a no-op, and exists only to match the native hidapi
implementation.
:returns: ``True``.
"""
return True
def init():
"""This function is a no-op, and exists only to match the native hidapi
implementation.
:returns: ``True``.
"""
return True
def exit():
"""This function is a no-op, and exists only to match the native hidapi
implementation.
"""This function is a no-op, and exists only to match the native hidapi
implementation.
:returns: ``True``.
"""
return True
:returns: ``True``.
"""
return True
def enumerate(vendor_id=None, product_id=None, interface_number=None):
"""Enumerate the HID Devices.
# The filterfn is used to determine whether this is a device of interest to Solaar.
# It is given the bus id, vendor id, and product id and returns a dictionary
# with the required hid_driver and usb_interface and whether this is a receiver or device.
def _match(action, device, filterfn):
hid_device = device.find_parent('hid')
if not hid_device:
return
hid_id = hid_device.get('HID_ID')
if not hid_id:
return # there are reports that sometimes the id isn't set up right so be defensive
bid, vid, pid = hid_id.split(':')
List all the HID devices attached to the system, optionally filtering by
vendor_id, product_id, and/or interface_number.
filter = filterfn(int(bid, 16), int(vid, 16), int(pid, 16))
if not filter:
return
:returns: a list of matching ``DeviceInfo`` tuples.
"""
for dev in _Context().list_devices(subsystem='hidraw'):
hid_dev = dev.find_parent('hid')
if not hid_dev:
continue
hid_driver = filter.get('hid_driver')
interface_number = filter.get('usb_interface')
isDevice = filter.get('isDevice')
assert 'HID_ID' in hid_dev
bus, vid, pid = hid_dev['HID_ID'].split(':')
if vendor_id is not None and vendor_id != int(vid, 16):
continue
if product_id is not None and product_id != int(pid, 16):
continue
if action == 'add':
hid_driver_name = hid_device.get('DRIVER')
# print ("** found hid", action, device, "hid:", hid_device, hid_driver_name)
if hid_driver:
if isinstance(hid_driver, tuple):
if hid_driver_name not in hid_driver:
return
elif hid_driver_name != hid_driver:
return
if bus == '0003': # USB
intf_dev = dev.find_parent('usb', 'usb_interface')
if not intf_dev:
continue
intf_device = device.find_parent('usb', 'usb_interface')
# print ("*** usb interface", action, device, "usb_interface:", intf_device)
usb_interface = None if intf_device is None else intf_device.attributes.asint('bInterfaceNumber')
if _log.isEnabledFor(_DEBUG):
_log.debug(
'Found device BID %s VID %s PID %s INTERFACE %s FILTER %s', bid, vid, pid, usb_interface, interface_number
)
if not (interface_number is None or interface_number == usb_interface):
return
attrs = intf_device.attributes if intf_device else None
interface = intf_dev.attributes.asint('bInterfaceNumber')
if interface_number is not None and interface_number != interface:
continue
d_info = DeviceInfo(
path=device.device_node,
bus_id=int(bid, 16),
vendor_id=vid[-4:],
product_id=pid[-4:],
driver=hid_driver_name,
interface=usb_interface,
isDevice=isDevice,
serial=hid_device.get('HID_UNIQ'),
release=attrs.get('bcdDevice') if attrs else None,
manufacturer=attrs.get('manufacturer') if attrs else None,
product=attrs.get('product') if attrs else None
)
return d_info
serial = hid_dev['HID_UNIQ'] if 'HID_UNIQ' in hid_dev else None
elif action == 'remove':
# print (dict(device), dict(usb_device))
usb_dev = dev.find_parent('usb', 'usb_device')
assert usb_dev
attrs = usb_dev.attributes
d_info = DeviceInfo(path=dev.device_node,
vendor_id=vid[-4:],
product_id=pid[-4:],
serial=serial,
release=attrs['bcdDevice'],
manufacturer=attrs['manufacturer'],
product=attrs['product'],
interface=interface,
driver=hid_dev['DRIVER'])
yield d_info
d_info = DeviceInfo(
path=device.device_node,
bus_id=None,
vendor_id=vid[-4:],
product_id=pid[-4:],
driver=None,
interface=None,
isDevice=isDevice,
serial=None,
release=None,
manufacturer=None,
product=None
)
return d_info
elif bus == '0005': # BLUETOOTH
# TODO
pass
def find_paired_node(receiver_path, index, timeout):
"""Find the node of a device paired with a receiver"""
context = _Context()
receiver_phys = _Devices.from_device_file(context, receiver_path).find_parent('hid').get('HID_PHYS')
if not receiver_phys:
return None
phys = f'{receiver_phys}:{index}'
timeout += _timestamp()
delta = _timestamp()
while delta < timeout:
for dev in context.list_devices(subsystem='hidraw'):
dev_phys = dev.find_parent('hid').get('HID_PHYS')
if dev_phys and dev_phys == phys:
return dev.device_node
delta = _timestamp()
return None
def find_paired_node_wpid(receiver_path, index):
"""Find the node of a device paired with a receiver, get wpid from udev"""
context = _Context()
receiver_phys = _Devices.from_device_file(context, receiver_path).find_parent('hid').get('HID_PHYS')
if not receiver_phys:
return None
phys = f'{receiver_phys}:{index}'
for dev in context.list_devices(subsystem='hidraw'):
dev_phys = dev.find_parent('hid').get('HID_PHYS')
if dev_phys and dev_phys == phys:
# get hid id like 0003:0000046D:00000065
hid_id = dev.find_parent('hid').get('HID_ID')
# get wpid - last 4 symbols
udev_wpid = hid_id[-4:]
return udev_wpid
return None
def monitor_glib(callback, filterfn):
from gi.repository import GLib
c = _Context()
# already existing devices
# for device in c.list_devices(subsystem='hidraw'):
# # print (device, dict(device), dict(device.attributes))
# for filter in device_filters:
# d_info = _match('add', device, *filter)
# if d_info:
# GLib.idle_add(callback, 'add', d_info)
# break
m = _Monitor.from_netlink(c)
m.filter_by(subsystem='hidraw')
def _process_udev_event(monitor, condition, cb, filterfn):
if condition == GLib.IO_IN:
event = monitor.receive_device()
if event:
action, device = event
# print ("***", action, device)
if action == 'add':
d_info = _match(action, device, filterfn)
if d_info:
GLib.idle_add(cb, action, d_info)
elif action == 'remove':
# the GLib notification does _not_ match!
pass
return True
try:
# io_add_watch_full may not be available...
GLib.io_add_watch_full(m, GLib.PRIORITY_LOW, GLib.IO_IN, _process_udev_event, callback, filterfn)
# print ("did io_add_watch_full")
except AttributeError:
try:
# and the priority parameter appeared later in the API
GLib.io_add_watch(m, GLib.PRIORITY_LOW, GLib.IO_IN, _process_udev_event, callback, filterfn)
# print ("did io_add_watch with priority")
except Exception:
GLib.io_add_watch(m, GLib.IO_IN, _process_udev_event, callback, filterfn)
# print ("did io_add_watch")
m.start()
def enumerate(filterfn):
"""Enumerate the HID Devices.
List all the HID devices attached to the system, optionally filtering by
vendor_id, product_id, and/or interface_number.
:returns: a list of matching ``DeviceInfo`` tuples.
"""
for dev in _Context().list_devices(subsystem='hidraw'):
dev_info = _match('add', dev, filterfn)
if dev_info:
yield dev_info
def open(vendor_id, product_id, serial=None):
"""Open a HID device by its Vendor ID, Product ID and optional serial number.
"""Open a HID device by its Vendor ID, Product ID and optional serial number.
If no serial is provided, the first device with the specified IDs is opened.
If no serial is provided, the first device with the specified IDs is opened.
:returns: an opaque device handle, or ``None``.
"""
for device in enumerate(vendor_id, product_id):
if serial is None or serial == device.serial:
return open_path(device.path)
:returns: an opaque device handle, or ``None``.
"""
def matchfn(bid, vid, pid):
return vid == vendor_id and pid == product_id
for device in enumerate(matchfn):
if serial is None or serial == device.serial:
return open_path(device.path)
def open_path(device_path):
"""Open a HID device by its path name.
"""Open a HID device by its path name.
:param device_path: the path of a ``DeviceInfo`` tuple returned by
enumerate().
:param device_path: the path of a ``DeviceInfo`` tuple returned by enumerate().
:returns: an opaque device handle, or ``None``.
"""
return _os.open(device_path, _os.O_RDWR | _os.O_SYNC)
:returns: an opaque device handle, or ``None``.
"""
assert device_path
assert device_path.startswith('/dev/hidraw')
return _os.open(device_path, _os.O_RDWR | _os.O_SYNC)
def close(device_handle):
"""Close a HID device.
"""Close a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
_os.close(device_handle)
:param device_handle: a device handle returned by open() or open_path().
"""
assert device_handle
_os.close(device_handle)
def write(device_handle, data):
"""Write an Output report to a HID device.
"""Write an Output report to a HID device.
:param device_handle: a device handle returned by open() or open_path().
:param data: the data bytes to send including the report number as the
first byte.
:param device_handle: a device handle returned by open() or open_path().
:param data: the data bytes to send including the report number as the
first byte.
The first byte of data[] must contain the Report ID. For
devices which only support a single report, this must be set
to 0x0. The remaining bytes contain the report data. Since
the Report ID is mandatory, calls to hid_write() will always
contain one more byte than the report contains. For example,
if a hid report is 16 bytes long, 17 bytes must be passed to
hid_write(), the Report ID (or 0x0, for devices with a
single report), followed by the report data (16 bytes). In
this example, the length passed in would be 17.
The first byte of data[] must contain the Report ID. For
devices which only support a single report, this must be set
to 0x0. The remaining bytes contain the report data. Since
the Report ID is mandatory, calls to hid_write() will always
contain one more byte than the report contains. For example,
if a hid report is 16 bytes long, 17 bytes must be passed to
hid_write(), the Report ID (or 0x0, for devices with a
single report), followed by the report data (16 bytes). In
this example, the length passed in would be 17.
write() will send the data on the first OUT endpoint, if
one exists. If it does not, it will send the data through
the Control Endpoint (Endpoint 0).
:returns: ``True`` if the write was successful.
"""
try:
bytes_written = _os.write(device_handle, data)
return bytes_written == len(data)
except:
pass
write() will send the data on the first OUT endpoint, if
one exists. If it does not, it will send the data through
the Control Endpoint (Endpoint 0).
"""
assert device_handle
assert data
assert isinstance(data, bytes), (repr(data), type(data))
retrycount = 0
bytes_written = 0
while (retrycount < 3):
try:
retrycount += 1
bytes_written = _os.write(device_handle, data)
except OSError as e:
if e.errno == _errno.EPIPE:
sleep(0.1)
else:
break
if bytes_written != len(data):
raise OSError(_errno.EIO, 'written %d bytes out of expected %d' % (bytes_written, len(data)))
def read(device_handle, bytes_count, timeout_ms=-1):
"""Read an Input report from a HID device.
"""Read an Input report from a HID device.
:param device_handle: a device handle returned by open() or open_path().
:param bytes_count: maximum number of bytes to read.
:param timeout_ms: can be -1 (default) to wait for data indefinitely, 0 to
read whatever is in the device's input buffer, or a positive integer to
wait that many milliseconds.
:param device_handle: a device handle returned by open() or open_path().
:param bytes_count: maximum number of bytes to read.
:param timeout_ms: can be -1 (default) to wait for data indefinitely, 0 to
read whatever is in the device's input buffer, or a positive integer to
wait that many milliseconds.
Input reports are returned to the host through the INTERRUPT IN endpoint.
The first byte will contain the Report number if the device uses numbered
reports.
Input reports are returned to the host through the INTERRUPT IN endpoint.
The first byte will contain the Report number if the device uses numbered
reports.
:returns: the data packet read, an empty bytes string if a timeout was
reached, or None if there was an error while reading.
"""
try:
timeout = None if timeout_ms < 0 else timeout_ms / 1000.0
rlist, wlist, xlist = _select([device_handle], [], [], timeout)
if rlist:
assert rlist == [device_handle]
return _os.read(device_handle, bytes_count)
return b''
except OSError:
pass
:returns: the data packet read, an empty bytes string if a timeout was
reached, or None if there was an error while reading.
"""
assert device_handle
timeout = None if timeout_ms < 0 else timeout_ms / 1000.0
rlist, wlist, xlist = _select([device_handle], [], [device_handle], timeout)
if xlist:
assert xlist == [device_handle]
raise OSError(_errno.EIO, 'exception on file descriptor %d' % device_handle)
if rlist:
assert rlist == [device_handle]
data = _os.read(device_handle, bytes_count)
assert data is not None
assert isinstance(data, bytes), (repr(data), type(data))
return data
else:
return b''
_DEVICE_STRINGS = {
0: 'manufacturer',
1: 'product',
2: 'serial',
0: 'manufacturer',
1: 'product',
2: 'serial',
}
def get_manufacturer(device_handle):
"""Get the Manufacturer String from a HID device.
"""Get the Manufacturer String from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
return get_indexed_string(device_handle, 0)
:param device_handle: a device handle returned by open() or open_path().
"""
return get_indexed_string(device_handle, 0)
def get_product(device_handle):
"""Get the Product String from a HID device.
"""Get the Product String from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
return get_indexed_string(device_handle, 1)
:param device_handle: a device handle returned by open() or open_path().
"""
return get_indexed_string(device_handle, 1)
def get_serial(device_handle):
"""Get the serial number from a HID device.
"""Get the serial number from a HID device.
:param device_handle: a device handle returned by open() or open_path().
"""
serial = get_indexed_string(device_handle, 2)
if serial is not None:
return ''.join(hex(ord(c)) for c in serial)
:param device_handle: a device handle returned by open() or open_path().
"""
serial = get_indexed_string(device_handle, 2)
return serial
def get_indexed_string(device_handle, index):
"""Get a string from a HID device, based on its string index.
"""Get a string from a HID device, based on its string index.
Note: currently not working in the ``hidraw`` native implementation.
Note: currently not working in the ``hidraw`` native implementation.
:param device_handle: a device handle returned by open() or open_path().
:param index: the index of the string to get.
"""
if index not in _DEVICE_STRINGS:
return None
:param device_handle: a device handle returned by open() or open_path().
:param index: the index of the string to get.
:returns: the value corresponding to index, or None if no value found
:rtype: bytes or NoneType
"""
try:
key = _DEVICE_STRINGS[index]
except KeyError:
return None
stat = _os.fstat(device_handle)
dev = _Device.from_device_number(_Context(), 'char', stat.st_rdev)
if dev:
hid_dev = dev.find_parent('hid')
if hid_dev:
assert 'HID_ID' in hid_dev
bus, _, _ = hid_dev['HID_ID'].split(':')
assert device_handle
stat = _os.fstat(device_handle)
try:
dev = _Device.from_device_number(_Context(), 'char', stat.st_rdev)
except (DeviceNotFoundError, ValueError):
return None
if bus == '0003': # USB
usb_dev = dev.find_parent('usb', 'usb_device')
assert usb_dev
key = _DEVICE_STRINGS[index]
attrs = usb_dev.attributes
if key in attrs:
return attrs[key]
hid_dev = dev.find_parent('hid')
if hid_dev:
assert 'HID_ID' in hid_dev
bus, _ignore, _ignore = hid_dev['HID_ID'].split(':')
elif bus == '0005': # BLUETOOTH
# TODO
pass
if bus == '0003': # USB
usb_dev = dev.find_parent('usb', 'usb_device')
assert usb_dev
return usb_dev.attributes.get(key)
elif bus == '0005': # BLUETOOTH
# TODO
pass

Some files were not shown because too many files have changed in this diff Show More