Bug 97404

Summary: Add support for Horizontal Wheels (angle > click events) and Horizontal Wheel "sensitivity"
Product: xorg Reporter: Ariel <ari.reads>
Component: Input/libinputAssignee: Peter Hutterer <peter.hutterer>
Status: RESOLVED MOVED QA Contact: Xorg Project Team <xorg-team>
Severity: normal    
Priority: medium CC: ari.reads, peter.hutterer
Version: unspecified   
Hardware: Other   
OS: All   
Whiteboard:
i915 platform: i915 features:
Bug Depends on: 92772    
Bug Blocks:    

Description Ariel 2016-08-19 04:37:44 UTC
As discussed with whot on #wayland (freenode)
& in this systemd bug: https://github.com/systemd/systemd/issues/3947


This request is to add conversion for the Click Angle to click events for a new device that was added in hwdb (see github bug above)

The actual conversion from click angle to click events is done by the xf86-input-libinput driver.


Device:

Input device name: "Logitech MX Master"
Input device ID: bus 0x03 vendor 0x46d product 0x4041 version 0x111

Main Vertical scroll wheel: 24 clicks for a full revolution
Reported by evemu-record as (for each click):
E: 9.273909 0002 0008 -001 # EV_REL / REL_WHEEL

Horizontal scroll wheel AKA "thumbwheel": generates 14 events for a full revolution (it's a tiny wheel)
Reported by evemu-record as (for each 'click'):
E: 11.859882 0002 0006 0001 # EV_REL / REL_HWHEEL

Notes:
The main wheel supports "free spinning mode" or "ratchet mode". It produces 24 events in either mode.
The smaller 'horizontal scroll wheel' is always in free spinning mode (no ratchet) but spins slowly (no inertia)

The bottom line request is to have equivalent functionality in libinput as we had with evdev, where we could add "dividers" to the events generated by either wheel, for example:

xinput set-prop 11 "Evdev Scrolling Distance" 1 2 1

... this caused the Horizontal Wheel to send to the app a single horizontal scroll keystroke for every 2 "mouse whell events", in effect decreasing the "sensitivity" of the wheel.
Comment 1 Peter Hutterer 2016-08-22 01:41:03 UTC
tbh, I'm not 100% convinced that this is a good idea. The actual hardware-specific patches are straightforward, see the systemd patch and the libinput patch is ready too. With those the hardware works as expected, in that a wheel click event sends the correct angle to the applications.

but in the xorg driver we don't look at the angle (not for wheel events anyway), we merely deal with the clicks themselves and pass those on. I'm not really happy having to introduce a config option to handle those in a special manner.
that the property even works for wheels is more of a historical accident, originally it was designed to flip the wheels around where needed (iirc).

if I understand this right, the reason you need the wheel slowdown is because it doesn't have a ratcheting and it's hard to tell when the clicks happen?
Comment 2 Ariel 2016-09-18 17:32:32 UTC
The reason I need this is because rotating the horizontal wheel produces the same result as ctrl-page-up or ctrl-page-down, i.e. switch to the next tab or the previous tab in all common tabbed apps: Firefox, Chrome, Nautilus, gnome-web-browser: this works 'out of the box' in this manner. Tab switching (forward or backwards) happens for every 'event' generated by this tiny wheel.

As you can guess: since the wheel is so tiny and is "free spinning" (no ratchet), it only takes an accidental touch to the wheel to fire events, which produces very annoying results, i.e. when filling in forms with the mouse in a webpage, suddenly you are taken to another tab, etc. 

Before libinput, people dealt with this by changing the "sensitivity" by having the driver fire one "keypress" every "x events" (e.g. switch one tab ever 50 degrees instead of 25).

The Windows driver from logitech has this functionality, they call it "Horizontal scroll sensitivity", located in the "Settings" section. In gnome, this was also supported by using:

xinput set-prop 11 "Evdev Scrolling Distance" 1 2 1

(where 2 means reduce sensitivity from 1 event every 25 degrees to 1 every 50)

My ask here is to have equivalent functionality when using libinput so that the Horizontal Wheel will be usable. Right now, I have to disable when using browsers:

xinput --set-prop 'pointer:Logitech MX Master' 'libinput Horizonal Scroll Enabled' 0


This mouse is becoming hugely popular. Solaar (the linux GUI) recently merged support for its fancy features ("smart shift") there was an interesting discussion on this when they were asked to add support "horizontal wheel sensitivity", this triggered my feature request here.
Comment 3 GitLab Migration User 2018-08-10 20:56:29 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput/issues/3.

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.