touchpad: don't set the axis for a 0.0 value in a scroll event

Once we trigger diagonal scrolling, the device's scroll direction is set as
horiz+vert. From then on, both axes will be set on every subsequent scroll
event, even when the actual delta for an axis is 0.

This causes continuous scroll stop events in clients that care about these
things.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Peter Hutterer 2015-12-04 15:52:17 +10:00
parent e8f2eb18f0
commit 147162da69
2 changed files with 57 additions and 1 deletions

View file

@ -2548,9 +2548,16 @@ evdev_post_scroll(struct evdev_device *device,
if (!normalized_is_zero(event)) {
const struct discrete_coords zero_discrete = { 0.0, 0.0 };
uint32_t axes = device->scroll.direction;
if (event.y == 0.0)
axes &= ~AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
if (event.x == 0.0)
axes &= ~AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
evdev_notify_axis(device,
time,
device->scroll.direction,
axes,
source,
&event,
&zero_discrete);

View file

@ -144,6 +144,54 @@ START_TEST(touchpad_2fg_scroll)
}
END_TEST
START_TEST(touchpad_2fg_scroll_diagonal)
{
struct litest_device *dev = litest_current_device();
struct libinput *li = dev->libinput;
struct libinput_event *event;
struct libinput_event_pointer *ptrev;
int i;
if (!litest_has_2fg_scroll(dev))
return;
litest_enable_2fg_scroll(dev);
litest_drain_events(li);
litest_touch_down(dev, 0, 45, 30);
litest_touch_down(dev, 1, 55, 30);
litest_touch_move_two_touches(dev, 45, 30, 55, 30, 10, 10, 10, 0);
libinput_dispatch(li);
litest_wait_for_event_of_type(li,
LIBINPUT_EVENT_POINTER_AXIS,
-1);
litest_drain_events(li);
/* get rid of any touch history still adding x deltas sideways */
for (i = 0; i < 5; i++)
litest_touch_move(dev, 0, 55, 41 + i);
litest_drain_events(li);
for (i = 6; i < 10; i++) {
litest_touch_move(dev, 0, 55, 41 + i);
libinput_dispatch(li);
event = libinput_get_event(li);
ptrev = litest_is_axis_event(event,
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
ck_assert(!libinput_event_pointer_has_axis(ptrev,
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL));
libinput_event_destroy(event);
}
litest_touch_up(dev, 1);
litest_touch_up(dev, 0);
libinput_dispatch(li);
}
END_TEST
START_TEST(touchpad_2fg_scroll_slow_distance)
{
struct litest_device *dev = litest_current_device();
@ -3500,6 +3548,7 @@ litest_setup_tests(void)
litest_add("touchpad:motion", touchpad_2fg_no_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
litest_add("touchpad:scroll", touchpad_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
litest_add("touchpad:scroll", touchpad_2fg_scroll_diagonal, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
litest_add("touchpad:scroll", touchpad_2fg_scroll_slow_distance, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
litest_add("touchpad:scroll", touchpad_2fg_scroll_return_to_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
litest_add("touchpad:scroll", touchpad_2fg_scroll_source, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);