From f8a676385348ef3c17ad4929c77868c2c2b8e51e Mon Sep 17 00:00:00 2001 From: Rusty Lynch Date: Fri, 28 Sep 2012 15:39:15 -0700 Subject: [PATCH] Add support for flipping touchscreen x values and touchscreen y values --- src/compositor-drm.c | 4 ++++ src/evdev.c | 58 +++++++++++++++++++++++++++++++++++++--------------- src/evdev.h | 2 ++ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 0d4c6bd..97e20b6 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -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"; diff --git a/src/evdev.c b/src/evdev.c index 3f9d635..89ef2ae 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -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; } diff --git a/src/evdev.h b/src/evdev.h index 9ae62db..a1bccd8 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -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 { -- 2.7.4