Years ago, after problems with my wrist, I moved to using a trackball when ever I can. Good move it was too, but I am left with one pain. I use a Logitech Marble Mouse and it has no scroll wheel; this is sad because I have loved scroll wheels since they came out. So, instead, I use scroll wheel emulation — you hold down a button and trackball moves are interpreted as scroll events.

Now, this leaves me with one remaining pain. For no readily apparent reason, the method for configuring it has moved from one place to another, normally every couple of releases. At one point, it was in xorg.con, then in HAL, for a joyful period with the gpointer-settings GUI which then broke and disappeared, and I ended up with xinput run from a shell script.

Having just upgrading to Ubuntu 17.04 guess what? Broken again.

I have been using this:

xinput set-button-map "Logitech USB Trackball" 1 2 3 4 5 6 7 8 9
xinput set-int-prop "Logitech USB Trackball" "Evdev Wheel Emulation Button" 8 8
xinput set-int-prop "Logitech USB Trackball" "Evdev Wheel Emulation" 8 1
xinput set-int-prop "Logitech USB Trackball" "Evdev Wheel Emulation Axes" 8 6 7 4 5
xinput set-int-prop "Logitech USB Trackball" "Evdev Wheel Emulation X Axis" 8 6
xinput set-int-prop "Logitech USB Trackball" "Evdev Drag Lock Buttons" 8 9

Well from a bug report here:

https://bugs.launchpad.net/ubuntu/+source/xorg/+bug/1682193/comments/7

It turns out that the reason this no longer works is because Evdev is not used anymore, thanks to the move to Wayland; now I need to use libinput. Unfortunate, since these “big” linux issues (unity, wayland, systemd) are something that I try very hard not to have to care about at all.

I tried lots of dead reckoning with libinput but got all sorts of errors, or just non-functioning. Eventually, I worked out the right way forward this way.

xinput --list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                    id=4    [slave  pointer  (2)]
⎜   ↳ HID 1267:0103                                 id=11   [slave  pointer  (2)]
⎜   ↳ Logitech USB Trackball                        id=12   [slave  pointer  (2)]

Which gives the device number (12). Then

xinput --list-props 12
Device 'Logitech USB Trackball':
        Device Enabled (136):   1
        libinput Scroll Methods Available (284):        0, 0, 1
        libinput Scroll Method Enabled (285):   0, 0, 1
        libinput Scroll Method Enabled Default (286):   0, 0, 1
        libinput Button Scrolling Button (287): 2
        libinput Button Scrolling Button Default (288): 2

This is mostly correct — the last 1 on Scroll Method Enabled means “button”. But the 262 on Button Scrolling Button is not so good. It needs to be 8.

Next up, set-int-prop is deprecated, so lets not use that. So I tried this instead:

xinput set-prop 12 287 8

The 12 is the device number, 287 is the property number (found from --list-props above), and the 8 is the correct button. But this is ugly and incomprehensible; more, I do not know if the numbers (12 and 287) will remain the same across all my computers. So, let’s use names instead.

xinput --set-prop "Logitech USB Trackball" "libinput Button Scrolling Button" 8

Which leaves me with these properties:

xinput --list-props 12
Device 'Logitech USB Trackball':
        Device Enabled (136):   1
        libinput Scroll Methods Available (284):        0, 0, 1
        libinput Scroll Method Enabled (285):   0, 0, 1
        libinput Scroll Method Enabled Default (286):   0, 0, 1
        libinput Button Scrolling Button (287): 8
        libinput Button Scrolling Button Default (288): 2

In the end, the configuration is simple. Now, please, please devs, don’t break it again!

  • Update

The original post was wrong but settings from earlier experiments were persisting when I thought they were not.

2 Comments

  1. Dmytro says:

    Thank you!

    For me,

    xinput –set-button-map “Logitech USB Trackball” 1 2 3 4 5 6 7 8 9
    xinput set-prop “Logitech USB Trackball” “libinput Natural Scrolling Enabled” 1
    xinput set-prop “Logitech USB Trackball” “libinput Middle Emulation Enabled” 1
    xinput –set-prop “Logitech USB Trackball” “libinput Button Scrolling Button” 8
    xinput set-prop “Logitech USB Trackball” “libinput Drag Lock Buttons” 9

    works pretty well.

  2. Brett says:

    Thanks for this! I also had to add

    xinput –set-prop “Logitech USB Trackball” “libinput Scroll Method Enabled” 0 0 1

    as it wasn’t on by default (Debian rather than Ubuntu).

Leave a Reply