Various Logitech mice implement hi-res scrolling. This means instead of having the content move 3 lines on each scroll click, you can scroll per-pixel using many more precise scroll events sent by the mouse. This gives you a precise and smooth experience in applications that support it.

Enabling the feature

First off, we need to enable this feature on your mouse. Solaar is able to do this. Install it as follows:

pip3 install --user solaar
sudo cp ~/.local/share/solaar/udev-rules.d/42-logitech-unify-permissions.rules /etc/udev/rules.d/

If pip3 isn’t installed, install it using sudo apt install -y python3-pip.

This will install Solaar, and give regular users write access to Logitech HID devices.

Run solaar and enable Scroll Wheel Resolution. You may need to unlock the setting by clicking on the lock icon next to it twice.

Scroll resolution

Now scrolling will be awfully fast, so we need to tell each scroll event matches 1 pixel instead of the default 15. Horizontal scrolling still uses an ordinary wheel click, so we need to make sure that wheel behaves as before.

If you have an MX 3 mouse, just copy the block below, else look up the name of your mouse using xinput. This will for example be Logitech MX Master 3 for a USB connected MX Master 3 or MX Master 3 Mouse if the same device is connected through Bluetooth. As more devices may support this, for example the Logitech MX Anywhere 3, we use a string also matching that device name.

Create a new udev hwdb file called /etc/udev/hwdb.d/71-logitech-mice.hwdb and enter the following:

mouse:*:name:*MX * 3*:
    MOUSE_WHEEL_CLICK_ANGLE=1
    MOUSE_WHEEL_CLICK_COUNT=360
    MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26
    MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14

This will match all MX Master 3 and MX Anywhere 3 mice connected through USB or Bluetooth.

Reload these settings using the following commands to give them a try.

sudo systemd-hwdb update
sudo udevadm trigger /dev/input/event*

Enjoy your new smooth scrolling!

Application specific

Some applications don’t play well with smooth scrolling, and some don’t recognize it by default. This may change over time, so here’s some examples if you encounter problems.

Firefox1

Firefox will wait for 15 scrolled pixels before moving down 15 pixels using their own smooth scrolling setup. We need to tell Firefox we’re using xinput2 as follows:

echo "export MOZ_USE_XINPUT2=1" | sudo tee /etc/profile.d/use-xinput2.sh

and disable the built-in smooth scrolling in about:preferences. Search for Use smooth scrolling and disable it.

You need to log out and back in again for the above to work. You can also try it out by closing firefox and then running it from a terminal using MOZ_USE_XINPUT2=1 firefox.

Virtualbox

Scrolling in a guest in Virtualbox will be much worse now since xinputs Motion events won’t reach the guest. So you’ll need to scroll quite fast for the ButtonPress events to be generated and then passed to the guest. There doesn’t seem to be a way to fix this, so we need to disable XInput 2 support when starting a Virtualbox guest by setting QT_XCB_NO_XI2=1. We can’t do this through the interface, so we need to start a guest using:

QT_XCB_NO_XI2=1 VBoxManage startvm <Guest VM name or UUID>

And now we have regular (non-smooth) scrolling in that guest.