[PATCH weston v2 2/5] compositor: Implement wl_pointer_gesture_swipe/pinch interfaces
Carlos Garnacho
carlosg at gnome.org
Thu Jul 23 10:00:28 PDT 2015
Each of these come with a getter on wl_pointer, which takes care
of creating the resource. The focused resources list is maintained
in sync with the pointer's.
Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
src/compositor.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/compositor.h | 5 +++
src/input.c | 16 +++++++++
3 files changed, 121 insertions(+)
diff --git a/src/compositor.c b/src/compositor.c
index 66c3eee..0bafd2a 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -56,6 +56,7 @@
#include "compositor.h"
#include "scaler-server-protocol.h"
#include "presentation_timing-server-protocol.h"
+#include "protocol/gestures-server-protocol.h"
#include "shared/helpers.h"
#include "shared/os-compatibility.h"
#include "shared/timespec-util.h"
@@ -4373,6 +4374,83 @@ static const struct presentation_interface presentation_implementation = {
};
static void
+pointer_gesture_swipe_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct _wl_pointer_gesture_swipe_interface pointer_gesture_swipe_interface = {
+ pointer_gesture_swipe_destroy
+};
+
+static void
+pointer_gesture_pinch_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct _wl_pointer_gesture_swipe_interface pointer_gesture_pinch_interface = {
+ pointer_gesture_pinch_destroy
+};
+
+static void
+pointer_gestures_get_swipe(struct wl_client *client, struct wl_resource *resource,
+ uint32_t id, struct wl_resource *pointer_resource)
+{
+ struct weston_pointer *pointer = wl_resource_get_user_data(pointer_resource);
+ struct wl_resource *cr;
+ struct wl_list *list;
+
+ cr = wl_resource_create(client, &_wl_pointer_gesture_swipe_interface,
+ wl_resource_get_version(resource), id);
+ if (cr == NULL) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(cr, &pointer_gesture_swipe_interface,
+ pointer, unbind_resource);
+
+ if (pointer->focus && wl_resource_get_client(pointer->focus->surface->resource) == client)
+ list = &pointer->swipe_gesture_focus_resource_list;
+ else
+ list = &pointer->swipe_gesture_resource_list;
+
+ wl_list_insert(list, wl_resource_get_link(cr));
+}
+
+static void
+pointer_gestures_get_pinch(struct wl_client *client, struct wl_resource *resource,
+ uint32_t id, struct wl_resource *pointer_resource)
+{
+ struct weston_pointer *pointer = wl_resource_get_user_data(pointer_resource);
+ struct wl_resource *cr;
+ struct wl_list *list;
+
+ cr = wl_resource_create(client, &_wl_pointer_gesture_pinch_interface,
+ wl_resource_get_version(resource), id);
+ if (cr == NULL) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(cr, &pointer_gesture_pinch_interface,
+ pointer, unbind_resource);
+
+ if (pointer->focus && wl_resource_get_client(pointer->focus->surface->resource) == client)
+ list = &pointer->pinch_gesture_focus_resource_list;
+ else
+ list = &pointer->pinch_gesture_resource_list;
+
+ wl_list_insert(list, wl_resource_get_link(cr));
+}
+
+static const struct _wl_pointer_gestures_interface pointer_gestures_interface = {
+ pointer_gestures_get_swipe,
+ pointer_gestures_get_pinch
+};
+
+static void
bind_presentation(struct wl_client *client,
void *data, uint32_t version, uint32_t id)
{
@@ -4409,6 +4487,24 @@ compositor_bind(struct wl_client *client,
compositor, NULL);
}
+static void
+bind_pointer_gestures(struct wl_client *client,
+ void *data, uint32_t version, uint32_t id)
+{
+ struct weston_compositor *compositor = data;
+ struct wl_resource *resource;
+
+ resource = wl_resource_create(client, &_wl_pointer_gestures_interface,
+ MIN(version, 1), id);
+ if (resource == NULL) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(resource, &pointer_gestures_interface,
+ compositor, NULL);
+}
+
WL_EXPORT int
weston_environment_get_fd(const char *env)
{
@@ -4501,6 +4597,10 @@ weston_compositor_create(struct wl_display *display, void *user_data)
ec, bind_presentation))
goto fail;
+ if (!wl_global_create(ec->wl_display, &_wl_pointer_gestures_interface, 1,
+ ec, bind_pointer_gestures))
+ goto fail;
+
wl_list_init(&ec->view_list);
wl_list_init(&ec->plane_list);
wl_list_init(&ec->layer_list);
diff --git a/src/compositor.h b/src/compositor.h
index d0c6034..15f1b5c 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -323,6 +323,11 @@ struct weston_pointer {
struct wl_signal focus_signal;
struct wl_signal motion_signal;
+ struct wl_list swipe_gesture_resource_list;
+ struct wl_list swipe_gesture_focus_resource_list;
+ struct wl_list pinch_gesture_resource_list;
+ struct wl_list pinch_gesture_focus_resource_list;
+
struct weston_view *sprite;
struct wl_listener sprite_destroy_listener;
int32_t hotspot_x, hotspot_y;
diff --git a/src/input.c b/src/input.c
index 1d7e705..68a6365 100644
--- a/src/input.c
+++ b/src/input.c
@@ -480,6 +480,11 @@ weston_pointer_create(struct weston_seat *seat)
wl_signal_init(&pointer->focus_signal);
wl_list_init(&pointer->focus_view_listener.link);
+ wl_list_init(&pointer->swipe_gesture_resource_list);
+ wl_list_init(&pointer->swipe_gesture_focus_resource_list);
+ wl_list_init(&pointer->pinch_gesture_resource_list);
+ wl_list_init(&pointer->pinch_gesture_focus_resource_list);
+
pointer->sprite_destroy_listener.notify = pointer_handle_sprite_destroy;
/* FIXME: Pick better co-ords. */
@@ -649,6 +654,10 @@ weston_pointer_set_focus(struct weston_pointer *pointer,
}
move_resources(&pointer->resource_list, focus_resource_list);
+ move_resources(&pointer->swipe_gesture_resource_list,
+ &pointer->swipe_gesture_focus_resource_list);
+ move_resources(&pointer->pinch_gesture_resource_list,
+ &pointer->pinch_gesture_focus_resource_list);
}
if (find_resource_for_view(&pointer->resource_list, view) && refocus) {
@@ -675,6 +684,13 @@ weston_pointer_set_focus(struct weston_pointer *pointer,
}
pointer->focus_serial = serial;
+
+ move_resources_for_client(&pointer->swipe_gesture_focus_resource_list,
+ &pointer->swipe_gesture_resource_list,
+ surface_client);
+ move_resources_for_client(&pointer->pinch_gesture_focus_resource_list,
+ &pointer->pinch_gesture_resource_list,
+ surface_client);
}
wl_list_remove(&pointer->focus_view_listener.link);
--
2.4.3
More information about the wayland-devel
mailing list