{
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";
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;
}
} 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;
}