case ABS_MT_POSITION_X:
device->mt.x[device->mt.slot] =
(e->value - device->abs.min_x) * screen_width /
- (device->abs.max_x - device->abs.min_x) +
- device->output->x;
+ (device->abs.max_x - device->abs.min_x);
device->pending_events |= EVDEV_ABSOLUTE_MT_MOTION;
break;
case ABS_MT_POSITION_Y:
device->mt.y[device->mt.slot] =
(e->value - device->abs.min_y) * screen_height /
- (device->abs.max_y - device->abs.min_y) +
- device->output->y;
+ (device->abs.max_y - device->abs.min_y);
device->pending_events |= EVDEV_ABSOLUTE_MT_MOTION;
break;
}
evdev_flush_motion(struct evdev_device *device, uint32_t time)
{
struct weston_seat *master = device->seat;
+ wl_fixed_t x, y;
+ int slot;
if (!(device->pending_events & EVDEV_SYN))
return;
+ slot = device->mt.slot;
device->pending_events &= ~EVDEV_SYN;
if (device->pending_events & EVDEV_RELATIVE_MOTION) {
notify_motion(master, time, device->rel.dx, device->rel.dy);
device->rel.dy = 0;
}
if (device->pending_events & EVDEV_ABSOLUTE_MT_DOWN) {
+ weston_output_transform_coordinate(device->output,
+ device->mt.x[slot],
+ device->mt.y[slot],
+ &x, &y);
notify_touch(master, time,
- device->mt.slot,
- wl_fixed_from_int(device->mt.x[device->mt.slot]),
- wl_fixed_from_int(device->mt.y[device->mt.slot]),
- WL_TOUCH_DOWN);
+ device->mt.slot, x, y, WL_TOUCH_DOWN);
device->pending_events &= ~EVDEV_ABSOLUTE_MT_DOWN;
device->pending_events &= ~EVDEV_ABSOLUTE_MT_MOTION;
}
if (device->pending_events & EVDEV_ABSOLUTE_MT_MOTION) {
+ weston_output_transform_coordinate(device->output,
+ device->mt.x[slot],
+ device->mt.y[slot],
+ &x, &y);
notify_touch(master, time,
- device->mt.slot,
- wl_fixed_from_int(device->mt.x[device->mt.slot]),
- wl_fixed_from_int(device->mt.y[device->mt.slot]),
- WL_TOUCH_MOTION);
+ device->mt.slot, x, y, WL_TOUCH_MOTION);
device->pending_events &= ~EVDEV_ABSOLUTE_MT_DOWN;
device->pending_events &= ~EVDEV_ABSOLUTE_MT_MOTION;
}
}
if (device->pending_events & EVDEV_ABSOLUTE_MOTION) {
transform_absolute(device);
- notify_motion_absolute(master, time,
- wl_fixed_from_int(device->abs.x),
- wl_fixed_from_int(device->abs.y));
+ weston_output_transform_coordinate(device->output,
+ device->abs.x,
+ device->abs.y, &x, &y);
+ notify_motion_absolute(master, time, x, y);
device->pending_events &= ~EVDEV_ABSOLUTE_MOTION;
}
}