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

Neil Roberts neil at linux.intel.com
Thu Oct 3 08:43:04 PDT 2013


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(-)

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



More information about the wayland-devel mailing list