Make mouse movements scroll when the middle button is held down

This Windows feature has never really made its way into the Unix world. In the Unix world, the primary purpose of the middle mouse button is to paste the clipboard content (or more precisely, text selected with the mouse, which is auto-copied). A couple of cross-platform applications such as Firefox and Chrome that support Linux-style middle mouse button under Windows and vice versa, but other than that most applications don't support this kind of fine-grained scrolling.

Nonetheless, you can get fairly close at the system level. It is possible to set up a mouse button such that when it is pressed, mouse movements are transformed into wheel events. This is the same feature that you're used to, but you're likely to find the motion choppy, because applications receive wheel events, which are typically interpreted as scrolling by one whole line or column.

To play with this configuration, use the xinput program (I don't know if there's a GUI frontend for it). First, run the following command to see the name of your pointing device:

$ xinput --list       
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Generic USB Mouse                         id=8    [slave  pointer  (2)]
⎜   ↳ Macintosh mouse button emulation          id=12   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳   USB Keyboard                            id=9    [slave  keyboard (3)]

For example, in the output above, the pointer device is Generic USB mouse. You can run the following command to list the properties that can be tuned:

xinput --list-props 'Generic USB Mouse'

The set of properties you're looking for are the “Evdev Wheel Emulation” ones. With the following settings, when the middle mouse button (button 2) is pressed, moving the mouse sends wheel events (4=up, 5=down, 6=left, 7=right).

xinput --set-prop 'Generic USB Mouse' 'Evdev Wheel Emulation' 1
xinput --set-prop 'Generic USB Mouse' 'Evdev Wheel Emulation Button' 2
xinput --set-prop 'Generic USB Mouse' 'Evdev Wheel Emulation Axes' 6 7 4 5

You may want to tweak other parameters (inertia, timeout).

You can put these commands in a script. Add #!/bin/sh as the very first line, and make the script file executable (e.g. chmod +x ~/bin/activate-wheel-emulation.sh). Then add that script to the list of commands to run when your session starts (gnome-session-properties lets you configure that).

If you have root access and you want to make the change for all users (acceptable on a home machine), it's simpler to do it via the X.org server configuration file. As root, create a file called /etc/X11/xorg.conf.d/wheel-emulation.conf containing settings for the mouse driver. The settings are the same but they're organized a bit differently.

Section "InputClass"
    Identifier "Wheel Emulation"
    MatchProduct "Generic USB Mouse"
    Option "EmulateWheel" "on"
    Option "EmulateWheelButton" "2"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection

Turns out this can be done via Firefox preferences.

  1. From the pull down menu: Edit --> Preferences
  2. Then select the tabs: Advanced --> general
  3. Then check "Use autoscrolling"

Screenshot

   ss


this works for me, Ubuntu 20.04:

#/usr/share/X11/xorg.conf.d/41-libinput.conf
Section "InputClass"
        Identifier "Logitech USB Receiver Mouse"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "ScrollButton" "2"
        Option "ScrollMethod" "button"
        Option "NaturalScrolling" "true"
EndSection