summaryrefslogtreecommitdiff
path: root/test/test-pointer.c
diff options
context:
space:
mode:
authorJosé Expósito <jose.exposito89@gmail.com>2021-09-24 18:08:01 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2021-09-27 22:43:22 +0000
commit5bda716ebfdfbce2017efa5e87b91a65ed9fa4a5 (patch)
treeb7d021544948c358d94e71c40671d86d2a7d0311 /test/test-pointer.c
parente0aa946e39887f6ff1ac825d99c6a0295de937b4 (diff)
downloadlibinput-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.c66
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);