Add support for flipping touchscreen x values and touchscreen y values 76/1876/1
authorRusty Lynch <rusty.lynch@intel.com>
Fri, 28 Sep 2012 22:39:15 +0000 (15:39 -0700)
committerRusty Lynch <rusty.lynch@intel.com>
Fri, 28 Sep 2012 22:39:15 +0000 (15:39 -0700)
src/compositor-drm.c
src/evdev.c
src/evdev.h

index 0d4c6bd..97e20b6 100644 (file)
@@ -1786,6 +1786,10 @@ device_parse_quirks(struct evdev_device *evdev_device,
 {
        if (udev_device_get_property_value(udev_device, "WL_QUIRK_SWAP_AXES"))
                evdev_device->quirks |= EVDEV_QUIRK_SWAP_AXES;
+       if (udev_device_get_property_value(udev_device, "WL_QUIRK_FLIP_X"))
+               evdev_device->quirks |= EVDEV_QUIRK_FLIP_X;
+       if (udev_device_get_property_value(udev_device, "WL_QUIRK_FLIP_Y"))
+                evdev_device->quirks |= EVDEV_QUIRK_FLIP_Y;
 }
 
 static const char default_seat[] = "seat0";
index 3f9d635..89ef2ae 100644 (file)
@@ -132,17 +132,30 @@ evdev_process_absolute_motion(struct evdev_device *device,
        if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
                switch (e->code) {
                case ABS_X:
-                       device->abs.y =
-                               (e->value - device->abs.min_y) * screen_height /
-                               (device->abs.max_y - device->abs.min_y) +
-                               device->output->y;
+                       if (device->quirks & EVDEV_QUIRK_FLIP_X)
+                               device->abs.y =
+                                       (device->abs.max_y - e->value) * screen_height /
+                                       (device->abs.max_y - device->abs.min_y) +
+                                       device->output->y;
+                       else
+                                device->abs.y =
+                                        (e->value - device->abs.min_y) * screen_height /
+                                        (device->abs.max_y - device->abs.min_y) +
+                                        device->output->y;
                        device->pending_events |= EVDEV_ABSOLUTE_MOTION;
                        break;
                case ABS_Y:
-                       device->abs.x =
-                               (e->value - device->abs.min_x) * screen_width /
-                               (device->abs.max_x - device->abs.min_x) +
-                               device->output->x;
+                       if (device->quirks & EVDEV_QUIRK_FLIP_Y)
+                               device->abs.x =
+                                       (device->abs.max_x - e->value) * screen_width /
+                                       (device->abs.max_x - device->abs.min_x) +
+                                       device->output->x;
+                       else
+                                device->abs.x =
+                                        (e->value - device->abs.min_x) * screen_width /
+                                        (device->abs.max_x - device->abs.min_x) +
+                                        device->output->x;
                        device->pending_events |= EVDEV_ABSOLUTE_MOTION;
                        break;
                }
@@ -150,17 +163,30 @@ evdev_process_absolute_motion(struct evdev_device *device,
        } else {
                switch (e->code) {
                case ABS_X:
-                       device->abs.x =
-                               (e->value - device->abs.min_x) * screen_width /
-                               (device->abs.max_x - device->abs.min_x) +
-                               device->output->x;
+                       if (device->quirks & EVDEV_QUIRK_FLIP_X)
+                               device->abs.x =
+                                       (device->abs.max_x - e->value) * screen_width /
+                                       (device->abs.max_x - device->abs.min_x) +
+                                       device->output->x;
+                       else
+                                device->abs.x =
+                                        (e->value - device->abs.min_x) * screen_width /
+                                        (device->abs.max_x - device->abs.min_x) +
+                                        device->output->x;
                        device->pending_events |= EVDEV_ABSOLUTE_MOTION;
                        break;
                case ABS_Y:
-                       device->abs.y =
-                               (e->value - device->abs.min_y) * screen_height /
-                               (device->abs.max_y - device->abs.min_y) +
-                               device->output->y;
+                       if (device->quirks & EVDEV_QUIRK_FLIP_Y)
+                               device->abs.y =
+                                       (device->abs.max_y - e->value) * screen_height /
+                                       (device->abs.max_y - device->abs.min_y) +
+                                       device->output->y;
+                       else
+                                device->abs.y =
+                                        (e->value - device->abs.min_y) * screen_height /
+                                        (device->abs.max_y - device->abs.min_y) +
+                                        device->output->y;
+
                        device->pending_events |= EVDEV_ABSOLUTE_MOTION;
                        break;
                }
index 9ae62db..a1bccd8 100644 (file)
@@ -47,6 +47,8 @@ enum evdev_device_capability {
 enum evdev_device_quirks {
        EVDEV_QUIRK_NONE = 0,
        EVDEV_QUIRK_SWAP_AXES = (1 << 0),
+       EVDEV_QUIRK_FLIP_X = (1 << 1),
+       EVDEV_QUIRK_FLIP_Y = (1 << 2),
 };
 
 struct evdev_device {