[PATCH libinput] touchpad: short-circuit the edge scroll handling when it's not enabled

Hans de Goede hdegoede at redhat.com
Tue May 31 08:18:58 UTC 2016


Hi,

On 31-05-16 02:16, Peter Hutterer wrote:
> No need to handle events properly in the edge scroll state machine when it's
> not enabled. Just set any beginning touch to state AREA and move on. The rest
> of the code guarantees neutral state when edge scrolling is enabled or
> disabled.
>
> This reduces the debug output produced by libinput-debug-events when edge
> scrolling is disabled, preventing users from seemingly identifying
> bugs where there are none.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  src/evdev-mt-touchpad-edge-scroll.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c
> index fcc0512..8222bba 100644
> --- a/src/evdev-mt-touchpad-edge-scroll.c
> +++ b/src/evdev-mt-touchpad-edge-scroll.c
> @@ -318,6 +318,15 @@ tp_edge_scroll_handle_state(struct tp_dispatch *tp, uint64_t time)
>  {
>  	struct tp_touch *t;
>
> +	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE) {
> +		tp_for_each_touch(tp, t) {
> +			if (t->state == TOUCH_BEGIN)
> +				t->scroll.edge_state =
> +					EDGE_SCROLL_TOUCH_STATE_AREA;
> +		}
> +		return;
> +	}
> +
>  	tp_for_each_touch(tp, t) {
>  		if (!t->dirty)
>  			continue;

IMHO it would be cleaner to replace this hunk with:

@@ -141,7 +141,8 @@ tp_edge_scroll_handle_none(struct tp_dispatch *tp,

         switch (event) {
         case SCROLL_EVENT_TOUCH:
-           if (tp_touch_get_edge(tp, t)) {
+         if (tp->scroll.method == LIBINPUT_CONFIG_SCROLL_EDGE &&
+             tp_touch_get_edge(tp, t)) {
                         tp_edge_scroll_set_state(tp, t,
                                         EDGE_SCROLL_TOUCH_STATE_EDGE_NEW);
                 } else {

This is the cleanest solution IMHO, but then we still get one log_debug for new touches;
alternatively we could do:

@@ -327,7 +327,13 @@ tp_edge_scroll_handle_state(struct tp_dispatch *tp, uint64_t time)
                 case TOUCH_HOVERING:
                         break;
                 case TOUCH_BEGIN:
-                   tp_edge_scroll_handle_event(tp, t, SCROLL_EVENT_TOUCH);
+                 if (tp->scroll.method == LIBINPUT_CONFIG_SCROLL_EDGE) {
+                         tp_edge_scroll_handle_event(tp, t,
+                                         SCROLL_EVENT_TOUCH);
+                 } else {
+                         tp_edge_scroll_set_state(tp, t,
+                                         EDGE_SCROLL_TOUCH_STATE_AREA);
+                 }
                         break;
                 case TOUCH_UPDATE:
                         tp_edge_scroll_handle_event(tp, t, SCROLL_EVENT_MOTION);

That at least avoids the double tp_for_each_touch(tp, t) {}

I've a slight preference for the first solution, and just living with the
one debug line for a new touch, after all this is for debugging only, and
code-wise it is by far the cleanest.

Anyways all 3 get the job done in the end, so this patch is:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Feel free to pick any of the outlined solutions (including your original one).

> @@ -350,9 +359,6 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
>  	const struct normalized_coords zero = { 0.0, 0.0 };
>  	const struct discrete_coords zero_discrete = { 0.0, 0.0 };
>
> -	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE)
> -		return 0;
> -
>  	tp_for_each_touch(tp, t) {
>  		if (!t->dirty)
>  			continue;
>

Regards,

Hans


More information about the wayland-devel mailing list