summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-05-22 18:33:31 +0200
committerCarlos Garnacho <carlosg@gnome.org>2015-07-10 21:47:30 +0200
commit5b8a2a9e156395052a8adda670fdf3fd0d30c591 (patch)
treee1fe05dc6bad11c58e541524c86306a788e3802d
parentc185a17783a1b7c0d270def5e02eb3f27ba4fcb8 (diff)
downloadclutter-5b8a2a9e156395052a8adda670fdf3fd0d30c591.tar.gz
evdev: Handle libinput touchpad swipe/pinch gesture events
The translation from libinput events is fairly straightforward, as they map almost 1:1.
-rw-r--r--clutter/evdev/clutter-device-manager-evdev.c165
-rw-r--r--configure.ac2
2 files changed, 166 insertions, 1 deletions
diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
index 523b538bd..f92b67391 100644
--- a/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/evdev/clutter-device-manager-evdev.c
@@ -597,6 +597,94 @@ notify_touch_event (ClutterInputDevice *input_device,
}
static void
+notify_pinch_gesture_event (ClutterInputDevice *input_device,
+ ClutterTouchpadGesturePhase phase,
+ guint32 time_,
+ gdouble dx,
+ gdouble dy,
+ gdouble angle_delta,
+ gdouble scale)
+{
+ ClutterInputDeviceEvdev *device_evdev;
+ ClutterSeatEvdev *seat;
+ ClutterStage *stage;
+ ClutterEvent *event = NULL;
+ ClutterPoint pos;
+
+ /* We can drop the event on the floor if no stage has been
+ * associated with the device yet. */
+ stage = _clutter_input_device_get_stage (input_device);
+ if (!stage)
+ return;
+
+ device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
+ seat = _clutter_input_device_evdev_get_seat (device_evdev);
+
+ event = clutter_event_new (CLUTTER_TOUCHPAD_PINCH);
+
+ clutter_input_device_get_coords (seat->core_pointer, NULL, &pos);
+
+ event->touchpad_pinch.phase = phase;
+ event->touchpad_pinch.time = time_;
+ event->touchpad_pinch.stage = CLUTTER_STAGE (stage);
+ event->touchpad_pinch.x = pos.x;
+ event->touchpad_pinch.y = pos.y;
+ event->touchpad_pinch.angle_delta = angle_delta;
+ event->touchpad_pinch.scale = scale;
+
+ _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
+
+ clutter_event_set_device (event, seat->core_pointer);
+ clutter_event_set_source_device (event, input_device);
+
+ queue_event (event);
+}
+
+static void
+notify_swipe_gesture_event (ClutterInputDevice *input_device,
+ ClutterTouchpadGesturePhase phase,
+ guint32 time_,
+ guint n_fingers,
+ gdouble dx,
+ gdouble dy)
+{
+ ClutterInputDeviceEvdev *device_evdev;
+ ClutterSeatEvdev *seat;
+ ClutterStage *stage;
+ ClutterEvent *event = NULL;
+ ClutterPoint pos;
+
+ /* We can drop the event on the floor if no stage has been
+ * associated with the device yet. */
+ stage = _clutter_input_device_get_stage (input_device);
+ if (!stage)
+ return;
+
+ device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
+ seat = _clutter_input_device_evdev_get_seat (device_evdev);
+
+ event = clutter_event_new (CLUTTER_TOUCHPAD_SWIPE);
+
+ event->touchpad_swipe.phase = phase;
+ event->touchpad_swipe.time = time_;
+ event->touchpad_swipe.stage = CLUTTER_STAGE (stage);
+
+ clutter_input_device_get_coords (seat->core_pointer, NULL, &pos);
+ event->touchpad_swipe.x = pos.x;
+ event->touchpad_swipe.y = pos.y;
+ event->touchpad_swipe.dx = dx;
+ event->touchpad_swipe.dy = dy;
+ event->touchpad_swipe.n_fingers = n_fingers;
+
+ _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
+
+ clutter_event_set_device (event, seat->core_pointer);
+ clutter_event_set_source_device (event, input_device);
+
+ queue_event (event);
+}
+
+static void
dispatch_libinput (ClutterDeviceManagerEvdev *manager_evdev)
{
ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
@@ -1372,6 +1460,83 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
break;
}
+ case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
+ case LIBINPUT_EVENT_GESTURE_PINCH_END:
+ {
+ struct libinput_event_gesture *gesture_event =
+ libinput_event_get_gesture_event (event);
+ ClutterTouchpadGesturePhase phase;
+ guint32 time;
+
+ if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_PINCH_BEGIN)
+ phase = CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN;
+ else
+ phase = libinput_event_gesture_get_cancelled (gesture_event) ?
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
+
+ device = libinput_device_get_user_data (libinput_device);
+ time = libinput_event_gesture_get_time (gesture_event);
+ notify_pinch_gesture_event (device, phase, time, 0, 0, 0, 0);
+ break;
+ }
+ case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
+ {
+ struct libinput_event_gesture *gesture_event =
+ libinput_event_get_gesture_event (event);
+ gdouble angle_delta, scale, dx, dy;
+ guint32 time;
+
+ device = libinput_device_get_user_data (libinput_device);
+ time = libinput_event_gesture_get_time (gesture_event);
+ angle_delta = libinput_event_gesture_get_angle_delta (gesture_event);
+ scale = libinput_event_gesture_get_scale (gesture_event);
+ dx = libinput_event_gesture_get_dx (gesture_event);
+ dy = libinput_event_gesture_get_dx (gesture_event);
+
+ notify_pinch_gesture_event (device,
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
+ time, dx, dy, angle_delta, scale);
+ break;
+ }
+ case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
+ case LIBINPUT_EVENT_GESTURE_SWIPE_END:
+ {
+ struct libinput_event_gesture *gesture_event =
+ libinput_event_get_gesture_event (event);
+ ClutterTouchpadGesturePhase phase;
+ guint32 time, n_fingers;
+
+ device = libinput_device_get_user_data (libinput_device);
+ time = libinput_event_gesture_get_time (gesture_event);
+ n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
+
+ if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN)
+ phase = CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN;
+ else
+ phase = libinput_event_gesture_get_cancelled (gesture_event) ?
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
+
+ notify_swipe_gesture_event (device, phase, time, n_fingers, 0, 0);
+ break;
+ }
+ case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
+ {
+ struct libinput_event_gesture *gesture_event =
+ libinput_event_get_gesture_event (event);
+ guint32 time, n_fingers;
+ gdouble dx, dy;
+
+ device = libinput_device_get_user_data (libinput_device);
+ time = libinput_event_gesture_get_time (gesture_event);
+ n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
+ dx = libinput_event_gesture_get_dx (gesture_event);
+ dy = libinput_event_gesture_get_dy (gesture_event);
+
+ notify_swipe_gesture_event (device,
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
+ time, n_fingers, dx, dy);
+ break;
+ }
default:
handled = FALSE;
}
diff --git a/configure.ac b/configure.ac
index da34b3a73..21417c76e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -146,7 +146,7 @@ m4_define([gi_req_version], [1.39.0])
m4_define([gtk_doc_req_version], [1.20])
m4_define([xcomposite_req_version], [0.4])
m4_define([gdk_req_version], [3.3.18])
-m4_define([libinput_req_version], [0.8.0])
+m4_define([libinput_req_version], [0.19.0])
m4_define([libudev_req_version], [136])
AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])