[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