[PATCH 2/3] evdev: Move generic scroll code from evdev-mt-touchpad.c to evdev.c

Peter Hutterer peter.hutterer at who-t.net
Tue Sep 2 20:50:08 PDT 2014


On Tue, Sep 02, 2014 at 04:34:49PM +0200, Hans de Goede wrote:
> So that it can be used for middle button trackpoint scrolling too.
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  src/evdev-mt-touchpad.c | 56 +++----------------------------------------------
>  src/evdev-mt-touchpad.h |  4 ----
>  src/evdev.c             | 48 ++++++++++++++++++++++++++++++++++++++++++
>  src/evdev.h             | 14 +++++++++++++
>  4 files changed, 65 insertions(+), 57 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index d831b83..059926f 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -492,47 +492,8 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time)
>  	dy /= nchanged;
>  
>  	tp_filter_motion(tp, &dx, &dy, time);
> -
>  	/* Require at least five px scrolling to start */
> -	if (dy <= -5.0 || dy >= 5.0)
> -		tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
> -
> -	if (dx <= -5.0 || dx >= 5.0)
> -		tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
> -
> -	if (dy != 0.0 &&
> -	    (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))) {
> -		pointer_notify_axis(&tp->device->base,
> -				    time,
> -				    LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
> -				    dy);
> -	}
> -
> -	if (dx != 0.0 &&
> -	    (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))) {
> -		pointer_notify_axis(&tp->device->base,
> -				    time,
> -				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
> -				    dx);
> -	}
> -}
> -
> -static void
> -tp_stop_scroll_events(struct tp_dispatch *tp, uint64_t time)
> -{
> -	/* terminate scrolling with a zero scroll event */
> -	if (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
> -		pointer_notify_axis(&tp->device->base,
> -				    time,
> -				    LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
> -				    0);
> -	if (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
> -		pointer_notify_axis(&tp->device->base,
> -				    time,
> -				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
> -				    0);
> -
> -	tp->scroll.direction = 0;
> +	evdev_post_scroll(tp->device, time, dx, dy, 5.0);
>  }
>  
>  static int
> @@ -548,7 +509,7 @@ tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time)
>  	}
>  
>  	if (nfingers_down != 2) {
> -		tp_stop_scroll_events(tp, time);
> +		evdev_stop_scroll(tp->device, time);
>  		return 0;
>  	}
>  
> @@ -567,7 +528,7 @@ tp_post_events(struct tp_dispatch *tp, uint64_t time)
>  	consumed |= tp_post_button_events(tp, time);
>  
>  	if (consumed) {
> -		tp_stop_scroll_events(tp, time);
> +		evdev_stop_scroll(tp->device, time);
>  		return;
>  	}
>  
> @@ -747,14 +708,6 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal)
>  }
>  
>  static int
> -tp_init_scroll(struct tp_dispatch *tp)
> -{
> -	tp->scroll.direction = 0;
> -
> -	return 0;
> -}
> -
> -static int
>  tp_init_palmdetect(struct tp_dispatch *tp,
>  		   struct evdev_device *device)
>  {
> @@ -809,9 +762,6 @@ tp_init(struct tp_dispatch *tp,
>  	tp->hysteresis.margin_y =
>  		diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
>  
> -	if (tp_init_scroll(tp) != 0)
> -		return -1;
> -
>  	if (tp_init_accel(tp, diagonal) != 0)
>  		return -1;
>  
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 83edf4f..be93c49 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -200,10 +200,6 @@ struct tp_dispatch {
>  		} top_area;
>  	} buttons;				/* physical buttons */
>  
> -	struct {
> -		enum libinput_pointer_axis direction;
> -	} scroll;
> -
>  	enum touchpad_event queued;
>  
>  	struct {
> diff --git a/src/evdev.c b/src/evdev.c
> index e24e268..b45f7ec 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1131,6 +1131,54 @@ evdev_device_get_size(struct evdev_device *device,
>  	return 0;
>  }
>  
> +void
> +evdev_post_scroll(struct evdev_device *device,
> +		  uint64_t time,
> +		  double dx,
> +		  double dy,
> +		  double thresh)
> +{
> +	if (dy <= -thresh || dy >= thresh)
> +		device->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
> +
> +	if (dx <= -thresh || dx >= thresh)
> +		device->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
> +
> +	if (dy != 0.0 &&
> +	    (device->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))) {
> +		pointer_notify_axis(&device->base,
> +				    time,
> +				    LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
> +				    dy);
> +	}
> +
> +	if (dx != 0.0 &&
> +	    (device->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))) {
> +		pointer_notify_axis(&device->base,
> +				    time,
> +				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
> +				    dx);
> +	}
> +}
> +
> +void
> +evdev_stop_scroll(struct evdev_device *device, uint64_t time)
> +{
> +	/* terminate scrolling with a zero scroll event */
> +	if (device->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
> +		pointer_notify_axis(&device->base,
> +				    time,
> +				    LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
> +				    0);
> +	if (device->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
> +		pointer_notify_axis(&device->base,
> +				    time,
> +				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
> +				    0);
> +
> +	device->scroll.direction = 0;
> +}
> +
>  static void
>  release_pressed_keys(struct evdev_device *device)
>  {
> diff --git a/src/evdev.h b/src/evdev.h
> index 50ca713..1cb6bea 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -89,6 +89,10 @@ struct evdev_device {
>  		int dx, dy;
>  	} rel;
>  
> +	struct {
> +		int32_t direction;

tbh, I prefer uint32_t for flags.

> +	} scroll;
> +
>  	enum evdev_event_type pending_event;
>  	enum evdev_device_seat_capability seat_caps;
>  
> @@ -200,6 +204,16 @@ evdev_pointer_notify_button(struct evdev_device *device,
>  			    enum libinput_button_state state);
>  
>  void
> +evdev_post_scroll(struct evdev_device *device,
> +		  uint64_t time,
> +		  double dx,
> +		  double dy,
> +		  double thresh);

instead of passing the threshold every time, could we not set that once
during init the struct scroll above? it would allow for a hypothetical
custom scroll thresholds based on the device.

ack to the rest

Cheers,
   Peter

> +
> +void
> +evdev_stop_scroll(struct evdev_device *device, uint64_t time);
> +
> +void
>  evdev_device_remove(struct evdev_device *device);
>  
>  void
> -- 
> 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