[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