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

Hans de Goede hdegoede at redhat.com
Fri Sep 12 06:59:58 PDT 2014


Hi,

On 09/03/2014 05:50 AM, Peter Hutterer wrote:
> 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.

Me too, and that was my intention, but something are the 'u',
I'll re-add it in the next version :)

>> +	} 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.

Good idea, will do.

Regards,

Hans


More information about the wayland-devel mailing list