[PATCH weston v2 3/5] compositor: Emit wl_pointer_gesture_* events on libinput gesture events

Carlos Garnacho carlosg at gnome.org
Thu Jul 23 10:00:29 PDT 2015


The translation is fairly straightforward so far, it would be convenient
if gestures went through the pointer grab interface, but this is not done
at the moment.

Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
 src/compositor.h      |   7 +++
 src/input.c           | 107 ++++++++++++++++++++++++++++++++++++++
 src/libinput-device.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 255 insertions(+)

diff --git a/src/compositor.h b/src/compositor.h
index 15f1b5c..4d43995 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1097,6 +1097,13 @@ void
 notify_touch_frame(struct weston_seat *seat);
 
 void
+notify_pointer_swipe(struct weston_seat *seat, uint32_t time, int cancelled,
+		     int fingers, wl_fixed_t dx, wl_fixed_t dy, int gesture_type);
+void
+notify_pointer_pinch(struct weston_seat *seat, uint32_t time, int cancelled,
+		     int fingers, wl_fixed_t dx, wl_fixed_t dy,
+		     wl_fixed_t scale, wl_fixed_t rotation_diff, int gesture_type);
+void
 weston_layer_entry_insert(struct weston_layer_entry *list,
 			  struct weston_layer_entry *entry);
 void
diff --git a/src/input.c b/src/input.c
index 68a6365..352b6c9 100644
--- a/src/input.c
+++ b/src/input.c
@@ -37,6 +37,7 @@
 #include "shared/helpers.h"
 #include "shared/os-compatibility.h"
 #include "compositor.h"
+#include "protocol/gestures-server-protocol.h"
 
 static void
 empty_region(pixman_region32_t *region)
@@ -1717,6 +1718,112 @@ static const struct wl_pointer_interface pointer_interface = {
 	pointer_release
 };
 
+WL_EXPORT void
+notify_pointer_swipe(struct weston_seat *seat, uint32_t time, int cancelled,
+		     int fingers, wl_fixed_t dx, wl_fixed_t dy, int gesture_type)
+{
+	struct weston_compositor *ec = seat->compositor;
+	struct weston_pointer *pointer = seat->pointer;
+	struct weston_view *focus;
+	struct wl_display *display = ec->wl_display;
+	struct wl_list *resource_list;
+	struct wl_resource *resource;
+	uint32_t serial;
+
+	/* XXX: make gestures go through grab interface? */
+
+	if (!seat->pointer || !seat->pointer->focus)
+		return;
+
+	weston_compositor_wake(ec);
+	resource_list = &pointer->swipe_gesture_focus_resource_list;
+	focus = seat->pointer->focus;
+
+	if (wl_list_empty(resource_list))
+		return;
+
+	switch (gesture_type) {
+	case _WL_POINTER_GESTURE_SWIPE_BEGIN:
+		serial = wl_display_next_serial(display);
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_swipe_send_begin(resource, serial,
+							     time,
+							     focus->surface->resource,
+							     fingers);
+		}
+		break;
+	case _WL_POINTER_GESTURE_SWIPE_UPDATE:
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_swipe_send_update(resource, time,
+							      dx, dy);
+		}
+		break;
+	case _WL_POINTER_GESTURE_SWIPE_END:
+		serial = wl_display_next_serial(display);
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_swipe_send_end(resource, serial,
+							   time, cancelled);
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+WL_EXPORT void
+notify_pointer_pinch(struct weston_seat *seat, uint32_t time, int cancelled,
+		     int fingers, wl_fixed_t dx, wl_fixed_t dy,
+		     wl_fixed_t scale, wl_fixed_t rotation_diff, int gesture_type)
+{
+	struct weston_compositor *ec = seat->compositor;
+	struct weston_pointer *pointer = seat->pointer;
+	struct weston_view *focus;
+	struct wl_display *display = ec->wl_display;
+	struct wl_list *resource_list;
+	struct wl_resource *resource;
+	uint32_t serial;
+
+	if (!seat->pointer || !seat->pointer->focus)
+		return;
+
+	/* XXX: make gestures go through grab interface? */
+
+	weston_compositor_wake(ec);
+	resource_list = &pointer->pinch_gesture_focus_resource_list;
+	focus = seat->pointer->focus;
+
+	if (wl_list_empty(resource_list))
+		return;
+
+	switch (gesture_type) {
+	case _WL_POINTER_GESTURE_PINCH_BEGIN:
+		serial = wl_display_next_serial(display);
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_pinch_send_begin(resource, serial,
+							     time,
+							     focus->surface->resource,
+							     fingers);
+		}
+		break;
+	case _WL_POINTER_GESTURE_PINCH_UPDATE:
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_pinch_send_update(resource, time,
+							      dx, dy, scale,
+							      rotation_diff);
+		}
+		break;
+	case _WL_POINTER_GESTURE_PINCH_END:
+		serial = wl_display_next_serial(display);
+		wl_resource_for_each(resource, resource_list) {
+			_wl_pointer_gesture_pinch_send_end(resource, serial,
+							   time, cancelled);
+		}
+		break;
+	default:
+		return;
+	}
+}
+
 static void
 seat_get_pointer(struct wl_client *client, struct wl_resource *resource,
 		 uint32_t id)
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 2cbfb88..d0cd494 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -39,6 +39,7 @@
 #include "compositor.h"
 #include "libinput-device.h"
 #include "shared/helpers.h"
+#include "protocol/gestures-server-protocol.h"
 
 #define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
 
@@ -287,6 +288,122 @@ handle_touch_frame(struct libinput_device *libinput_device,
 	notify_touch_frame(seat);
 }
 
+static void
+handle_pointer_swipe_begin(struct libinput_device *libinput_device,
+			   struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	uint32_t time, fingers;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	notify_pointer_swipe(seat, time, 0, fingers, 0, 0,
+			     _WL_POINTER_GESTURE_SWIPE_BEGIN);
+}
+
+static void
+handle_pointer_swipe_update(struct libinput_device *libinput_device,
+			   struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	uint32_t time, fingers;
+	double dx, dy;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	dx = libinput_event_gesture_get_dx(gesture_event);
+	dy = libinput_event_gesture_get_dx(gesture_event);
+
+	notify_pointer_swipe(seat, time, 0, fingers,
+			     wl_fixed_from_double(dx),
+			     wl_fixed_from_double(dy),
+			     _WL_POINTER_GESTURE_SWIPE_UPDATE);
+}
+
+static void
+handle_pointer_swipe_end(struct libinput_device *libinput_device,
+			   struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	uint32_t time, fingers, cancelled;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	cancelled = libinput_event_gesture_get_cancelled(gesture_event);
+
+	notify_pointer_swipe(seat, time, cancelled, fingers, 0, 0,
+			     _WL_POINTER_GESTURE_SWIPE_END);
+}
+
+static void
+handle_pointer_pinch_begin(struct libinput_device *libinput_device,
+			   struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	uint32_t time, fingers;
+	double scale;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	scale = libinput_event_gesture_get_scale(gesture_event);
+
+	notify_pointer_pinch(seat, time, 0, fingers, 0, 0, scale, 0,
+			     _WL_POINTER_GESTURE_PINCH_BEGIN);
+}
+
+static void
+handle_pointer_pinch_update(struct libinput_device *libinput_device,
+			   struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	double scale, angle_delta, dx, dy;
+	uint32_t time, fingers;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	scale = libinput_event_gesture_get_scale(gesture_event);
+	angle_delta = libinput_event_gesture_get_angle_delta(gesture_event);
+	dx = libinput_event_gesture_get_dx(gesture_event);
+	dy = libinput_event_gesture_get_dx(gesture_event);
+
+	notify_pointer_pinch(seat, time, 0, fingers,
+			     wl_fixed_from_double(dx),
+			     wl_fixed_from_double(dy),
+			     wl_fixed_from_double(scale),
+			     wl_fixed_from_double(angle_delta),
+			     _WL_POINTER_GESTURE_PINCH_UPDATE);
+}
+
+static void
+handle_pointer_pinch_end(struct libinput_device *libinput_device,
+			 struct libinput_event_gesture *gesture_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_seat *seat = device->seat;
+	uint32_t time, fingers, cancelled;
+	double scale;
+
+	time = libinput_event_gesture_get_time(gesture_event);
+	fingers = libinput_event_gesture_get_finger_count(gesture_event);
+	cancelled = libinput_event_gesture_get_cancelled(gesture_event);
+	scale = libinput_event_gesture_get_scale(gesture_event);
+
+	notify_pointer_pinch(seat, time, cancelled, fingers,
+			     0, 0, wl_fixed_from_double(scale), 0,
+			     _WL_POINTER_GESTURE_PINCH_END);
+}
+
 int
 evdev_device_process_event(struct libinput_event *event)
 {
@@ -332,6 +449,30 @@ evdev_device_process_event(struct libinput_event *event)
 		handle_touch_frame(libinput_device,
 				   libinput_event_get_touch_event(event));
 		break;
+	case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
+		handle_pointer_swipe_begin(libinput_device,
+					   libinput_event_get_gesture_event(event));
+		break;
+	case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
+		handle_pointer_swipe_update(libinput_device,
+					    libinput_event_get_gesture_event(event));
+		break;
+	case LIBINPUT_EVENT_GESTURE_SWIPE_END:
+		handle_pointer_swipe_end(libinput_device,
+					 libinput_event_get_gesture_event(event));
+		break;
+	case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
+		handle_pointer_pinch_begin(libinput_device,
+					   libinput_event_get_gesture_event(event));
+		break;
+	case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
+		handle_pointer_pinch_update(libinput_device,
+					    libinput_event_get_gesture_event(event));
+		break;
+	case LIBINPUT_EVENT_GESTURE_PINCH_END:
+		handle_pointer_pinch_end(libinput_device,
+					 libinput_event_get_gesture_event(event));
+		break;
 	default:
 		handled = 0;
 		weston_log("unknown libinput event %d\n",
-- 
2.4.3



More information about the wayland-devel mailing list