Skip to content

High-resolution scroll wheel support

José Expósito requested to merge JoseExposito/weston:jx/hi-res-scrolling into main

Follow up on Peter's work !409 (closed)

Description:

Starting with Linux Kernel v5.0 two new axes are available for high-resolution wheel scrolling: REL_WHEEL_HI_RES and REL_HWHEEL_HI_RES. Both axes send data in fractions of 120 where each multiple of 120 amounts to one logical scroll event. Fractions of 120 indicate a wheel movement less than one detent. A "detent" is the named used in the Kernel for a mouse wheel click: https://www.kernel.org/doc/html/v5.11-rc7/input/event-codes.html#ev-rel

Three new events are now available on libinput: LIBINPUT_EVENT_POINTER_SCROLL_WHEEL, LIBINPUT_EVENT_POINTER_SCROLL_FINGER, and LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS. These events replace the LIBINPUT_EVENT_POINTER_AXIS event, so new clients should simply ignore that event.

This LIBINPUT_EVENT_POINTER_SCROLL_WHEEL event adds a new API libinput_pointer_scroll_get_value_v120(). The libinput_pointer_scroll_get_value_v120() is a mirror from the kernel API (itself a copy of the Windows API). The new event is sent for all wheel events, even those that don't technically support high-resolution scrolling and even on older kernels that don't have this feature. So callers can simply ignore any LIBINPUT_EVENT_POINTER_AXIS event and use the new event types only.

For LIBINPUT_EVENT_POINTER_SCROLL_FINGER and LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS, as well as LIBINPUT_EVENT_POINTER_SCROLL_WHEEL, a new API is available: libinput_pointer_scroll_get_value(). This API is similar to libinput_pointer_axis_get_value().

Status

See libinput.

What's new?

Peter's MR with 2 small changes:

  • Updated to use the new libinput API
  • Adds a reminder for axis, so axis are accumulated until the 120 threshold is reached like discrete values.

cc @whot

Merge request reports