Incorrectly enabled high-resolution scroll

Some devices might announce support for high-resolution scroll wheel by enabling REL_WHEEL_HI_RES and/or REL_HWHEEL_HI_RES but never send a high-resolution scroll event.

When the first low-resolution scroll event is received without any previous high-resolution event, libinput prints a bug warning with the text “device supports high-resolution scroll but only low-resolution events have been received” and a link to this page.

Note

This warning will be printed only once

In most cases this is a bug on the device firmware, the kernel driver or in a software used to create user-space devices through uinput.

Once the bug is detected, libinput will start emulating high-resolution scroll events.

Detecting and fixing the issue

Events sent by a buggy device can be shown in the libinput record output for the device. Notice that REL_WHEEL_HI_RES and REL_HWHEEL_HI_RES are set but only REL_WHEEL events are sent:

# Supported Events:
# Event type 0 (EV_SYN)
# Event type 1 (EV_KEY)
#   Event code 272 (BTN_LEFT)
# Event type 2 (EV_REL)
#   Event code 0 (REL_X)
#   Event code 1 (REL_Y)
#   Event code 6 (REL_HWHEEL)
#   Event code 8 (REL_WHEEL)
#   Event code 11 (REL_WHEEL_HI_RES)
#   Event code 12 (REL_HWHEEL_HI_RES)
[...]
quirks:
events:
- evdev:
    - [  0,      0,   2,   8,       1] # EV_REL / REL_WHEEL                 1
    - [  0,      0,   0,   0,       0] # ------------ SYN_REPORT (0) ---------- +0ms
- evdev:
    - [  0,  15126,   2,   8,       1] # EV_REL / REL_WHEEL                 1
    - [  0,  15126,   0,   0,       0] # ------------ SYN_REPORT (0) ---------- +15ms
- evdev:
    - [  0,  30250,   2,   8,       1] # EV_REL / REL_WHEEL                 1
    - [  0,  30250,   0,   0,       0] # ------------ SYN_REPORT (0) ---------- +15ms

The issue can be fixed by adding a quirk to unset the REL_WHEEL_HI_RES and REL_HWHEEL_HI_RES event codes:

AttrEventCodeDisable=REL_WHEEL_HI_RES;REL_HWHEEL_HI_RES;

Please see Device quirks for details.