[PATCH libinput 1/6] evdev: split out mt event flushing

Peter Hutterer peter.hutterer at who-t.net
Mon Aug 22 06:14:53 UTC 2016


No functional changes, this is prep work for being able to release touch
points on the fly.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev.c | 394 ++++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 251 insertions(+), 143 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index e906a50..297034a 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -390,172 +390,280 @@ fallback_rotate_relative(struct fallback_dispatch *dispatch,
 }
 
 static void
-fallback_flush_pending_event(struct fallback_dispatch *dispatch,
-			     struct evdev_device *device,
-			     uint64_t time)
+fallback_flush_relative_motion(struct fallback_dispatch *dispatch,
+			       struct evdev_device *device,
+			       uint64_t time)
 {
 	struct libinput *libinput = evdev_libinput_context(device);
-	int slot_idx;
-	int seat_slot;
 	struct libinput_device *base = &device->base;
-	struct libinput_seat *seat = base->seat;
 	struct normalized_coords accel, unaccel;
-	struct device_coords point;
 	struct device_float_coords raw;
-	struct mt_slot *slot = NULL;
 
-	slot_idx = dispatch->mt.slot;
-	if (dispatch->mt.slots)
-		slot = &dispatch->mt.slots[slot_idx];
+	if (!(device->seat_caps & EVDEV_DEVICE_POINTER))
+		return;
+
+	fallback_rotate_relative(dispatch, device);
+
+	normalize_delta(device, &dispatch->rel, &unaccel);
+	raw.x = dispatch->rel.x;
+	raw.y = dispatch->rel.y;
+	dispatch->rel.x = 0;
+	dispatch->rel.y = 0;
+
+	/* Use unaccelerated deltas for pointing stick scroll */
+	if (evdev_post_trackpoint_scroll(device, unaccel, time))
+		return;
+
+	if (device->pointer.filter) {
+		/* Apply pointer acceleration. */
+		accel = filter_dispatch(device->pointer.filter,
+					&unaccel,
+					device,
+					time);
+	} else {
+		log_bug_libinput(libinput,
+				 "%s: accel filter missing\n",
+				 udev_device_get_devnode(device->udev_device));
+		accel = unaccel;
+	}
+
+	if (normalized_is_zero(accel) && normalized_is_zero(unaccel))
+		return;
+
+	pointer_notify_motion(base, time, &accel, &raw);
+}
+
+static void
+fallback_flush_absolute_motion(struct fallback_dispatch *dispatch,
+			       struct evdev_device *device,
+			       uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct device_coords point;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_POINTER))
+		return;
+
+	point = dispatch->abs.point;
+	evdev_transform_absolute(device, &point);
+
+	pointer_notify_motion_absolute(base, time, &point);
+}
+
+static void
+fallback_flush_mt_down(struct fallback_dispatch *dispatch,
+		       struct evdev_device *device,
+		       int slot_idx,
+		       uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct libinput_seat *seat = base->seat;
+	struct device_coords point;
+	struct mt_slot *slot;
+	int seat_slot;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
+		return;
+
+	slot = &dispatch->mt.slots[slot_idx];
+	if (slot->seat_slot != -1) {
+		struct libinput *libinput = evdev_libinput_context(device);
+
+		log_bug_kernel(libinput,
+			       "%s: Driver sent multiple touch down for the "
+			       "same slot",
+			       udev_device_get_devnode(device->udev_device));
+		return;
+	}
+
+	seat_slot = ffs(~seat->slot_map) - 1;
+	slot->seat_slot = seat_slot;
+
+	if (seat_slot == -1)
+		return;
+
+	seat->slot_map |= 1 << seat_slot;
+	point = slot->point;
+	slot->hysteresis_center = point;
+	evdev_transform_absolute(device, &point);
+
+	touch_notify_touch_down(base, time, slot_idx, seat_slot,
+				&point);
+}
+
+static void
+fallback_flush_mt_motion(struct fallback_dispatch *dispatch,
+			 struct evdev_device *device,
+			 int slot_idx,
+			 uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct device_coords point;
+	struct mt_slot *slot;
+	int seat_slot;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
+		return;
+
+	slot = &dispatch->mt.slots[slot_idx];
+	seat_slot = slot->seat_slot;
+	point = slot->point;
+
+	if (seat_slot == -1)
+		return;
+
+	if (fallback_filter_defuzz_touch(dispatch, device, slot))
+		return;
+
+	evdev_transform_absolute(device, &point);
+	touch_notify_touch_motion(base, time, slot_idx, seat_slot,
+				  &point);
+}
+
+static void
+fallback_flush_mt_up(struct fallback_dispatch *dispatch,
+		     struct evdev_device *device,
+		     int slot_idx,
+		     uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct libinput_seat *seat = base->seat;
+	struct mt_slot *slot;
+	int seat_slot;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
+		return;
+
+	slot = &dispatch->mt.slots[slot_idx];
+	seat_slot = slot->seat_slot;
+	slot->seat_slot = -1;
+
+	if (seat_slot == -1)
+		return;
+
+	seat->slot_map &= ~(1 << seat_slot);
+
+	touch_notify_touch_up(base, time, slot_idx, seat_slot);
+}
+
+static void
+fallback_flush_st_down(struct fallback_dispatch *dispatch,
+		       struct evdev_device *device,
+		       uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct libinput_seat *seat = base->seat;
+	struct device_coords point;
+	int seat_slot;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
+		return;
+
+	if (dispatch->abs.seat_slot != -1) {
+		struct libinput *libinput = evdev_libinput_context(device);
+
+		log_bug_kernel(libinput,
+			       "%s: Driver sent multiple touch down for the "
+			       "same slot",
+			       udev_device_get_devnode(device->udev_device));
+		return;
+	}
+
+	seat_slot = ffs(~seat->slot_map) - 1;
+	dispatch->abs.seat_slot = seat_slot;
+
+	if (seat_slot == -1)
+		return;
+
+	seat->slot_map |= 1 << seat_slot;
+
+	point = dispatch->abs.point;
+	evdev_transform_absolute(device, &point);
+
+	touch_notify_touch_down(base, time, -1, seat_slot, &point);
+}
+
+static void
+fallback_flush_st_motion(struct fallback_dispatch *dispatch,
+			 struct evdev_device *device,
+			 uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct device_coords point;
+	int seat_slot;
+
+	point = dispatch->abs.point;
+	evdev_transform_absolute(device, &point);
+
+	seat_slot = dispatch->abs.seat_slot;
+
+	if (seat_slot == -1)
+		return;
+
+	touch_notify_touch_motion(base, time, -1, seat_slot, &point);
+}
+
+static void
+fallback_flush_st_up(struct fallback_dispatch *dispatch,
+		     struct evdev_device *device,
+		     uint64_t time)
+{
+	struct libinput_device *base = &device->base;
+	struct libinput_seat *seat = base->seat;
+	int seat_slot;
+
+	if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
+		return;
+
+	seat_slot = dispatch->abs.seat_slot;
+	dispatch->abs.seat_slot = -1;
+
+	if (seat_slot == -1)
+		return;
+
+	seat->slot_map &= ~(1 << seat_slot);
+
+	touch_notify_touch_up(base, time, -1, seat_slot);
+}
+
+static void
+fallback_flush_pending_event(struct fallback_dispatch *dispatch,
+			     struct evdev_device *device,
+			     uint64_t time)
+{
+	int slot_idx;
 
 	switch (dispatch->pending_event) {
 	case EVDEV_NONE:
 		return;
 	case EVDEV_RELATIVE_MOTION:
-		if (!(device->seat_caps & EVDEV_DEVICE_POINTER))
-			break;
-
-		fallback_rotate_relative(dispatch, device);
-
-		normalize_delta(device, &dispatch->rel, &unaccel);
-		raw.x = dispatch->rel.x;
-		raw.y = dispatch->rel.y;
-		dispatch->rel.x = 0;
-		dispatch->rel.y = 0;
-
-		/* Use unaccelerated deltas for pointing stick scroll */
-		if (evdev_post_trackpoint_scroll(device, unaccel, time))
-			break;
-
-		if (device->pointer.filter) {
-			/* Apply pointer acceleration. */
-			accel = filter_dispatch(device->pointer.filter,
-						&unaccel,
-						device,
-						time);
-		} else {
-			log_bug_libinput(libinput,
-					 "%s: accel filter missing\n",
-					 udev_device_get_devnode(device->udev_device));
-			accel = unaccel;
-		}
-
-		if (normalized_is_zero(accel) && normalized_is_zero(unaccel))
-			break;
-
-		pointer_notify_motion(base, time, &accel, &raw);
+		fallback_flush_relative_motion(dispatch, device, time);
 		break;
 	case EVDEV_ABSOLUTE_MT_DOWN:
-		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
-			break;
-
-		if (slot->seat_slot != -1) {
-			log_bug_kernel(libinput,
-				       "%s: Driver sent multiple touch down for the "
-				       "same slot",
-				       udev_device_get_devnode(device->udev_device));
-			break;
-		}
-
-		seat_slot = ffs(~seat->slot_map) - 1;
-		slot->seat_slot = seat_slot;
-
-		if (seat_slot == -1)
-			break;
-
-		seat->slot_map |= 1 << seat_slot;
-		point = slot->point;
-		slot->hysteresis_center = point;
-		evdev_transform_absolute(device, &point);
-
-		touch_notify_touch_down(base, time, slot_idx, seat_slot,
-					&point);
+		slot_idx = dispatch->mt.slot;
+		fallback_flush_mt_down(dispatch, device, slot_idx, time);
 		break;
 	case EVDEV_ABSOLUTE_MT_MOTION:
-		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
-			break;
-
-		seat_slot = slot->seat_slot;
-		point = slot->point;
-
-		if (seat_slot == -1)
-			break;
-
-		if (fallback_filter_defuzz_touch(dispatch, device, slot))
-			break;
-
-		evdev_transform_absolute(device, &point);
-		touch_notify_touch_motion(base, time, slot_idx, seat_slot,
-					  &point);
+		slot_idx = dispatch->mt.slot;
+		fallback_flush_mt_motion(dispatch, device, slot_idx, time);
 		break;
 	case EVDEV_ABSOLUTE_MT_UP:
-		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
-			break;
-
-		seat_slot = slot->seat_slot;
-		slot->seat_slot = -1;
-
-		if (seat_slot == -1)
-			break;
-
-		seat->slot_map &= ~(1 << seat_slot);
-
-		touch_notify_touch_up(base, time, slot_idx, seat_slot);
+		slot_idx = dispatch->mt.slot;
+		fallback_flush_mt_up(dispatch, device, slot_idx, time);
 		break;
 	case EVDEV_ABSOLUTE_TOUCH_DOWN:
-		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
-			break;
-
-		if (dispatch->abs.seat_slot != -1) {
-			log_bug_kernel(libinput,
-				       "%s: Driver sent multiple touch down for the "
-				       "same slot",
-				       udev_device_get_devnode(device->udev_device));
-			break;
-		}
-
-		seat_slot = ffs(~seat->slot_map) - 1;
-		dispatch->abs.seat_slot = seat_slot;
-
-		if (seat_slot == -1)
-			break;
-
-		seat->slot_map |= 1 << seat_slot;
-
-		point = dispatch->abs.point;
-		evdev_transform_absolute(device, &point);
-
-		touch_notify_touch_down(base, time, -1, seat_slot, &point);
+		fallback_flush_st_down(dispatch, device, time);
 		break;
 	case EVDEV_ABSOLUTE_MOTION:
-		point = dispatch->abs.point;
-		evdev_transform_absolute(device, &point);
-
-		if (device->seat_caps & EVDEV_DEVICE_TOUCH) {
-			seat_slot = dispatch->abs.seat_slot;
-
-			if (seat_slot == -1)
-				break;
-
-			touch_notify_touch_motion(base, time, -1, seat_slot,
-						  &point);
-		} else if (device->seat_caps & EVDEV_DEVICE_POINTER) {
-			pointer_notify_motion_absolute(base, time, &point);
-		}
+		if (device->seat_caps & EVDEV_DEVICE_TOUCH)
+			fallback_flush_st_motion(dispatch, device, time);
+		else if (device->seat_caps & EVDEV_DEVICE_POINTER)
+			fallback_flush_absolute_motion(dispatch,
+						       device,
+						       time);
 		break;
 	case EVDEV_ABSOLUTE_TOUCH_UP:
-		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
-			break;
-
-		seat_slot = dispatch->abs.seat_slot;
-		dispatch->abs.seat_slot = -1;
-
-		if (seat_slot == -1)
-			break;
-
-		seat->slot_map &= ~(1 << seat_slot);
-
-		touch_notify_touch_up(base, time, -1, seat_slot);
+		fallback_flush_st_up(dispatch, device, time);
 		break;
 	default:
 		assert(0 && "Unknown pending event type");
-- 
2.7.4



More information about the wayland-devel mailing list