Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows Support for CLI interface #2165

Open
wants to merge 112 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
880c59a
Initial Windows support.
kangcliff Oct 16, 2023
670e4d8
Restoring commented out imports.
kangcliff Oct 16, 2023
edfc3f3
Fixing module related errors.
kangcliff Oct 18, 2023
96881fd
Fixed a bug when reading from device. Updating setup script.
kangcliff Oct 20, 2023
fea0c33
Fix for styling mistakes.
kangcliff Nov 26, 2023
a923650
Merge branch 'master' into win_support
kangcliff Nov 26, 2023
29ff35d
Partial support for macOS and Windows (#1971)
markopy Nov 28, 2023
fa7606e
rules: style fix
pfps Nov 28, 2023
f9c3f42
Initial Windows support.
kangcliff Oct 16, 2023
036d7b1
Restoring commented out imports.
kangcliff Oct 16, 2023
2abde8c
Fixing module related errors.
kangcliff Oct 18, 2023
8af4a1c
Fixed a bug when reading from device. Updating setup script.
kangcliff Oct 20, 2023
27e6a2a
Fix for styling mistakes.
kangcliff Nov 26, 2023
c84bdb1
Merge branch 'win_support' of https://github.com/kangcliff/Solaar int…
kangcliff Nov 29, 2023
4b2bb92
device: add K845 keyboard
Dec 5, 2023
9350300
device: remove incorrect feature for M325 mice
pfps Dec 13, 2023
94e9cfc
docs: add files for MX Anywhere 2S and G915
pfps Dec 24, 2023
195e28a
gui: defend against lightspeed receivers that contact devices for bas…
pfps Dec 24, 2023
864065c
docs: add file for G915
pfps Dec 25, 2023
23bf4de
po: Spanish translation reviewed (#2209)
txelu Dec 28, 2023
9b32a1b
device: add names for new Logitech features
pfps Jan 20, 2024
05ec439
udev: report hidraw node in debugging messages
pfps Jan 20, 2024
67b883a
docs: add descriptions of M650 and PRO X 2
pfps Jan 20, 2024
f8a462d
cli: be defensive in device error message
pfps Jan 23, 2024
0db84f5
rules: write empty file if there are no rules to save
pfps Jan 23, 2024
86fa375
docs: add descriptions of G305 and MX Keys S
pfps Jan 30, 2024
28493f7
ui: downgrade assertion on missing notification flag to warning
pfps Jan 30, 2024
ac231a0
docs: Update installation.md with new udev rules location (#2234)
antonsoroko Jan 30, 2024
c4a64f3
release: fix changelog parsing in release.sh after d57af51316799252fd…
antonsoroko Jan 30, 2024
5392eeb
release: Add stable branch to release.sh (#2236)
antonsoroko Jan 31, 2024
db4e40e
device: add extended report rate setting
pfps Jan 27, 2024
a6f7507
ui: use Report Rate instead of Polling for movement report rate
pfps Jan 30, 2024
be41a2a
po: Mention language pack for Gnome in i18n.md (#2241)
antonsoroko Feb 3, 2024
e34bbd5
po: Update RU language translation (#2242)
antonsoroko Feb 3, 2024
0977364
devices: override name of Candy Companion Chip
pfps Jan 30, 2024
06209d2
cli: no numbers for USB and Bluetooth devices
pfps Feb 1, 2024
0f8e9b3
device: support bug in backlight on MX Keys S
pfps Jan 28, 2024
72c5860
device: support backlight levels and duration
pfps Jan 30, 2024
9c4bbec
ui: handle backlight notification
pfps Feb 5, 2024
fbad827
device: remove extra debugging for backlight
pfps Feb 6, 2024
fb30f4e
device: support onboard profiles
pfps Feb 3, 2024
42c65e1
ui: upgrade onboard profiles setting to allow profile selection
pfps Feb 5, 2024
0548bde
ui: handle onboard profiles notifications
pfps Feb 5, 2024
08fde28
cli: report more information on exception when loading profiles
pfps Feb 5, 2024
1fcff02
device: decipher LED control info in profiles
pfps Feb 5, 2024
88f549f
device: read profiles from ROM if none in Flash
pfps Feb 6, 2024
3738344
device: add version and device name to profiles
pfps Feb 6, 2024
599a274
device: better handing of unknown values in profiles
pfps Feb 6, 2024
246f3cf
device: handle v4 of profiles data
pfps Feb 7, 2024
1bf9384
docs: document profiles
pfps Feb 7, 2024
532077d
ui: add setting to change LED control between firmware and software
pfps Feb 5, 2024
15e14c2
device: add structures for LED control
pfps Feb 6, 2024
3328a60
device: add settings for LED Zone control
pfps Feb 7, 2024
73d091c
ui: add UI for LED Zone control
pfps Feb 7, 2024
7c441cc
ui: better startup behavior for LED effect settings
pfps Feb 8, 2024
2351704
device: clean up data for LED effects
pfps Feb 8, 2024
c8fc699
device: remove dependency on webcolors
pfps Feb 9, 2024
e8ef9a1
release 1.1.11rc1
pfps Nov 5, 2023
4c7f3fe
release 1.1.11rc1
pfps Feb 9, 2024
c92433b
po: Update Polish translation (#2252)
Matthaiks Feb 9, 2024
df9a5b7
cli: catch assertion errors when reading setting values from devices
pfps Feb 10, 2024
8811374
ui: don't lock setting when an error occurs
pfps Feb 10, 2024
26e0153
ui: update label and tooltip for divert-gkeys setting
pfps Feb 10, 2024
8b1463c
ui: update label and tooltip for divert-gkeys setting
pfps Feb 10, 2024
87658fb
logging: Simplify logger instantiation
MattHag Feb 10, 2024
3eebd4b
tests: Introduce tests with pytest
MattHag Feb 10, 2024
059ebec
tests: Add GitHub action for tests
MattHag Feb 10, 2024
468fad1
ui: refactor code to record change to setting
pfps Feb 10, 2024
663490e
ui: don't unlock setting when changed by external means
pfps Feb 10, 2024
0f0de28
device: correctly handle profile button with no action
pfps Feb 10, 2024
e6aacc4
ui: tidy up scrolling appearance in configuration panel
pfps Feb 11, 2024
10d65f0
doc: add document on implementation
pfps Feb 12, 2024
c66f3c3
udev: Simplify installation of udev rules
MattHag Feb 12, 2024
438ea74
release 1.1.11rc2
pfps Feb 10, 2024
ca24a93
Fix invalid func name set logo name
MattHag Feb 13, 2024
745374e
po: Update Polish translation (#2275)
Matthaiks Feb 13, 2024
fb5b7e0
ui: better checking for setting in record_setting
pfps Feb 13, 2024
1f954cd
release 1.1.11rc3
pfps Feb 14, 2024
b516b12
Setup macOS tests using GitHub action (#2284)
MattHag Feb 14, 2024
e619129
macos: Remove dbus from macos dependencies
MattHag Feb 15, 2024
8facd0c
dist: rename light icons and install them in correct place
pfps Feb 14, 2024
8dcb85d
release 1.1.11rc4
pfps Feb 15, 2024
a3ff536
dist: correctly find light icons
pfps Feb 15, 2024
3dcc1eb
dist: Add the <developer/> tag in the metainfo
proletarius101 Feb 18, 2024
47f94a6
release 1.1.11
pfps Feb 18, 2024
008d3df
tests: Add tests of common module
MattHag Feb 18, 2024
31d795f
device: improve imports in logitech_receiver
pfps Feb 10, 2024
ad6e3dc
cli: move imports in __init__.py to top of file
pfps Feb 11, 2024
17e6463
ui: improve imports in ui
pfps Feb 11, 2024
d1c899d
solaar: improve imports and guard Gtk, etc imports with correct version
pfps Feb 11, 2024
12de240
device: improve imports in logitech_receiver
pfps Feb 11, 2024
afdfcb0
tests: Show pytest coverage in GitHub CI tests
MattHag Feb 18, 2024
ab9e068
ui: move ui_async to common.py
pfps Feb 18, 2024
20a76fb
device: improve features array
pfps Feb 13, 2024
9617cb8
dist: extend makefile and tests
MattHag Feb 18, 2024
ad11049
dist: Fix deprecated GitHub actions
MattHag Feb 18, 2024
50ddb54
hidapi: upgrade debugging in udev
pfps Feb 19, 2024
fa94944
device: streamline status code
pfps Feb 17, 2024
e8fdbee
logitech_receiver: Move exceptions into own module
MattHag Feb 14, 2024
2fcab65
logitech_receiver: Move hidpp10 constants into new module
MattHag Feb 14, 2024
5f487dd
logitech_receiver: Move hidpp20 constants into new module
MattHag Feb 14, 2024
476f41f
logitech_receiver: style fixes
pfps Feb 20, 2024
ed248c6
device: add callback to call when changing a setting
pfps Feb 18, 2024
6f633ef
ui: implement setting_changed callback and pass in to new devices and…
pfps Feb 18, 2024
63afac3
Initial Windows support.
kangcliff Oct 16, 2023
177a5a9
Fix for conflicts.
kangcliff Feb 20, 2024
4399891
Fixing module related errors.
kangcliff Oct 18, 2023
ce7a8ef
Fixed a bug when reading from device. Updating setup script.
kangcliff Oct 20, 2023
2b6a48c
Fix for styling mistakes.
kangcliff Nov 26, 2023
4a3699b
Initial Windows support.
kangcliff Oct 16, 2023
42db9ec
Restoring commented out imports.
kangcliff Oct 16, 2023
aad427f
Merge branch 'win_support' of https://github.com/kangcliff/Solaar int…
kangcliff Feb 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4.3.0
- name: Set up Python
uses: actions/setup-python@v5

- name: Run pre-commit
uses: pre-commit/[email protected]
60 changes: 60 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: tests

on: [push, pull_request]

jobs:
ubuntu-tests:
runs-on: ubuntu-latest

strategy:
matrix:
python-version: [3.7, 3.12]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install Ubuntu dependencies
run: |
make install_apt

- name: Install Python dependencies
run: |
make install_pip PIP_ARGS='.["test"]'

- name: Run tests on Ubuntu
run: |
make test

macos-tests:
runs-on: macos-latest

strategy:
matrix:
python-version: [3.7, 3.12]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Set up macOS dependencies
run: |
make install_brew

- name: Install Python dependencies
run: |
make install_pip PIP_ARGS='.["test"]'

- name: Run tests on macOS
run: |
make test
52 changes: 52 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,55 @@
# 1.1.11

* Rename light icons and install them in correct place
* Setup macOS tests using GitHub action (#2284)
* Better checking for setting in record_setting
* Fix invalid func name set logo name
* Simplify installation of udev rules
* Add document on implementation
* Tidy up scrolling appearance in configuration panel
* Correctly handle profile button with no action
* Don't unlock setting when changed by external means
* Refactor code to record change to setting
* Add GitHub action for tests
* Introduce tests with pytest
* Simplify logger instantiation
* Update label and tooltip for divert-gkeys setting
* Don't lock setting when an error occurs
* Catch assertion errors when reading setting values from devices
* Support LED Zone control feature
* Dump and load device profiles
* Select among profiles.
* Support backlight levels and duration
* Use "Report Rate" instead of "Polling" for movement report rate
* Support extended report rate setting
* Add stable branch to release.sh (#2236)
* Fix changelog parsing in release.sh
* Update installation.md with new udev rules location
* Downgrade assertion on missing notification flag to warning
* Write empty file if there are no rules to save
* Be defensive in device error messages
* Add descriptions of M650, PRO X 2, G915, MX Anywhere 2S, G305, and MX Keys S
* Report hidraw node in debugging messages
* Add names for new Logitech features
* Update Spanish, French, and Polish translations
* Defend against lightspeed receivers that contact devices for basic information
* Remove incorrect feature for M325 mice
* Add K845 keyboard
* Add partial support for macOS and minimal support for Windows
* Correctly enumerate devices on receiver
* Add wording in documentation about Logitech reusing model numbers
* Better handling and installation of icons
* Catch errors when pinging to try to put device online
* Be more cautious when creating log messages to avoid exceptions
* Correctly handle NoSuchDevice exception when pinging device
* Fix test in rules for device equality
* Add installation instructions for pipx and add not about other GTK system packages
* Fix bug in NamedInt
* Add support for MK550
* Install udev rule files to correct placces
* Expand expected ping responses
* Update codename when device status changes

# 1.1.10

* Add information about NixOS flake package
Expand Down
53 changes: 53 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
UDEV_RULE_FILE = 42-logitech-unify-permissions.rules
UDEV_RULES_SOURCE := rules.d/$(UDEV_RULE_FILE)
UDEV_RULES_SOURCE_UINPUT := rules.d-uinput/$(UDEV_RULE_FILE)
UDEV_RULES_DEST := /etc/udev/rules.d/

PIP_ARGS ?= .

.PHONY: install_ubuntu install_macos
.PHONY: install_apt install_brew install_pip
.PHONY: install_udev install_udev_uinput reload_udev uninstall_udev
.PHONY: test

install_ubuntu: install_apt install_udev_uinput install_pip

install_macos: install_brew install_pip

install_apt:
@echo "Installing Solaar dependencies via apt"
sudo apt update
sudo apt install libdbus-1-dev libglib2.0-dev

install_brew:
@echo "Installing Solaar dependencies via brew"
brew update
brew install hidapi gtk+3 pygobject3

install_pip:
@echo "Installing Solaar dependencies via pip"
python -m pip install --upgrade pip
pip install $(PIP_ARGS)

install_udev:
@echo "Copying Solaar udev rule to $(UDEV_RULES_DEST)"
sudo cp $(UDEV_RULES_SOURCE) $(UDEV_RULES_DEST)
make reload_udev

install_udev_uinput:
@echo "Copying Solaar udev rule (uinput) to $(UDEV_RULES_DEST)"
sudo cp $(UDEV_RULES_SOURCE_UINPUT) $(UDEV_RULES_DEST)
make reload_udev

reload_udev:
@echo "Reloading udev rules"
sudo udevadm control --reload-rules

uninstall_udev:
@echo "Removing Solaar udev rules from $(UDEV_RULES_DEST)"
sudo rm -f $(UDEV_RULES_DEST)/$(UDEV_RULE_FILE)
make reload_udev

test:
@echo "Running Solaar tests"
pytest --cov=lib/ tests/
12 changes: 12 additions & 0 deletions Release_Notes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Notes on Major Changes in Releases

## Version 1.1.11

* Solaar can dump device profiles in YAMLfor devices that support profiles and load profiles back from an edited file. See [the capabilities page](https://pwr-solaar.github.io/Solaar/capabilities) for more information.

* Solaar has settings for each LED Zone that a device supports under feature Color LED Effects.

* Solaar has settings for extended report rate, backlight levels, durations, and profile selection.

* Solaar now partly works in MacOS. Please open new issues for problems. Solaar may work in Windows. Please open new issues for problems. See https://github.com/pwr-Solaar/Solaar/pull/1971 for more information. Fixing problems in MacOS or Windows may take considerable time.

* Solaar works better when the Python package hid-parser is available. Distriubtions should try have this package installed.

## Version 1.1.10

* The mouse click rule action can now just simulate depressing or releasing the button.
Expand Down
90 changes: 90 additions & 0 deletions docs/capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,96 @@ is sent to the Solaar rule system so that rules can detect these notifications.
For more information on Mouse Gestures rule conditions see
[the rules page](https://pwr-solaar.github.io/Solaar/rules).

### Device Profiles

Some mice store one or more profiles, which control aspects of the behavior of the device.

Profiles can control the rate at which the mouse reports movement, the resolution of the the movement reports, what the mouse buttons do, and its LED effects. Solaar can dump the entire set of profiles into a YAML file can load an entire set of profiles from a file. Users can edit the file to effect changes to the profiles. Solaar has a setting that switches between profiles or disables all profiles. When switching between profiles or using a button to change resolution Solaar keeps track of the changes in the settings for these features.

When profiles are active changes cannot be made to the Report Rate setting. Changes can be made to the Sensitivity setting and to LED settings. To keep the profile values make these setting ignored.

A profile file has some bookkeeping information, including profile version and the name of the device, and a sequence of profiles.

Each profile has the following fields:
- enabled: Whether the profile is enabled.
- sector: Where the profile is stored in device memory. Sectors greater than 0xFF are in ROM and cannot be written (use the low byte as the sector to write to Flash).
- name: A memonic name for the profile.
- report_rate: A report rate in milliseconds from 1 to 8.
- resolutions: A sequence of five sensor resolutions in DPI.
- resolution_default_index: The index of the default sensor resolution (0 to 4).
- resolution_shift_index: The index of the sensor resolution used when the DPI Shift button is pressed (0 to 4).
- buttons: The action for each button on the mouse in normal mode.
- gbuttons: The action for each button on the mouse in G-Shift mode.
- angle_snap: Enable angle snapping for devices.
- red, blue, green: Color indicator for the profile.
- lighting: Lighting information for logo and side LEDs in normal mode, then for power saving mode.
- ps_timeout: Delay in ms to go into power saving mode.
- po_timeout: Delay in ms to go from power saving mode to fully off.
- power_mode: Unknown purpose.
- write count: Unknown purpose.
Missing or unused parts of a profile are often a sequence of 0xFF bytes.

Button actions can either perform a function (behavior: 9) or send a button click or key press (behaviour: 8).
Functions are:
- 0: No Action - do nothing
- 1: Tilt Left
- 2: Tilt Right
- 3: Next DPI - change device resolution to the next DPI
- 4: Previous DPI - change device resolution to the previous DPI
- 5: Cycle DPI - change device resolution to the next DPI considered as a cycle
- 6: Default_DPI - change device resolution to the default resolution
- 7: Shift_DPI - change device resolution to the shift resolution
- 8: Next Profile - change to the next enabled profile
- 9: Previous Profile - change to the previous enabled profile
- 10: Cycle Profile - change to the next enabled profile considered as a cycle
- 11: G-Shift - change all buttons to their G-Shift state
- 12: Battery Status - show battery status on the device LEDs
- 13: Profile Select - select the n'th enabled profile
- 14: Mode Switch
- 15: Host Button - switch between hosts (unverified)
- 16: Scroll Down
- 17: Scroll Up
Some devices might not be able to perform all functions.

Buttons can send (type):
- 0: Don't send anything.
- 1: A button click (value) as a 16-bit bitmap, i.e., 1 is left click, 2 is right, 4 is middle, etc.
- 2: An 8-bit USB HID keycode (value) plus an 8-bit modifier bitmap (modifiers), i.e., 0 for no modifiers, 1 for control, 2 for shift, etc.
- 3: A 16-bit HID Consumer keycode (value).

See USB_HID_KEYCODES and HID_CONSUMERCODES in lib/logitech_receiver/special_keys.py for values to use for keycodes.

Buttons can also execute macros but Solaar does not provide any support for macros.

Lighting information is a sequence of lighting effects, with the first for the logo LEDs and the second for the side LEDs.

The fields possible in an effect are:
- ID: The kind of effect:
- color: A color parameter for the effect as a 24-bit RGB value.
- intensity: How intense to make the color (1%-100%), 0 for the default (usually 100%).
- speed: How fast to pulse in ms (one byte).
- ramp: How to change to the color (0=default, 1=ramp up/down, 2=no ramping).
- period: How fast to perform the effect in ms (two bytes).
- form: The form of the breathe effect.
- bytes: The raw bytes of other effects.

The possible effects and the fields the use are:
- 0x0: Disable - No fields.
- 0x1: Fixed color - color, whether to ramp.
- 0x2: Pulse a color - color, speed.
- 0x3 Cycle through the spectrum - period, intensity, form.
- 0x8; A boot effect - No fields.
- 0x9: A demo effect - NO fields.
- 0xa: breathe a color (like pulse) - color, period.
- 0xb: Ripple - color, period.
- null: An unknown effect.
Only effects supported by the device can be used.

To set up profiles, first run `solaar profiles <device name>`, which will output a YAML dump of the profiles on the device. Then store the YAML dump into a file and edit the file to make changes. Finally run `solaar profiles <device name> <file name>` to load the profiles back onto the device. Profiles are stored in flash memory and persist when the device is inactive or turned off. When loading profiles Solaar is careful to only write the flash memory sectors that need to be changed. Solaar also checks for correct profile version and device name before loading a profile into a device.

Keep a copy of the initial dump of profiles so that it can be loaded back to the device if problems are encountered with the edited profiles. The safest changes are to take an unused or unenabled profile sector and create a new profile in it, likely mostly copying parts of another profile.


## System Tray

Solaar's GUI normally uses an icon in the system tray.
Expand Down
58 changes: 58 additions & 0 deletions docs/devices/G305 Lightspeed Wireless Gaming Mouse 4074.text
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
solaar version 1.1.10

1: G305 Lightspeed Wireless Gaming Mouse
Device path : /dev/hidraw7
WPID : 4074
Codename : G305
Kind : mouse
Protocol : HID++ 4.2
Polling rate : 1 ms (1000Hz)
Serial number: ED5E9515
Model ID: 407400000000
Unit ID: F074D567
Bootloader: BOT 69.02.B0021
Firmware: RQM 68.02.B0021
The power switch is located on the base.
Supports 27 HID++ 2.0 features:
0: ROOT {0000} V0
1: FEATURE SET {0001} V0
2: DEVICE FW VERSION {0003} V2
Firmware: Bootloader BOT 69.02.B0021 4074452F3940
Firmware: Firmware RQM 68.02.B0021 4074452F3940
Unit ID: F074D567 Model ID: 407400000000 Transport IDs: {'wpid': '4074'}
3: DEVICE NAME {0005} V0
Name: G305 Lightspeed Wireless Gaming Mouse
Kind: mouse
4: WIRELESS DEVICE STATUS {1D4B} V0
5: BATTERY STATUS {1000} V0
Battery: 50%, discharging, next level 30%.
6: COLOR LED EFFECTS {8070} V6
7: ONBOARD PROFILES {8100} V0
Device Mode: On-Board
Onboard Profiles (saved): Enable
Onboard Profiles : Enable
8: MOUSE BUTTON SPY {8110} V0
9: REPORT RATE {8060} V0
Polling Rate (ms): 1
Polling Rate (ms) (saved): 1
Polling Rate (ms) : 1
10: MODE STATUS {8090} V1
11: DFUCONTROL SIGNED {00C2} V0
12: DEVICE RESET {1802} V0 internal, hidden
13: unknown:1803 {1803} V0 internal, hidden
14: CONFIG DEVICE PROPS {1806} V4 internal, hidden
15: unknown:1811 {1811} V0 internal, hidden
16: OOBSTATE {1805} V0 internal, hidden
17: unknown:1830 {1830} V0 internal, hidden
18: unknown:1890 {1890} V0 internal, hidden
19: unknown:1DF3 {1DF3} V0 internal, hidden
20: unknown:1E00 {1E00} V0 hidden
21: unknown:1EB0 {1EB0} V0 internal, hidden
22: unknown:1861 {1861} V0 internal, hidden
23: unknown:18B1 {18B1} V0 internal, hidden
24: unknown:1E22 {1E22} V0 internal, hidden
25: unknown:1801 {1801} V0 internal, hidden
26: ADJUSTABLE DPI {2201} V1
Sensitivity (DPI) (saved): 1600
Sensitivity (DPI) : 1600
Battery: 50%, discharging, next level 30%.
Loading
Loading