evdev: Apply calibration values to absolute events
authorRob Bradford <rob@linux.intel.com>
Mon, 3 Dec 2012 19:44:16 +0000 (19:44 +0000)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 6 Dec 2012 20:53:09 +0000 (15:53 -0500)
Store a set of calibration values per device - these calibration values are
just applied to the absolute motion events.

src/evdev.c
src/evdev.h

index fa2c740..0b99c43 100644 (file)
@@ -230,6 +230,21 @@ is_motion_event(struct input_event *e)
 }
 
 static void
+transform_absolute(struct evdev_device *device)
+{
+       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];
+
+       device->abs.y = device->abs.x * device->abs.calibration[3] +
+                       device->abs.y * device->abs.calibration[4] +
+                       device->abs.calibration[5];
+}
+
+static void
 evdev_flush_motion(struct evdev_device *device, uint32_t time)
 {
        struct weston_seat *master = device->seat;
@@ -269,6 +284,7 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time)
                device->pending_events &= ~EVDEV_ABSOLUTE_MT_UP;
        }
        if (device->pending_events & EVDEV_ABSOLUTE_MOTION) {
+               transform_absolute(device);
                notify_motion(master, time,
                              wl_fixed_from_int(device->abs.x),
                              wl_fixed_from_int(device->abs.y));
index 85c4739..a90f90c 100644 (file)
@@ -56,6 +56,9 @@ struct evdev_device {
        struct {
                int min_x, max_x, min_y, max_y;
                int32_t x, y;
+
+               int apply_calibration;
+               float calibration[6];
        } abs;
 
        struct {