[PATCH libinput 05/11] evdev: apply calibration to multitouch values as well

Peter Hutterer peter.hutterer at who-t.net
Tue Aug 26 21:31:36 PDT 2014


We apply calibration to single-touch and absolute devices, but we might as
well do so for multitouch events.

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

diff --git a/src/evdev.c b/src/evdev.c
index 9c53e32..a029887 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -150,19 +150,20 @@ evdev_device_led_update(struct evdev_device *device, enum libinput_led leds)
 static void
 transform_absolute(struct evdev_device *device, int32_t *x, int32_t *y)
 {
-	if (!device->abs.apply_calibration) {
-		*x = device->abs.x;
-		*y = device->abs.y;
+	int32_t tx, ty;
+
+	if (!device->abs.apply_calibration)
 		return;
-	} else {
-		*x = device->abs.x * device->abs.calibration[0] +
-			device->abs.y * device->abs.calibration[1] +
-			device->abs.calibration[2];
 
-		*y = device->abs.x * device->abs.calibration[3] +
-			device->abs.y * device->abs.calibration[4] +
-			device->abs.calibration[5];
-	}
+	tx = *x * device->abs.calibration[0] +
+		*y * device->abs.calibration[1] +
+		device->abs.calibration[2];
+
+	ty = *x * device->abs.calibration[3] +
+		*y * device->abs.calibration[4] +
+		device->abs.calibration[5];
+	*x = tx;
+	*y = ty;
 }
 
 static inline double
@@ -194,7 +195,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 	struct libinput *libinput = device->base.seat->libinput;
 	struct motion_params motion;
 	int32_t cx, cy;
-	double x, y;
+	int32_t x, y;
 	int slot;
 	int seat_slot;
 	struct libinput_device *base = &device->base;
@@ -239,6 +240,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 		seat->slot_map |= 1 << seat_slot;
 		x = device->mt.slots[slot].x;
 		y = device->mt.slots[slot].y;
+		transform_absolute(device, &x, &y);
 
 		touch_notify_touch_down(base, time, slot, seat_slot, x, y);
 		break;
@@ -253,6 +255,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 		if (seat_slot == -1)
 			break;
 
+		transform_absolute(device, &x, &y);
 		touch_notify_touch_motion(base, time, slot, seat_slot, x, y);
 		break;
 	case EVDEV_ABSOLUTE_MT_UP:
@@ -288,11 +291,15 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 
 		seat->slot_map |= 1 << seat_slot;
 
+		cx = device->abs.x;
+		cy = device->abs.y;
 		transform_absolute(device, &cx, &cy);
 
 		touch_notify_touch_down(base, time, -1, seat_slot, cx, cy);
 		break;
 	case EVDEV_ABSOLUTE_MOTION:
+		cx = device->abs.x;
+		cy = device->abs.y;
 		transform_absolute(device, &cx, &cy);
 		x = cx;
 		y = cy;
-- 
1.9.3



More information about the wayland-devel mailing list