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

Peter Hutterer peter.hutterer at who-t.net
Wed Jun 1 05:32:28 UTC 2016


On Tue, May 31, 2016 at 10:18:58AM +0200, Hans de Goede wrote:
> 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:

unfortunately in both of your cases we still get the verbose output. this
hunk has no real effect because if edge scrolling is disabled,
tp_touch_get_edge() is always false.
> 
> @@ -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);

and in this case we're still calling into tp_edge_scroll_handle_event() from
TOUCH_UPDATE/END and timeouts. and that is where the log messages come from.

> 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>

thanks, I think I'll stick with the originally proposed patch. it's not as
nice but it keeps things in one place and does the job.

Cheers,
   Peter

> 
> 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