Pixel-Perfect Scrolling With a Mouse Wheel Under Linux
Yesterday, I plugged in my Logitech mouse into my laptop and started reading a PDF file. I started scrolling the page and realized that the scrolling is not as smooth as with my touchpad. The difference is that the touchpad scrolls the PDF pixel-by-pixel, whereas my mouse scrolls the PDF with one scroll-wheel click roughly 3 lines at once.
I previously had a look into the HID++ protocol of Logitech mice to enable the thumb button of my M720, and did know that my mouse has a high-resolution mode for the scroll-wheel. So, technically it is possible to get high-resolution scrolling data from my mouse and translate it to smooth pixel-perfect scrolling in my PDF viewer.
I searched the internet, read systemd source code, dug into libinput documentation, and finally found a way to achieve pixel-perfect scrolling! 🎉
Here is how to set it up!
First you have to install the
solaar package with your Linux distribution’s package manager.
After installing, follow the wizard to configure your unifying receiver and mouse. Now, you can use
Solaar to configure some options on your mouse. The
Wheel Resolution property enables the high-resolution mode on the mouse-wheel.
Unfortunately, the wheel resolution property is not working with all unifying receivers. If it is not working, you can try restarting and disconnecting and reconnecting the unifying receiver to see if it works then, but some receivers of mine were no able to set the property. The receiver with
Firmware 04.02.B0009worked best for me.
Alternatively, you can try to set the property via the command line:
$ solaar config "M720 Triathlon" hires-smooth-resolution true
Wheel Resolution property could be successfully set, you will recognize way too fast scrolling behavior. This can be changed by applying some
Create the file
/etc/udev/hwdb.d/71-logitech-m720.hwdb as root and open it in your preferred editor (also as root or with sudo). Insert the following lines and save the file.
mouse:usb:v046dp405e:name:Logitech M720 Triathlon: mouse:bluetooth:v046dpb015:name:M720 Triathlon: MOUSE_WHEEL_CLICK_ANGLE=1 MOUSE_WHEEL_CLICK_COUNT=360
Next, we have to apply the changes. Run the following commands:
$ sudo udevadm hwdb --update $ libinput list-devices | grep -A 1 M720 Device: Logitech M720 Triathlon Kernel: /dev/input/event15 $ sudo udevadm trigger /dev/input/event15
/dev/input/event15with the result shown by `libinput list-devices**
You got pixel-perfect scrolling with your mouse-wheel!
A before/after comparison of the proposed configuration
Persisting the Configuration
hwdb configuration will be automatically loaded when you plug in your mouse. The
Wheel Resolution property is sometimes restored by Solaar, and sometimes not. Try to put Solaar in the autostart of your desktop environment. It might work. Otherwise, you have to manually enable the property 😢
Enhancements and Future Work
The scrolling can stutter or jump when scrolling really slow. Also, when the middle mouse button is clicked you may unintentionally scroll, as the sensitivity of the scroll-wheel is so high. Maybe, this can be solved by applying a filter with libinput on the incoming scroll events. I have not figured out, how to set this up, yet.