[PATCH libinput 13/20] touchpad: Use INPUT_PROP_BUTTONPAD instead of checking for buttons

Peter Hutterer peter.hutterer at who-t.net
Wed Apr 23 22:34:41 PDT 2014


On Tue, Apr 15, 2014 at 02:28:10PM +0200, Hans de Goede wrote:
> And warn if INPUT_PROP_BUTTONPAD mismatches right/middle buttons presence.
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

I've gone through all patches again and they're now all really
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>, except for the bits
where things break obviously :)

I'll start getting some tests ready for all this so we can verify the
behaviour, but meanwhile you can grab the rebased series from my github,
wip/clickpad-improvements.

Cheers,
   Peter


> ---
>  src/evdev-mt-touchpad-buttons.c | 34 ++++++++++++++++++----------------
>  src/evdev-mt-touchpad.c         |  4 ++--
>  src/evdev-mt-touchpad.h         |  7 +++----
>  3 files changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
> index e789a87..ec36280 100644
> --- a/src/evdev-mt-touchpad-buttons.c
> +++ b/src/evdev-mt-touchpad-buttons.c
> @@ -410,9 +410,17 @@ tp_init_buttons(struct tp_dispatch *tp,
>  	int width, height;
>  	double diagonal;
>  
> +	tp->buttons.is_clickpad = libevdev_has_property(device->evdev,
> +							 INPUT_PROP_BUTTONPAD);
> +
>  	if (libevdev_has_event_code(device->evdev, EV_KEY, BTN_MIDDLE) ||
> -	    libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT))
> -		tp->buttons.has_buttons = true;
> +	    libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT)) {
> +		if (tp->buttons.is_clickpad)
> +			log_bug("clickpad advertising right button (kernel bug?)\n");
> +	} else {
> +		if (!tp->buttons.is_clickpad)
> +			log_bug("non clickpad without right button (kernel bug)?\n");
> +	}
>  
>  	width = abs(device->abs.max_x - device->abs.min_x);
>  	height = abs(device->abs.max_y - device->abs.min_y);
> @@ -423,10 +431,7 @@ tp_init_buttons(struct tp_dispatch *tp,
>  	if (libevdev_get_id_vendor(device->evdev) == 0x5ac) /* Apple */
>  		tp->buttons.use_clickfinger = true;
>  
> -	tp->buttons.use_softbuttons = !tp->buttons.use_clickfinger &&
> -				      !tp->buttons.has_buttons;
> -
> -	if (tp->buttons.use_softbuttons) {
> +	if (tp->buttons.is_clickpad && !tp->buttons.use_clickfinger) {
>  		tp->buttons.area.top_edge = height * .8 + device->abs.min_y;
>  		tp->buttons.area.rightbutton_left_edge = width/2 + device->abs.min_x;
>  		tp->buttons.timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
> @@ -585,21 +590,18 @@ tp_post_softbutton_buttons(struct tp_dispatch *tp, uint32_t time)
>  int
>  tp_post_button_events(struct tp_dispatch *tp, uint32_t time)
>  {
> -	int rc;
> -
>  	if ((tp->queued &
>  		(TOUCHPAD_EVENT_BUTTON_PRESS|TOUCHPAD_EVENT_BUTTON_RELEASE)) == 0)
>  				return 0;
>  
> -	if (tp->buttons.has_buttons)
> -		rc = tp_post_physical_buttons(tp, time);
> -	else if (tp->buttons.use_clickfinger)
> -		rc = tp_post_clickfinger_buttons(tp, time);
> -	else if (tp->buttons.use_softbuttons)
> -		rc = tp_post_softbutton_buttons(tp, time);
> -
> +	if (tp->buttons.is_clickpad) {
> +		if (tp->buttons.use_clickfinger)
> +			return tp_post_clickfinger_buttons(tp, time);
> +		else
> +			return tp_post_softbutton_buttons(tp, time);
> +	}
>  
> -	return rc;
> +	return tp_post_physical_buttons(tp, time);
>  }
>  
>  int
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index b671211..910bd2a 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -392,7 +392,7 @@ tp_process_state(struct tp_dispatch *tp, uint32_t time)
>  	 * to allow drag and drop.
>  	 */
>  	if ((tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) &&
> -	    !tp->buttons.has_buttons)
> +	    tp->buttons.is_clickpad)
>  		tp_pin_fingers(tp);
>  
>  	/* If we don't have a touch as pointer find a suitable one */
> @@ -496,7 +496,7 @@ static int
>  tp_post_scroll_events(struct tp_dispatch *tp, uint32_t time)
>  {
>  	/* don't scroll if a clickpad is held down */
> -	if (!tp->buttons.has_buttons &&
> +	if (tp->buttons.is_buttonpad &&
>  	    (tp->buttons.state || tp->buttons.old_state))
>  		return 0;
>  
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 04da6a6..5cb9ae2 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -154,19 +154,18 @@ struct tp_dispatch {
>  	} accel;
>  
>  	struct {
> -		bool has_buttons;		/* true for physical LMR buttons */
> +		bool is_clickpad;		/* true for clickpads */
>  		bool use_clickfinger;		/* number of fingers decides button number */
> -		bool use_softbuttons;		/* use software-button area */
>  		uint32_t state;
>  		uint32_t old_state;
>  		uint32_t motion_dist;		/* for pinned touches */
>  		unsigned int active;		/* currently active button, for release event */
>  
> -		/* Only used if has_buttons is false. The software button area is always
> +		/* Only used for clickpads. The software button area is always
>  		 * a horizontal strip across the touchpad. Depending on the
>  		 * rightbutton_left_edge value, the buttons are split according to the
>  		 * edge settings.
> -		  */
> +		 */
>  		struct {
>  			int32_t top_edge;
>  			int32_t rightbutton_left_edge;
> -- 
> 1.9.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