const int screen_width = device->output->current->width;
const int screen_height = device->output->current->height;
- 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;
- 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;
- device->pending_events |= EVDEV_ABSOLUTE_MOTION;
- break;
+ 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;
+ 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;
+ 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;
+ 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;
+ device->pending_events |= EVDEV_ABSOLUTE_MOTION;
+ break;
+ }
}
}
{
struct weston_seat *master = device->seat;
- if (!device->pending_events)
+ if (!(device->pending_events & EVDEV_SYN))
return;
+ device->pending_events &= ~EVDEV_SYN;
if (device->pending_events & EVDEV_RELATIVE_MOTION) {
notify_motion(master, time,
master->seat.pointer->x + device->rel.dx,
case EV_KEY:
evdev_process_key(device, event, time);
break;
+ case EV_SYN:
+ device->pending_events |= EVDEV_SYN;
+ break;
}
}
if (TEST_BIT(abs_bits, ABS_MT_SLOT)) {
ioctl(device->fd, EVIOCGABS(ABS_MT_POSITION_X),
&absinfo);
- device->abs.min_x = absinfo.minimum;
- device->abs.max_x = absinfo.maximum;
+ if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
+ device->abs.min_y = absinfo.minimum;
+ device->abs.max_y = absinfo.maximum;
+ } else {
+ device->abs.min_x = absinfo.minimum;
+ device->abs.max_x = absinfo.maximum;
+ }
ioctl(device->fd, EVIOCGABS(ABS_MT_POSITION_Y),
&absinfo);
- device->abs.min_y = absinfo.minimum;
- device->abs.max_y = absinfo.maximum;
+ if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
+ device->abs.min_x = absinfo.minimum;
+ device->abs.max_x = absinfo.maximum;
+ } else {
+ device->abs.min_y = absinfo.minimum;
+ device->abs.max_y = absinfo.maximum;
+ }
device->is_mt = 1;
device->mt.slot = 0;
device->caps |= EVDEV_TOUCH;