[PATCH libinput 04/11] touchpad: Change how we deal with scroll methods

Peter Hutterer peter.hutterer at who-t.net
Thu Feb 19 01:50:47 PST 2015


On Wed, Feb 18, 2015 at 01:26:47PM +0100, Hans de Goede wrote:
> With the upcoming gesture support 2fg scrolling will be handled as part of
> the main gesture state machine, where as edge scrolling has its own state

typo: whereas

Cheers,
   Peter

> machine, our current way of dispatching scroll "actions" does not play well
> with this.
> 
> Change the scroll method handling to treat edge and 2fg scrolling as 2
> separate state machines. The double scroll calls this introduces will mostly
> be removed when the gesture handling code lands.
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  src/evdev-mt-touchpad-edge-scroll.c |  3 ++
>  src/evdev-mt-touchpad.c             | 73 +++++++------------------------------
>  2 files changed, 17 insertions(+), 59 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c
> index 8d0a13e..df181d5 100644
> --- a/src/evdev-mt-touchpad-edge-scroll.c
> +++ b/src/evdev-mt-touchpad-edge-scroll.c
> @@ -317,6 +317,9 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
>  	enum libinput_pointer_axis axis;
>  	double dx, dy, *delta;
>  
> +	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE)
> +		return 0;
> +
>  	tp_for_each_touch(tp, t) {
>  		if (!t->dirty)
>  			continue;
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index ae37ab1..a6de661 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -581,6 +581,9 @@ tp_twofinger_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
>  	struct tp_touch *t;
>  	int nfingers_down = 0;
>  
> +	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_2FG)
> +		return 0;
> +
>  	/* No 2fg scrolling during tap-n-drag */
>  	if (tp_tap_dragging(tp))
>  		return 0;
> @@ -606,60 +609,6 @@ tp_twofinger_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
>  }
>  
>  static void
> -tp_scroll_handle_state(struct tp_dispatch *tp, uint64_t time)
> -{
> -	/* Note this must be always called, so that it knows the state of
> -	 * touches when the scroll-mode changes.
> -	 */
> -	tp_edge_scroll_handle_state(tp, time);
> -}
> -
> -static int
> -tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time)
> -{
> -	struct libinput *libinput = tp->device->base.seat->libinput;
> -
> -	switch (tp->scroll.method) {
> -	case LIBINPUT_CONFIG_SCROLL_NO_SCROLL:
> -		break;
> -	case LIBINPUT_CONFIG_SCROLL_2FG:
> -		return tp_twofinger_scroll_post_events(tp, time);
> -	case LIBINPUT_CONFIG_SCROLL_EDGE:
> -		return tp_edge_scroll_post_events(tp, time);
> -	case LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN:
> -		log_bug_libinput(libinput, "Unexpected scroll mode\n");
> -		break;
> -	}
> -	return 0;
> -}
> -
> -static void
> -tp_stop_scroll_events(struct tp_dispatch *tp, uint64_t time)
> -{
> -	struct libinput *libinput = tp->device->base.seat->libinput;
> -
> -	switch (tp->scroll.method) {
> -	case LIBINPUT_CONFIG_SCROLL_NO_SCROLL:
> -		break;
> -	case LIBINPUT_CONFIG_SCROLL_2FG:
> -		tp_twofinger_stop_scroll(tp, time);
> -		break;
> -	case LIBINPUT_CONFIG_SCROLL_EDGE:
> -		tp_edge_scroll_stop_events(tp, time);
> -		break;
> -	case LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN:
> -		log_bug_libinput(libinput, "Unexpected scroll mode\n");
> -		break;
> -	}
> -}
> -
> -static void
> -tp_remove_scroll(struct tp_dispatch *tp)
> -{
> -	tp_remove_edge_scroll(tp);
> -}
> -
> -static void
>  tp_unhover_touches(struct tp_dispatch *tp, uint64_t time)
>  {
>  	struct tp_touch *t;
> @@ -749,7 +698,7 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
>  	}
>  
>  	tp_button_handle_state(tp, time);
> -	tp_scroll_handle_state(tp, time);
> +	tp_edge_scroll_handle_state(tp, time);
>  
>  	/*
>  	 * We have a physical button down event on a clickpad. To avoid
> @@ -862,11 +811,14 @@ tp_post_events(struct tp_dispatch *tp, uint64_t time)
>  	filter_motion |= tp_post_button_events(tp, time);
>  
>  	if (filter_motion || tp->sendevents.trackpoint_active) {
> -		tp_stop_scroll_events(tp, time);
> +		tp_edge_scroll_stop_events(tp, time);
> +		tp_twofinger_stop_scroll(tp, time);
>  		return;
>  	}
>  
> -	if (tp_post_scroll_events(tp, time) != 0)
> +	if (tp_edge_scroll_post_events(tp, time) != 0)
> +		return;
> +	if (tp_twofinger_scroll_post_events(tp, time) != 0)
>  		return;
>  
>  	tp_post_pointer_motion(tp, time);
> @@ -925,7 +877,7 @@ tp_remove(struct evdev_dispatch *dispatch)
>  	tp_remove_tap(tp);
>  	tp_remove_buttons(tp);
>  	tp_remove_sendevents(tp);
> -	tp_remove_scroll(tp);
> +	tp_remove_edge_scroll(tp);
>  }
>  
>  static void
> @@ -1255,11 +1207,14 @@ tp_scroll_config_scroll_method_set_method(struct libinput_device *device,
>  {
>  	struct evdev_device *evdev = (struct evdev_device*)device;
>  	struct tp_dispatch *tp = (struct tp_dispatch*)evdev->dispatch;
> +	uint64_t time = libinput_now(device->seat->libinput);
>  
>  	if (method == tp->scroll.method)
>  		return LIBINPUT_CONFIG_STATUS_SUCCESS;
>  
> -	tp_stop_scroll_events(tp, libinput_now(device->seat->libinput));
> +	tp_edge_scroll_stop_events(tp, time);
> +	tp_twofinger_stop_scroll(tp, time);
> +
>  	tp->scroll.method = method;
>  
>  	return LIBINPUT_CONFIG_STATUS_SUCCESS;
> -- 
> 2.1.0
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 


More information about the wayland-devel mailing list