diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2018-09-06 14:11:23 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2018-09-06 14:11:23 +1000 |
commit | f38fae3a8990f93153f9fa740f0d40c3c5cff947 (patch) | |
tree | bcc7f009d69837d74444c11c145deeb19b36696b /test | |
parent | f8fec24c2f6e13440c4f7db7cbcc7a7dbe7d6299 (diff) |
tablet: on tip down/up, force the delta to zero
We may get a pointer jump on tip down/up, see #128. For absolute coordinates
we reset the history to avoid smoothing across that jump but deltas still used
to be calculated based on the previous position to the current one. This
can result in a large jump on tip down.
Since the delta is supposed to be useful (and not physically accurate, see the
docs), let's force it to 0/0 on tip down/up to avoid that scenario.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'test')
-rw-r--r-- | test/test-tablet.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/test/test-tablet.c b/test/test-tablet.c index 1c850910..aa93ec24 100644 --- a/test/test-tablet.c +++ b/test/test-tablet.c @@ -4077,6 +4077,78 @@ START_TEST(relative_delta) } END_TEST +START_TEST(relative_no_delta_on_tip) +{ + struct litest_device *dev = litest_current_device(); + struct libinput *li = dev->libinput; + struct libinput_event *event; + struct libinput_event_tablet_tool *tev; + struct axis_replacement axes[] = { + { ABS_DISTANCE, 10 }, + { ABS_PRESSURE, 0 }, + { -1, -1 } + }; + double dx, dy; + + litest_tablet_proximity_in(dev, 10, 10, axes); + litest_drain_events(li); + + litest_tablet_motion(dev, 20, 10, axes); + litest_drain_events(li); + + /* tip down */ + litest_axis_set_value(axes, ABS_DISTANCE, 0); + litest_axis_set_value(axes, ABS_PRESSURE, 30); + litest_push_event_frame(dev); + litest_tablet_motion(dev, 30, 20, axes); + litest_event(dev, EV_KEY, BTN_TOUCH, 1); + litest_pop_event_frame(dev); + + libinput_dispatch(li); + event = libinput_get_event(li); + tev = litest_is_tablet_event(event, + LIBINPUT_EVENT_TABLET_TOOL_TIP); + ck_assert(libinput_event_tablet_tool_x_has_changed(tev)); + ck_assert(libinput_event_tablet_tool_y_has_changed(tev)); + dx = libinput_event_tablet_tool_get_dx(tev); + dy = libinput_event_tablet_tool_get_dy(tev); + ck_assert(dx == 0.0); + ck_assert(dy == 0.0); + libinput_event_destroy(event); + + /* normal motion */ + litest_tablet_motion(dev, 40, 30, axes); + libinput_dispatch(li); + event = libinput_get_event(li); + tev = litest_is_tablet_event(event, + LIBINPUT_EVENT_TABLET_TOOL_AXIS); + dx = libinput_event_tablet_tool_get_dx(tev); + dy = libinput_event_tablet_tool_get_dy(tev); + ck_assert(dx > 0.0); + ck_assert(dy > 0.0); + libinput_event_destroy(event); + + /* tip up */ + litest_axis_set_value(axes, ABS_DISTANCE, 10); + litest_axis_set_value(axes, ABS_PRESSURE, 0); + litest_push_event_frame(dev); + litest_tablet_motion(dev, 50, 40, axes); + litest_event(dev, EV_KEY, BTN_TOUCH, 0); + litest_pop_event_frame(dev); + libinput_dispatch(li); + event = libinput_get_event(li); + tev = litest_is_tablet_event(event, + LIBINPUT_EVENT_TABLET_TOOL_TIP); + ck_assert(libinput_event_tablet_tool_x_has_changed(tev)); + ck_assert(libinput_event_tablet_tool_y_has_changed(tev)); + dx = libinput_event_tablet_tool_get_dx(tev); + dy = libinput_event_tablet_tool_get_dy(tev); + ck_assert(dx == 0.0); + ck_assert(dy == 0.0); + libinput_event_destroy(event); +} +END_TEST + START_TEST(relative_calibration) { struct litest_device *dev = litest_current_device(); @@ -4840,6 +4912,7 @@ TEST_COLLECTION(tablet) litest_add("tablet:relative", relative_no_profile, LITEST_TABLET, LITEST_ANY); litest_add("tablet:relative", relative_no_delta_prox_in, LITEST_TABLET, LITEST_ANY); litest_add("tablet:relative", relative_delta, LITEST_TABLET, LITEST_ANY); + litest_add("tablet:relative", relative_no_delta_on_tip, LITEST_TABLET, LITEST_ANY); litest_add("tablet:relative", relative_calibration, LITEST_TABLET, LITEST_ANY); litest_add_for_device("tablet:touch-arbitration", intuos_touch_arbitration, LITEST_WACOM_INTUOS); |