evdev: Use temporary x and y coordinates when applying calibration
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 26 Jul 2013 17:41:43 +0000 (10:41 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 26 Jul 2013 17:41:43 +0000 (10:41 -0700)
Don't overwrite device->abs.x halfway through the matrix multiplication.

src/evdev.c

index a554302..dd3e2c9 100644 (file)
@@ -230,16 +230,21 @@ is_motion_event(struct input_event *e)
 static void
 transform_absolute(struct evdev_device *device)
 {
+       int32_t x, y;
+
        if (!device->abs.apply_calibration)
                return;
 
-       device->abs.x = device->abs.x * device->abs.calibration[0] +
-                       device->abs.y * device->abs.calibration[1] +
-                       device->abs.calibration[2];
+       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];
 
-       device->abs.y = device->abs.x * device->abs.calibration[3] +
-                       device->abs.y * device->abs.calibration[4] +
-                       device->abs.calibration[5];
+       device->abs.x = x;
+       device->abs.y = y;
 }
 
 static void