pwr-Solaar / Solaar

Linux device manager for Logitech devices
https://pwr-solaar.github.io/Solaar
GNU General Public License v2.0
5.41k stars 403 forks source link

Reverse natural scroll on mouse settings reset periodically #1695

Closed rahidelvi closed 2 years ago

rahidelvi commented 2 years ago

Information

``` Solaar version 1.1.1 Unifying Receiver Device path : /dev/hidraw0 USB id : 046d:C52B Serial : 3EAC9271 Firmware : 12.10.B0032 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=173, 2=63 1: Wireless All-in-One Keyboard TK820 Device path : /dev/hidraw1 WPID : 4102 Codename : TK820 Kind : keyboard Protocol : HID++ 2.0 Polling rate : 8 ms (125Hz) Serial number: AA28A501 Model ID: 000000000000 Unit ID: 00000000 Firmware: RQK 52.00.B0025 Bootloader: BL 02.00.B0001 Hardware: 72 Other: The power switch is located on the top right corner. Supports 28 HID++ 2.0 features: 0: ROOT {0000} 1: FEATURE SET {0001} 2: FEATURE INFO {0002} 3: DEVICE FW VERSION {0003} Firmware: Firmware RQK 52.00.B0025 4102 Firmware: Bootloader BL 02.00.B0001 4102 Firmware: Hardware 72 Firmware: Other Unit ID: 00000000 Model ID: 000000000000 Transport IDs: {} 4: DEVICE NAME {0005} Name: Wireless All-in-One Keyboard TK820 Kind: keyboard 5: BATTERY STATUS {1000} Battery: 50%, discharging, next level 20%. 6: WIRELESS DEVICE STATUS {1D4B} 7: unknown:1DF3 {1DF3} internal, hidden 8: REPROG CONTROLS {1B00} 9: unknown:1F03 {1F03} internal, hidden 10: FN INVERSION {40A0} Swap Fx function (saved): False Swap Fx function : False 11: NEW FN INVERSION {40A2} Fn-swap: disabled Fn-swap default: enabled 12: MOUSE POINTER {2200} DPI: 1000 Acceleration: low Override OS ballistics No vertical tuning, standard mice 13: DFUCONTROL LEGACY {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 V3 {1B03} 19: unknown:1890 {1890} internal, hidden 20: unknown:18E6 {18E6} internal, hidden 21: unknown:18A0 {18A0} internal, hidden 22: unknown:1830 {1830} internal, hidden 23: unknown:1F04 {1F04} internal, hidden 24: unknown:1EA1 {1EA1} internal, hidden 25: unknown:18B0 {18B0} internal, hidden 26: ENCRYPTION {4100} 27: KEYBOARD LAYOUT {4520} Has 15 reprogrammable keys: 0: Fn Left Click => ShowUI divertable 1: Metro Appswitch => MetroAppSwitch is FN, reprogrammable 2: Metro Search => MetroSearch is FN, reprogrammable 3: unknown:00B2 => MetroShare2 is FN, reprogrammable 4: unknown:00B3 => MetroDevices2 is FN, reprogrammable 5: unknown:00B4 => MetroSettings2 is FN, reprogrammable 6: Previous => Previous is FN 7: Play/Pause => Play/Pause is FN 8: Next => Next is FN 9: Mute => Mute is FN 10: Volume Down => Volume Down is FN 11: Volume Up => Volume Up is FN 12: Sleep => Sleep is FN, reprogrammable 13: Left Button => Left Click mse 14: Right Button => Right Click mse Battery: 50%, discharging, next level 20%. 2: Marathon Mouse M705 (M-R0073) Device path : /dev/hidraw2 WPID : 406D Codename : M705 (M-R0073) Kind : mouse Protocol : HID++ 4.5 Polling rate : 8 ms (125Hz) Serial number: 78616C9B Model ID: 406D00000000 Unit ID: 301FFC26 Bootloader: BOT 59.00.B0002 Firmware: RQM 67.01.B0005 The power switch is located on the base. Supports 27 HID++ 2.0 features: 0: ROOT {0000} 1: FEATURE SET {0001} 2: DEVICE FW VERSION {0003} Firmware: Bootloader BOT 59.00.B0002 406D5F5048B901 Firmware: Firmware RQM 67.01.B0005 406D5F5048B901 Unit ID: 301FFC26 Model ID: 406D00000000 Transport IDs: {'wpid': '406D'} 3: DEVICE NAME {0005} Name: Marathon Mouse/Performance Plus M705 Kind: mouse 4: WIRELESS DEVICE STATUS {1D4B} 5: RESET {0020} 6: BATTERY STATUS {1000} Battery: 50%, discharging, next level 20%. 7: REPROG CONTROLS V4 {1B04} Key/Button Actions (saved): {'80': 80, '81': 81, '82': 82, '83': 83, '86': 86, '91': 91, '93': 93} Key/Button Actions : {'80': 80, '81': 81, '82': 82, '83': 83, '86': 86, '91': 91, '93': 93} Key/Button Diversion (saved): {'82': 0, '83': 0, '86': 0, '91': 0, '93': 0} Key/Button Diversion : {'82': 0, '83': 0, '86': 0, '91': 0, '93': 0} 8: POINTER SPEED {2205} Pointer Speed: 1.0 Sensitivity (Pointer Speed) (saved): 256 Sensitivity (Pointer Speed) : 256 9: VERTICAL SCROLLING {2100} Roller type: 3G Ratchet per turn: 24 Scroll lines: 0 10: DFUCONTROL SIGNED {00C2} 11: DEVICE RESET {1802} internal, hidden 12: unknown:1803 {1803} internal, hidden 13: CONFIG DEVICE PROPS {1806} internal, hidden 14: unknown:1810 {1810} internal, hidden 15: unknown:1830 {1830} internal, hidden 16: unknown:1890 {1890} internal, hidden 17: unknown:18A1 {18A1} internal, hidden 18: unknown:1DF3 {1DF3} internal, hidden 19: unknown:1E00 {1E00} hidden 20: unknown:1EB0 {1EB0} internal, hidden 21: unknown:1861 {1861} internal, hidden 22: unknown:18B1 {18B1} internal, hidden 23: unknown:1850 {1850} internal, hidden 24: unknown:1F03 {1F03} internal, hidden 25: unknown:18C0 {18C0} internal, hidden 26: HIRES WHEEL {2121} Multiplier: 8 Has invert: Inverse wheel motion Has ratchet switch: Free wheel mode High resolution mode HID notification Scroll Wheel Direction (saved): True Scroll Wheel Direction : True Scroll Wheel Resolution (saved): True Scroll Wheel Resolution : True Has 7 reprogrammable keys: 0: Left Button , default: Left Click => Left Click mse, reprogrammable, pos:0, group:1, group mask:g1 reporting: default 1: Right Button , default: Right Click => Right Click mse, reprogrammable, pos:0, group:1, group mask:g1 reporting: default 2: Middle Button , default: Mouse Middle Button => Mouse Middle Button mse, reprogrammable, divertable, pos:0, group:2, group mask:g1,g2 reporting: default 3: Back Button , default: Mouse Back Button => Mouse Back Button mse, reprogrammable, divertable, pos:0, group:2, group mask:g1,g2 reporting: default 4: Forward Button , default: Mouse Forward Button => Mouse Forward Button mse, reprogrammable, divertable, pos:0, group:2, group mask:g1,g2 reporting: default 5: Left Tilt , default: Mouse Scroll Left Button => Mouse Scroll Left Button mse, reprogrammable, divertable, pos:0, group:2, group mask:g1,g2 reporting: default 6: Right Tilt , default: Mouse Scroll Right Button => Mouse Scroll Right Button mse, reprogrammable, divertable, pos:0, group:2, group mask:g1,g2 reporting: default Battery: 50%, discharging, next level 20%. ```
%YAML 1.3
---
- MouseScroll: [1, 0]
...

Describe the bug I've inverted the direction for vertical scroll on the M705 mouse using the Scroll Wheel Direction toggle in the GUI. On reconnecting, after the mouse goes into power saving mode, the changed settings are lost. Instead, the default OS scroll direction gets applied. I have to manually flip the setting back and forth to get the reversed scroll wheel direction working again.

To Reproduce Steps to reproduce the behavior:

  1. In the Mouse & Touchpad settings, toggle Natrual Scrolling on
  2. In Solaar, select M705 mouse and set the Scroll Wheel Direction to on
  3. Let the mouse go into power saving mode (5 mins of inactivity?)
  4. The M705 mouse direction resets to Natural Scrolling (which is the OS default I set in step 1)

Screenshots M705 Scroll Wheel Direction Settings

Additional context

pfps commented 2 years ago

I believe that this is happening because the Linux mouse driver is setting the scroll resolution to implement smooth scrolling and in the process also sets the scrolling direction to its default. The code is line 3419 of https://github.com/torvalds/linux/blob/master/drivers/hid/hid-logitech-hidpp.c

I did complain a bit about this problem but did not receive any response. Note that due to how the feature is implemented a fix is going to require reading the scrolling direction, using that direction when setting high resolution, and then checking that the direction ends up the same. Even then, there is the possibility of a timing interaction with some other program ending up with the wrong scrolling direction.

The solution is to set both Scroll Wheel Resolution and Scroll Wheel Direction to ignore and set up reverse scrolling some other way or just accept the fact that there is a race condition that needs periodic attention.

rahidelvi commented 2 years ago

Thank you for your response. Yep, for now, I think I'm just going accept it the way it is.