[PATCH libinput] touchpad: enable natural scrolling for edge scrolling
Hans de Goede
hdegoede at redhat.com
Tue Aug 11 00:53:31 PDT 2015
Hi,
On 11-08-15 04:53, Peter Hutterer wrote:
> Instead of going straight to pointer_notify_axis, go through
> evdev_notify_axis() which flips the scroll direction around for us.
>
> https://bugs.freedesktop.org/show_bug.cgi?id=91597
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Good catch:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> src/evdev-mt-touchpad-edge-scroll.c | 20 ++++++++++----------
> src/evdev.c | 2 +-
> src/evdev.h | 7 +++++++
> test/touchpad.c | 30 ++++++++++++++++++++++++++++++
> 4 files changed, 48 insertions(+), 11 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c
> index 4902808..eda62e4 100644
> --- a/src/evdev-mt-touchpad-edge-scroll.c
> +++ b/src/evdev-mt-touchpad-edge-scroll.c
> @@ -342,7 +342,7 @@ tp_edge_scroll_handle_state(struct tp_dispatch *tp, uint64_t time)
> int
> tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> {
> - struct libinput_device *device = &tp->device->base;
> + struct evdev_device *device = tp->device;
> struct tp_touch *t;
> enum libinput_pointer_axis axis;
> double *delta;
> @@ -369,7 +369,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> case EDGE_NONE:
> if (t->scroll.direction != -1) {
> /* Send stop scroll event */
> - pointer_notify_axis(device, time,
> + evdev_notify_axis(device, time,
> AS_MASK(t->scroll.direction),
> LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
> &zero,
> @@ -395,7 +395,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> switch (t->scroll.edge_state) {
> case EDGE_SCROLL_TOUCH_STATE_NONE:
> case EDGE_SCROLL_TOUCH_STATE_AREA:
> - log_bug_libinput(device->seat->libinput,
> + log_bug_libinput(tp_libinput_context(tp),
> "unexpected scroll state %d\n",
> t->scroll.edge_state);
> break;
> @@ -416,11 +416,11 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> if (*delta == 0.0)
> continue;
>
> - pointer_notify_axis(device, time,
> - AS_MASK(axis),
> - LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
> - &normalized,
> - &zero_discrete);
> + evdev_notify_axis(device, time,
> + AS_MASK(axis),
> + LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
> + &normalized,
> + &zero_discrete);
> t->scroll.direction = axis;
>
> tp_edge_scroll_handle_event(tp, t, SCROLL_EVENT_POSTED);
> @@ -432,14 +432,14 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
> void
> tp_edge_scroll_stop_events(struct tp_dispatch *tp, uint64_t time)
> {
> - struct libinput_device *device = &tp->device->base;
> + struct evdev_device *device = tp->device;
> struct tp_touch *t;
> const struct normalized_coords zero = { 0.0, 0.0 };
> const struct discrete_coords zero_discrete = { 0.0, 0.0 };
>
> tp_for_each_touch(tp, t) {
> if (t->scroll.direction != -1) {
> - pointer_notify_axis(device, time,
> + evdev_notify_axis(device, time,
> AS_MASK(t->scroll.direction),
> LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
> &zero,
> diff --git a/src/evdev.c b/src/evdev.c
> index 53ebf9d..225c3ac 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -612,7 +612,7 @@ evdev_process_absolute_motion(struct evdev_device *device,
> }
> }
>
> -static void
> +void
> evdev_notify_axis(struct evdev_device *device,
> uint64_t time,
> uint32_t axes,
> diff --git a/src/evdev.h b/src/evdev.h
> index 65c5a41..c951671 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -381,6 +381,13 @@ void
> evdev_init_natural_scroll(struct evdev_device *device);
>
> void
> +evdev_notify_axis(struct evdev_device *device,
> + uint64_t time,
> + uint32_t axes,
> + enum libinput_pointer_axis_source source,
> + const struct normalized_coords *delta_in,
> + const struct discrete_coords *discrete_in);
> +void
> evdev_post_scroll(struct evdev_device *device,
> uint64_t time,
> enum libinput_pointer_axis_source source,
> diff --git a/test/touchpad.c b/test/touchpad.c
> index 6e7ea5f..bbdbc21 100644
> --- a/test/touchpad.c
> +++ b/test/touchpad.c
> @@ -350,6 +350,35 @@ START_TEST(touchpad_scroll_natural_2fg)
> }
> END_TEST
>
> +START_TEST(touchpad_scroll_natural_edge)
> +{
> + struct litest_device *dev = litest_current_device();
> + struct libinput *li = dev->libinput;
> +
> + litest_enable_edge_scroll(dev);
> + litest_drain_events(li);
> +
> + libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
> +
> + litest_touch_down(dev, 0, 99, 20);
> + litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
> + litest_touch_up(dev, 0);
> +
> + libinput_dispatch(li);
> + litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -4);
> + litest_assert_empty_queue(li);
> +
> + litest_touch_down(dev, 0, 99, 80);
> + litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10, 0);
> + litest_touch_up(dev, 0);
> +
> + libinput_dispatch(li);
> + litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
> + litest_assert_empty_queue(li);
> +
> +}
> +END_TEST
> +
> START_TEST(touchpad_edge_scroll)
> {
> struct litest_device *dev = litest_current_device();
> @@ -3450,6 +3479,7 @@ litest_setup_tests(void)
> litest_add("touchpad:scroll", touchpad_scroll_natural_defaults, LITEST_TOUCHPAD, LITEST_ANY);
> litest_add("touchpad:scroll", touchpad_scroll_natural_enable_config, LITEST_TOUCHPAD, LITEST_ANY);
> litest_add("touchpad:scroll", touchpad_scroll_natural_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
> + litest_add("touchpad:scroll", touchpad_scroll_natural_edge, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
> litest_add("touchpad:scroll", touchpad_scroll_defaults, LITEST_TOUCHPAD, LITEST_ANY);
> litest_add("touchpad:scroll", touchpad_edge_scroll, LITEST_TOUCHPAD, LITEST_ANY);
> litest_add("touchpad:scroll", touchpad_edge_scroll_no_motion, LITEST_TOUCHPAD, LITEST_ANY);
>
More information about the wayland-devel
mailing list