We’re in the middle of the 1.7 development cycle and one of the features merged already is support for “wheel tilt”, i.e. support for devices that don’t have a separate horizontal wheel but instead rely on a tilt motion for horizontal event. Now, the way this is handled in the kernel is that the events are sent via REL_WHEEL (or REL_DIAL) so we don’t actually need special code in libinput to handle tilt. But libinput tries to to make sense of input devices so the upper layers have a reliable base to build on – and that’s why we need tilt-wheels to be handled.
For ‘pointer axis’ events (i.e. scroll events) libinput provides scroll sources. These specify how the scroll event was generated, allowing a caller to handle things accordingly. A finger-based scroll for example can trigger kinetic scrolling while a mouse wheel would not usually do so. The value for a pointer axis is also dependent on the scroll source – for continuous/finger based scrolling the value is in pixels. For a mouse wheel, the value is in degrees. This obviously doesn’t work for a tilt event because degrees don’t make sense in this context. So the new axis source is just that, an indicator that the event was caused by a wheel tilt rather than a rotation. Its value matches the default wheel rotation (i.e. 15 degrees) just to make use of it easier.
Of course, a device won’t tell us whether it provides a proper wheel or just tilt. So we need a hwdb property and I’ve added that to systemd. To make this work, set the MOUSE_WHEEL_TILT_HORIZONTAL and/or MOUSE_WHEEL_TILT_VERTICAL property on your hardware and you’re off. Yay.
Patches for the wayland protocol have been merged as well, so this is/will be available to wayland clients.