diff options
author | José Expósito <jose.exposito89@gmail.com> | 2021-09-24 18:08:01 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2021-09-27 22:43:22 +0000 |
commit | 5bda716ebfdfbce2017efa5e87b91a65ed9fa4a5 (patch) | |
tree | b7d021544948c358d94e71c40671d86d2a7d0311 /test/test-pointer.c | |
parent | e0aa946e39887f6ff1ac825d99c6a0295de937b4 (diff) | |
download | libinput-5bda716ebfdfbce2017efa5e87b91a65ed9fa4a5.tar.gz |
fallback: hires scroll heuristics for buggy devices
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, print a kernel bug warning and start
emulating high-resolution scroll events.
Fix #668
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Diffstat (limited to 'test/test-pointer.c')
-rw-r--r-- | test/test-pointer.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/test/test-pointer.c b/test/test-pointer.c index 2be64ee2..218fe074 100644 --- a/test/test-pointer.c +++ b/test/test-pointer.c @@ -803,6 +803,70 @@ START_TEST(pointer_scroll_wheel_hires) } END_TEST +START_TEST(pointer_scroll_wheel_hires_send_only_lores_vertical) +{ + struct litest_device *dev = litest_current_device(); + struct libinput *li = dev->libinput; + + if (!libevdev_has_event_code(dev->evdev, EV_REL, REL_WHEEL_HI_RES) && + !libevdev_has_event_code(dev->evdev, EV_REL, REL_HWHEEL_HI_RES)) + return; + + litest_drain_events(dev->libinput); + litest_set_log_handler_bug(li); + + litest_event(dev, EV_REL, REL_WHEEL, 1); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_WHEEL, -120); + + litest_event(dev, EV_REL, REL_WHEEL, -1); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_WHEEL, 120); + + litest_event(dev, EV_REL, REL_HWHEEL, 1); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_HWHEEL, 120); + + litest_assert_empty_queue(li); + litest_restore_log_handler(li); +} +END_TEST + +START_TEST(pointer_scroll_wheel_hires_send_only_lores_horizontal) +{ + struct litest_device *dev = litest_current_device(); + struct libinput *li = dev->libinput; + + if (!libevdev_has_event_code(dev->evdev, EV_REL, REL_WHEEL_HI_RES) && + !libevdev_has_event_code(dev->evdev, EV_REL, REL_HWHEEL_HI_RES)) + return; + + litest_drain_events(dev->libinput); + litest_set_log_handler_bug(li); + + litest_event(dev, EV_REL, REL_HWHEEL, 2); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_HWHEEL, 240); + + litest_event(dev, EV_REL, REL_WHEEL, -1); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_WHEEL, 120); + + litest_event(dev, EV_REL, REL_HWHEEL, 1); + litest_event(dev, EV_SYN, SYN_REPORT, 0); + libinput_dispatch(li); + test_high_and_low_wheel_events_value(dev, REL_HWHEEL, 120); + + litest_assert_empty_queue(li); + litest_restore_log_handler(li); +} +END_TEST + START_TEST(pointer_scroll_natural_defaults) { struct litest_device *dev = litest_current_device(); @@ -3429,6 +3493,8 @@ TEST_COLLECTION(pointer) litest_add_for_device(pointer_scroll_wheel_pressed_noscroll, LITEST_MOUSE); litest_add_for_device(pointer_scroll_hi_res_wheel_pressed_noscroll, LITEST_MOUSE); litest_add(pointer_scroll_wheel_hires, LITEST_WHEEL, LITEST_TABLET); + litest_add(pointer_scroll_wheel_hires_send_only_lores_vertical, LITEST_WHEEL, LITEST_TABLET); + litest_add(pointer_scroll_wheel_hires_send_only_lores_horizontal, LITEST_WHEEL, LITEST_TABLET); litest_add(pointer_scroll_button, LITEST_RELATIVE|LITEST_BUTTON, LITEST_ANY); litest_add(pointer_scroll_button_noscroll, LITEST_ABSOLUTE|LITEST_BUTTON, LITEST_RELATIVE); litest_add(pointer_scroll_button_noscroll, LITEST_ANY, LITEST_RELATIVE|LITEST_BUTTON); |