diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 77972e22..c0d5c229 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,6 +9,7 @@ jobs: strategy: matrix: python-version: [3.8, 3.13] + fail-fast: false steps: - name: Checkout @@ -19,10 +20,16 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install Ubuntu dependencies + - name: Install Ubuntu dependencies for python 3.8 + if: matrix.python-version == '3.8' run: | make install_apt + - name: Install Ubuntu dependencies for python 3.13 + if: matrix.python-version == '3.13' + run: | + make install_apt_python3.13 + - name: Install Python dependencies run: | make install_pip PIP_ARGS='.["test"]' @@ -48,6 +55,7 @@ jobs: strategy: matrix: python-version: [3.8, 3.13] + fail-fast: false steps: - name: Checkout diff --git a/Makefile b/Makefile index 204f23f6..f3eeff98 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,12 @@ 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 libgtk-3-dev libgirepository1.0-dev + sudo apt install libdbus-1-dev libglib2.0-dev libgtk-3-dev libgirepository-1.0-dev + +install_apt_python3.13: + @echo "Installing Solaar dependencies via apt" + sudo apt update + sudo apt install libdbus-1-dev libglib2.0-dev libgtk-3-dev libgirepository-2.0-dev gobject-introspection install_dnf: @echo "Installing Solaar dependencies via dn" diff --git a/docs/capabilities.md b/docs/capabilities.md index c5549d2f..4bd45b3b 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -186,13 +186,13 @@ Solaar is uses the standard US keyboard layout. This currently only matters for This is an experimental feature and may be modified or even eliminated. -### Device Profiles +### Onboard Profiles -Some mice store one or more profiles, which control aspects of the behavior of the device. +Some mice store one or more profiles onboard. An onboard profile controls certain aspects of the behavior of the mouse, including the rate at which the mouse reports movement, the resolution of the the movement reports, what the mouse buttons do, LED effects, and maybe more. Solaar has a setting that switches between profiles or disables all profiles. -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 an onboard profile is active it may not be possible to change the aspects that the profile controls. This is often seen for the Report Rate setting. For some devices it is possible to make changes to the Sensitivity setting and to LED settings. These changes are likely to only be temporary and may be overridden when the device reconnects or when Solaar is restarted. This is in keeping with the intent of Onboard Profiles as controlling the device behavior. To make the changes to these settings permanent it is necessary to disable onboard profiles. Alternatively, multiple profiles can be set up as described below and these settings controlled by switching between the profiles. -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. +Solaar can dump the entire set of profiles into a YAML file and can load the entire set of profiles from a file. Users can edit the file to effect changes to the profiles. A profile file has some bookkeeping information, including profile version and the name of the device, and a sequence of profiles. @@ -247,7 +247,7 @@ See USB_HID_KEYCODES and HID_CONSUMERCODES in lib/logitech_receiver/special_keys 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. +Lighting information is a sequence of lighting effects, with the first usually for the logo LEDs and the second usually for the side LEDs. The fields possible in an effect are: - ID: The kind of effect: diff --git a/docs/devices/MX Anywhere 3 for Business B02D.txt b/docs/devices/MX Anywhere 3 for Business B02D.txt new file mode 100644 index 00000000..9fbc1982 --- /dev/null +++ b/docs/devices/MX Anywhere 3 for Business B02D.txt @@ -0,0 +1,100 @@ +solaar version 1.1.14 + + 1: MX Anywhere 3 for Business + Device path : None + WPID : B02D + Codename : MX Anywhere 3 + Kind : mouse + Protocol : HID++ 4.5 + Serial number: 00000000 + Model ID: B02D00000000 + Unit ID: 00000000 + 1: BL1 36.01.B0011 + 0: RBM 15.01.B0011 + 3: + The power switch is located on the (unknown). + Supports 35 HID++ 2.0 features: + 0: ROOT {0000} V0 + 1: FEATURE SET {0001} V0 + 2: DEVICE FW VERSION {0003} V4 + Firmware: 1 BL1 36.01.B0011 B02D1EEFD8F8 + Firmware: 0 RBM 15.01.B0011 B02D1EEFD8F8 + Firmware: 3 + Unit ID: 00000000 Model ID: B02D00000000 Transport IDs: {'btleid': 'B02D'} + 3: DEVICE NAME {0005} V0 + Name: MX Anywhere 3 for Business + Kind: mouse + 4: WIRELESS DEVICE STATUS {1D4B} V0 + 5: CONFIG CHANGE {0020} V0 + Configuration: 11000000000000000000000000000000 + 6: CRYPTO ID {0021} V1 + 7: DEVICE FRIENDLY NAME {0007} V0 + Friendly Name: MX Anywhere 3B + 8: UNIFIED BATTERY {1004} V3 + Battery: 75%, 0. + 9: REPROG CONTROLS V4 {1B04} V5 + Key/Button Actions : {Left Button:Left Click, Right Button:Right Click, Middle Button:Mouse Middle Button, Back Button:Mouse Back Button, Forward Button:Mouse Forward Button, Smart Shift:Smart Shift} + Key/Button Diversion : {Middle Button:Regular, Back Button:Regular, Forward Button:Regular, Smart Shift:Diverted} + 10: CHANGE HOST {1814} V1 + Change Host : 2:archlinux + 11: HOSTS INFO {1815} V2 + Host 0 (paired): archlinux + Host 1 (paired): archlinux + Host 2 (unpaired): + 12: XY STATS {2250} V1 + 13: ADJUSTABLE DPI {2201} V2 + Sensitivity (DPI) : 1000 + 14: SMART SHIFT ENHANCED {2111} V0 + Scroll Wheel Ratcheted : Ratcheted + Scroll Wheel Ratchet Speed : 15 + 15: HIRES WHEEL {2121} V1 + Multiplier: 15 + Has invert: Normal wheel motion + Has ratchet switch: Normal wheel mode + Low resolution mode + HID notification + Scroll Wheel Direction : False + Scroll Wheel Resolution : False + Scroll Wheel Diversion : False + 16: WHEEL STATS {2251} V0 + 17: DFUCONTROL {00C3} V0 + 18: DEVICE RESET {1802} V0 internal, hidden, unknown:000010 + 19: unknown:1803 {1803} V0 internal, hidden, unknown:000010 + 20: CONFIG DEVICE PROPS {1806} V8 internal, hidden, unknown:000010 + 21: unknown:1816 {1816} V0 internal, hidden, unknown:000010 + 22: OOBSTATE {1805} V0 internal, hidden + 23: unknown:1830 {1830} V0 internal, hidden, unknown:000010 + 24: unknown:1891 {1891} V7 internal, hidden, unknown:000008 + 25: unknown:18A1 {18A1} V0 internal, hidden, unknown:000010 + 26: unknown:1E00 {1E00} V0 hidden + 27: unknown:1E02 {1E02} V0 internal, hidden + 28: unknown:1602 {1602} V0 + 29: unknown:1EB0 {1EB0} V0 internal, hidden, unknown:000010 + 30: unknown:1861 {1861} V1 internal, hidden, unknown:000010 + 31: unknown:9300 {9300} V1 internal, hidden, unknown:000010 + 32: unknown:9001 {9001} V0 internal, hidden, unknown:000010 + 33: unknown:1E22 {1E22} V0 internal, hidden, unknown:000010 + 34: unknown:9205 {9205} V0 internal, hidden, unknown:000010 + Has 7 reprogrammable keys: + 0: Left Button , default: Left Click => Left Click + mse, analytics key events, pos:0, group:1, group mask:g1 + reporting: default + 1: Right Button , default: Right Click => Right Click + mse, analytics key events, pos:0, group:1, group mask:g1 + reporting: default + 2: Middle Button , default: Mouse Middle Button => Mouse Middle Button + mse, reprogrammable, divertable, raw XY, analytics key events, pos:0, group:2, group mask:g1,g2 + reporting: default + 3: Back Button , default: Mouse Back Button => Mouse Back Button + mse, reprogrammable, divertable, raw XY, analytics key events, unknown:000800, pos:0, group:2, group mask:g1,g2 + reporting: default + 4: Forward Button , default: Mouse Forward Button => Mouse Forward Button + mse, reprogrammable, divertable, raw XY, analytics key events, unknown:000800, pos:0, group:2, group mask:g1,g2 + reporting: default + 5: Smart Shift , default: Smart Shift => Smart Shift + mse, reprogrammable, divertable, raw XY, analytics key events, pos:0, group:2, group mask:g1,g2 + reporting: diverted, raw XY diverted + 6: Virtual Gesture Button , default: Virtual Gesture Button => Virtual Gesture Button + divertable, virtual, raw XY, force raw XY, pos:0, group:3, group mask:empty + reporting: default + Battery: 75%, 0. diff --git a/docs/features.md b/docs/features.md index f3fe1fcb..6fbee37a 100644 --- a/docs/features.md +++ b/docs/features.md @@ -39,8 +39,8 @@ Feature | ID | Status | Notes `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` +`BACKLIGHT` | `0x1981` | Supported | `Backlight` +`BACKLIGHT2` | `0x1982` | Supported | `Backlight2`, ... `BACKLIGHT3` | `0x1983` | Unsupported | `PRESENTER_CONTROL` | `0x1A00` | Unsupported | `SENSOR_3D` | `0x1A01` | Unsupported | @@ -54,7 +54,7 @@ Feature | ID | Status | Notes `WIRELESS_DEVICE_STATUS` | `0x1D4B` | Read only | status reporting from device `REMAINING_PAIRING` | `0x1DF0` | Unsupported | `FIRMWARE_PROPERTIES` | `0x1F1F` | Unsupported | -`ADC_MEASUREMENT` | `0x1F20` | Unsupported | +`ADC_MEASUREMENT` | `0x1F20` | Supported | `ADCPower` `LEFT_RIGHT_SWAP` | `0x2001` | Unsupported | `SWAP_BUTTON_CANCEL` | `0x2005` | Unsupported | `POINTER_AXIS_ORIENTATION` | `0x2006` | Unsupported | @@ -97,22 +97,22 @@ Feature | ID | Status | Notes `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 | +`MKEYS` | `0x8020` | Supported | `MkeyLEDs` +`MR` | `0x8030` | Supported | `MRKeyLED` +`BRIGHTNESS_CONTROL` | `0x8040` | Supported | `BrightnessControl` +`REPORT_RATE` | `0x8060` | Supported | `ReportRate` +`COLOR_LED_EFFECTS` | `0x8070` | Supported | `LEDControl`, `LEDZoneSetting` +`RGB_EFFECTS` | `0X8071` | Supported | `RGBControl`, `RGBEffectSetting` `PER_KEY_LIGHTING` | `0x8080` | Unsupported | -`PER_KEY_LIGHTING_V2` | `0x8081` | Unsupported | +`PER_KEY_LIGHTING_V2` | `0x8081` | Supported | `PerKeyLighting` `MODE_STATUS` | `0x8090` | Unsupported | -`ONBOARD_PROFILES` | `0x8100` | Unsupported | +`ONBOARD_PROFILES` | `0x8100` | Supported | `MOUSE_BUTTON_SPY` | `0x8110` | Unsupported | `LATENCY_MONITORING` | `0x8111` | Unsupported | `GAMING_ATTACHMENTS` | `0x8120` | Unsupported | `FORCE_FEEDBACK` | `0x8123` | Unsupported | -`SIDETONE` | `0x8300` | Unsupported | -`EQUALIZER` | `0x8310` | Unsupported | +`SIDETONE` | `0x8300` | Supported | `Sidetone` +`EQUALIZER` | `0x8310` | Supported | `Equalizer` `HEADSET_OUT` | `0x8320` | Unsupported | A “read only” note means the feature is a read-only feature. diff --git a/docs/i18n.md b/docs/i18n.md index 67af1fde..7a513ef6 100644 --- a/docs/i18n.md +++ b/docs/i18n.md @@ -62,6 +62,7 @@ Some of the languages Solaar has been translated to are listed below. A full lis - Portuguese-BR: [Drovetto][drovetto], [Josenivaldo Benito Jr.][jrbenito], Vinícius - Română: Daniel Pavel - Russian: [Dimitriy Ryazantcev][DJm00n], Anton Soroko +- Serbian: [Renato Kaurić][renatoka] - Slovak: [Jose Riha][jose1711] - Spanish, Castilian: Jose Luis Tirado - Swedish: John Erling Blad, [Daniel Zippert][zipperten], Emelie Snecker, Jonatan Nyberg @@ -80,3 +81,4 @@ Some of the languages Solaar has been translated to are listed below. A full lis [jrbenito]: https://github.com/jrbenito [jeblad]: https://github.com/jeblad [feku]: https://github.com/FerdinaKusumah +[renatoka]: https://github.com/renatoka diff --git a/docs/implementation.md b/docs/implementation.md index a4bb0b73..e3fca943 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -68,9 +68,9 @@ Many devices allow reprogramming some keys or buttons. One the main reasons for Many pointing devices provide a facility for recognizing gestures and sending an HID message for the gesture. The `Gesture` class stores inforation for one gesture and the `Gestures` class stores information for all the gestures on a device. Functions in the Device class request `KeysArray` information and store it on devices. Functions in the Device class request `Gestures` information for a device when appropriate and store it on the device. -Many gaming devices provide an interface to controlling their LEDs by zone. The `LEDEffectSetting` class stores the current state of one zone of LEDs. This information can come directly from an LED feature but is also part of device profiles so this class provides a byte string interface. Solaar stores this information in YAML so this class provides a YAML interface. The `LEDEffectsInfo` class stores information about what LED zones are on a device and what effects they can perform and provides a method that builds an object by querying a device. +Many gaming devices provide an interface to controlling their LEDs by zone. The `LEDEffectSetting` class stores the current state of one zone of LEDs. This information can come directly from an LED feature but is also part of Onboard Profiles so this class provides a byte string interface. Solaar stores this information in YAML so this class provides a YAML interface. The `LEDEffectsInfo` class stores information about what LED zones are on a device and what effects they can perform and provides a method that builds an object by querying a device. -Many gaming devices can be controlled by selecting one of their profiles. A profile sets up the rate at which the device reports movement, a set of sensitivites of its movement detector, a set of actions to be performed by mouse buttons or G and M keys, and effects for up to two LED zones. The `Button` class stores information about a button or key action. The `OnboardProfile` class stores a single profile, using the `LEDEffectSetting` and `Button` classes. Because retrieving and changing a profile is complex, this class provides a byte string interface. Because Solaar dumps profiles from devices as YAML documents and loads them into devices from YAML documents, this class provides a YAML interface. The `OnboardProfiles` class class stores the entire profiles information for a device. It provides an interface to construct an `OnboardProfiles` object by querying a device. +Many gaming devices can be controlled by selecting one of their Onboard Profiles. An Onboard Profile sets up the rate at which the device reports movement, a set of sensitivites of its movement detector, a set of actions to be performed by mouse buttons or G and M keys, and effects for up to two LED zones. The `Button` class stores information about a button or key action. The `OnboardProfile` class stores a single profile, using the `LEDEffectSetting` and `Button` classes. Because retrieving and changing a profile is complex, this class provides a byte string interface. Because Solaar dumps profiles from devices as YAML documents and loads them into devices from YAML documents, this class provides a YAML interface. The `OnboardProfiles` class class stores the entire profiles information for a device. It provides an interface to construct an `OnboardProfiles` object by querying a device. Because Solaar dumps profiles from devices as YAML documents and loads them into devices from YAML documents, these classes also provide a YAML interface. #### HID++ 1.0 diff --git a/docs/index.md b/docs/index.md index deac5693..e13bc4f8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,7 +17,7 @@ Solaar runs as a regular user process, albeit with direct access to the Linux in that lets it directly communicate with the Logitech devices it manages using special Logitech-proprietary (HID++) commands. Each Logitech device implements a different subset of these commands. -Solaar is thus only able to make the changes to devices that devices implement. +Solaar is thus only able to make the changes that a particular device supports. Solaar is not a device driver and does not process normal input from devices. It is thus unable to fix problems that arise from incorrect handling of @@ -46,8 +46,8 @@ and for more information on its capabilities see 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). +situation for recent versions of Gnome. For information on how 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 diff --git a/lib/logitech_receiver/settings_templates.py b/lib/logitech_receiver/settings_templates.py index d796e271..6c9a9bbd 100644 --- a/lib/logitech_receiver/settings_templates.py +++ b/lib/logitech_receiver/settings_templates.py @@ -1012,9 +1012,9 @@ class ExtendedAdjustableDpi(settings.Setting): rw_options = {"read_fnid": 0x50, "write_fnid": 0x60} keys_universe = common.NamedInts(X=0, Y=1, LOD=2) choices_universe = common.NamedInts.range(100, 4000, str, 50) - choices_universe[0] = "LOW" - choices_universe[1] = "MEDIUM" - choices_universe[2] = "HIGH" + choices_universe[1] = "LOW" + choices_universe[2] = "MEDIUM" + choices_universe[3] = "HIGH" keys = common.NamedInts(X=0, Y=1, LOD=2) def write_key_value(self, key, value, save=True): diff --git a/mkdocs.yml b/mkdocs.yml index 17e3394e..3ca24a29 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,11 +22,11 @@ nav: plugins: - search - - mkdocstrings: - handlers: - python: - setup_commands: - - python -m pip install . +# - mkdocstrings: +# handlers: +# python: +# setup_commands: +# - python -m pip install . - mermaid2 markdown_extensions: - pymdownx.superfences