[PATCH weston 1/4] Add a touch binding to activate a surface

Kristian Høgsberg hoegsberg at gmail.com
Mon Oct 14 13:56:39 PDT 2013


On Thu, Oct 03, 2013 at 04:43:04PM +0100, Neil Roberts wrote:
> Adds a new binding type for touch events via the new function
> weston_compositor_add_touch_binding. The binding can only be added for
> a touch down with the first finger. The shell now uses this to install
> a binding to activate the current surface.
> ---
>  src/bindings.c   | 36 ++++++++++++++++++++++++++++++++++++
>  src/compositor.c |  2 ++
>  src/compositor.h | 14 ++++++++++++++
>  src/input.c      |  2 ++
>  src/shell.c      | 36 ++++++++++++++++++++++++++++--------
>  5 files changed, 82 insertions(+), 8 deletions(-)

These four patches look good, all applied.

Kristian

> diff --git a/src/bindings.c b/src/bindings.c
> index f6ec9ea..03c9238 100644
> --- a/src/bindings.c
> +++ b/src/bindings.c
> @@ -94,6 +94,24 @@ weston_compositor_add_button_binding(struct weston_compositor *compositor,
>  }
>  
>  WL_EXPORT struct weston_binding *
> +weston_compositor_add_touch_binding(struct weston_compositor *compositor,
> +				    uint32_t modifier,
> +				    weston_touch_binding_handler_t handler,
> +				    void *data)
> +{
> +	struct weston_binding *binding;
> +
> +	binding = weston_compositor_add_binding(compositor, 0, 0, 0,
> +						modifier, handler, data);
> +	if (binding == NULL)
> +		return NULL;
> +
> +	wl_list_insert(compositor->touch_binding_list.prev, &binding->link);
> +
> +	return binding;
> +}
> +
> +WL_EXPORT struct weston_binding *
>  weston_compositor_add_axis_binding(struct weston_compositor *compositor,
>  				   uint32_t axis, uint32_t modifier,
>  				   weston_axis_binding_handler_t handler,
> @@ -253,6 +271,24 @@ weston_compositor_run_button_binding(struct weston_compositor *compositor,
>  	}
>  }
>  
> +WL_EXPORT void
> +weston_compositor_run_touch_binding(struct weston_compositor *compositor,
> +				    struct weston_seat *seat, uint32_t time,
> +				    int touch_type)
> +{
> +	struct weston_binding *b;
> +
> +	if (seat->num_tp != 1 || touch_type != WL_TOUCH_DOWN)
> +		return;
> +
> +	wl_list_for_each(b, &compositor->touch_binding_list, link) {
> +		if (b->modifier == seat->modifier_state) {
> +			weston_touch_binding_handler_t handler = b->handler;
> +			handler(seat, time, b->data);
> +		}
> +	}
> +}
> +
>  WL_EXPORT int
>  weston_compositor_run_axis_binding(struct weston_compositor *compositor,
>  				   struct weston_seat *seat,
> diff --git a/src/compositor.c b/src/compositor.c
> index b8e442a..935015a 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -3112,6 +3112,7 @@ weston_compositor_init(struct weston_compositor *ec,
>  	wl_list_init(&ec->output_list);
>  	wl_list_init(&ec->key_binding_list);
>  	wl_list_init(&ec->button_binding_list);
> +	wl_list_init(&ec->touch_binding_list);
>  	wl_list_init(&ec->axis_binding_list);
>  	wl_list_init(&ec->debug_binding_list);
>  
> @@ -3172,6 +3173,7 @@ weston_compositor_shutdown(struct weston_compositor *ec)
>  
>  	weston_binding_list_destroy_all(&ec->key_binding_list);
>  	weston_binding_list_destroy_all(&ec->button_binding_list);
> +	weston_binding_list_destroy_all(&ec->touch_binding_list);
>  	weston_binding_list_destroy_all(&ec->axis_binding_list);
>  	weston_binding_list_destroy_all(&ec->debug_binding_list);
>  
> diff --git a/src/compositor.h b/src/compositor.h
> index 9b48287..ad5a786 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -575,6 +575,7 @@ struct weston_compositor {
>  	struct wl_list plane_list;
>  	struct wl_list key_binding_list;
>  	struct wl_list button_binding_list;
> +	struct wl_list touch_binding_list;
>  	struct wl_list axis_binding_list;
>  	struct wl_list debug_binding_list;
>  
> @@ -984,6 +985,15 @@ weston_compositor_add_button_binding(struct weston_compositor *compositor,
>  				     weston_button_binding_handler_t binding,
>  				     void *data);
>  
> +typedef void (*weston_touch_binding_handler_t)(struct weston_seat *seat,
> +					       uint32_t time,
> +					       void *data);
> +struct weston_binding *
> +weston_compositor_add_touch_binding(struct weston_compositor *compositor,
> +				    enum weston_keyboard_modifier modifier,
> +				    weston_touch_binding_handler_t binding,
> +				    void *data);
> +
>  typedef void (*weston_axis_binding_handler_t)(struct weston_seat *seat,
>  					      uint32_t time, uint32_t axis,
>  					      wl_fixed_t value, void *data);
> @@ -1014,6 +1024,10 @@ weston_compositor_run_button_binding(struct weston_compositor *compositor,
>  				     struct weston_seat *seat, uint32_t time,
>  				     uint32_t button,
>  				     enum wl_pointer_button_state value);
> +void
> +weston_compositor_run_touch_binding(struct weston_compositor *compositor,
> +				    struct weston_seat *seat, uint32_t time,
> +				    int touch_type);
>  int
>  weston_compositor_run_axis_binding(struct weston_compositor *compositor,
>  				   struct weston_seat *seat, uint32_t time,
> diff --git a/src/input.c b/src/input.c
> index 1313b52..3e4f4b1 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1147,6 +1147,8 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
>  			weston_touch_set_focus(seat, NULL);
>  		break;
>  	}
> +
> +	weston_compositor_run_touch_binding(ec, seat, time, touch_type);
>  }
>  
>  static void
> diff --git a/src/shell.c b/src/shell.c
> index f033e8c..4a0c122 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -3124,15 +3124,12 @@ is_black_surface (struct weston_surface *es, struct weston_surface **fs_surface)
>  }
>  
>  static void
> -click_to_activate_binding(struct weston_seat *seat, uint32_t time, uint32_t button,
> -			  void *data)
> +activate_binding(struct weston_seat *seat,
> +		 struct desktop_shell *shell,
> +		 struct weston_surface *focus)
>  {
> -	struct weston_seat *ws = (struct weston_seat *) seat;
> -	struct desktop_shell *shell = data;
> -	struct weston_surface *focus;
>  	struct weston_surface *main_surface;
>  
> -	focus = (struct weston_surface *) seat->pointer->focus;
>  	if (!focus)
>  		return;
>  
> @@ -3143,8 +3140,28 @@ click_to_activate_binding(struct weston_seat *seat, uint32_t time, uint32_t butt
>  	if (get_shell_surface_type(main_surface) == SHELL_SURFACE_NONE)
>  		return;
>  
> -	if (seat->pointer->grab == &seat->pointer->default_grab)
> -		activate(shell, focus, ws);
> +	activate(shell, focus, seat);
> +}
> +
> +static void
> +click_to_activate_binding(struct weston_seat *seat, uint32_t time, uint32_t button,
> +			  void *data)
> +{
> +	if (seat->pointer->grab != &seat->pointer->default_grab)
> +		return;
> +
> +	activate_binding(seat, data,
> +			 (struct weston_surface *) seat->pointer->focus);
> +}
> +
> +static void
> +touch_to_activate_binding(struct weston_seat *seat, uint32_t time, void *data)
> +{
> +	if (seat->touch->grab != &seat->touch->default_grab)
> +		return;
> +
> +	activate_binding(seat, data,
> +			 (struct weston_surface *) seat->touch->focus);
>  }
>  
>  static void
> @@ -4496,6 +4513,9 @@ shell_add_bindings(struct weston_compositor *ec, struct desktop_shell *shell)
>  	weston_compositor_add_button_binding(ec, BTN_LEFT, 0,
>  					     click_to_activate_binding,
>  					     shell);
> +	weston_compositor_add_touch_binding(ec, 0,
> +					    touch_to_activate_binding,
> +					    shell);
>  	weston_compositor_add_axis_binding(ec, WL_POINTER_AXIS_VERTICAL_SCROLL,
>  				           MODIFIER_SUPER | MODIFIER_ALT,
>  				           surface_opacity_binding, NULL);
> -- 
> 1.8.3.1
> 
> _______________________________________________
> 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