[PATCH libinput 1/3] touchpad: convert two functions to use the device->phys helpers

Peter Hutterer peter.hutterer at who-t.net
Wed Dec 14 07:36:16 UTC 2016


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c | 24 +++++++++++++-----------
 src/evdev.h             | 27 +++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 7bac8ec..26b65de 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -478,18 +478,19 @@ tp_process_key(struct tp_dispatch *tp,
 static void
 tp_unpin_finger(const struct tp_dispatch *tp, struct tp_touch *t)
 {
-	double xdist, ydist;
+	struct phys_coords mm;
+	struct device_coords delta;
 
 	if (!t->pinned.is_pinned)
 		return;
 
-	xdist = abs(t->point.x - t->pinned.center.x);
-	xdist *= tp->buttons.motion_dist.x_scale_coeff;
-	ydist = abs(t->point.y - t->pinned.center.y);
-	ydist *= tp->buttons.motion_dist.y_scale_coeff;
+	delta.x = abs(t->point.x - t->pinned.center.x);
+	delta.y = abs(t->point.y - t->pinned.center.y);
+
+	mm = evdev_device_unit_delta_to_mm(tp->device, &delta);
 
 	/* 1.5mm movement -> unpin */
-	if (hypot(xdist, ydist) >= 1.5) {
+	if (hypot(mm.x, mm.y) >= 1.5) {
 		t->pinned.is_pinned = false;
 		return;
 	}
@@ -962,8 +963,8 @@ tp_need_motion_history_reset(struct tp_dispatch *tp)
 static bool
 tp_detect_jumps(const struct tp_dispatch *tp, struct tp_touch *t)
 {
-	struct device_coords *last;
-	double dx, dy;
+	struct device_coords *last, delta;
+	struct phys_coords mm;
 	const int JUMP_THRESHOLD_MM = 20;
 
 	/* We haven't seen pointer jumps on Wacom tablets yet, so exclude
@@ -978,10 +979,11 @@ tp_detect_jumps(const struct tp_dispatch *tp, struct tp_touch *t)
 	/* called before tp_motion_history_push, so offset 0 is the most
 	 * recent coordinate */
 	last = tp_motion_history_offset(t, 0);
-	dx = 1.0 * abs(t->point.x - last->x) / tp->device->abs.absinfo_x->resolution;
-	dy = 1.0 * abs(t->point.y - last->y) / tp->device->abs.absinfo_y->resolution;
+	delta.x = abs(t->point.x - last->x);
+	delta.y = abs(t->point.y - last->y);
+	mm = evdev_device_unit_delta_to_mm(tp->device, &delta);
 
-	return hypot(dx, dy) > JUMP_THRESHOLD_MM;
+	return hypot(mm.x, mm.y) > JUMP_THRESHOLD_MM;
 }
 
 static void
diff --git a/src/evdev.h b/src/evdev.h
index 071b9ec..c07b09f 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -596,6 +596,33 @@ evdev_libinput_context(const struct evdev_device *device)
 }
 
 /**
+ * Convert the pair of delta coordinates in device space to mm.
+ */
+static inline struct phys_coords
+evdev_device_unit_delta_to_mm(const struct evdev_device* device,
+			      const struct device_coords *units)
+{
+	struct phys_coords mm = { 0,  0 };
+	const struct input_absinfo *absx, *absy;
+
+	if (device->abs.absinfo_x == NULL ||
+	    device->abs.absinfo_y == NULL) {
+		log_bug_libinput(evdev_libinput_context(device),
+				 "%s: is not an abs device\n",
+				 device->devname);
+		return mm;
+	}
+
+	absx = device->abs.absinfo_x;
+	absy = device->abs.absinfo_y;
+
+	mm.x = 1.0 * units->x/absx->resolution;
+	mm.y = 1.0 * units->y/absy->resolution;
+
+	return mm;
+}
+
+/**
  * Convert the pair of coordinates in device space to mm. This takes the
  * axis min into account, i.e. a unit of min is equivalent to 0 mm.
  */
-- 
2.9.3



More information about the wayland-devel mailing list