diff --git a/src/evdev.c b/src/evdev.c index 29e32136..a3d274a0 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -236,33 +236,32 @@ is_motion_event(struct input_event *e) } static void -transform_absolute(struct evdev_device *device) +transform_absolute(struct evdev_device *device, int32_t *x, int32_t *y) { - int32_t x, y; - - if (!device->abs.apply_calibration) - return; - - x = device->abs.x * device->abs.calibration[0] + - device->abs.y * device->abs.calibration[1] + - device->abs.calibration[2]; - - y = device->abs.x * device->abs.calibration[3] + - device->abs.y * device->abs.calibration[4] + - device->abs.calibration[5]; - - device->abs.x = x; - device->abs.y = y; + if (!device->abs.apply_calibration) { + *x = device->abs.x; + *y = device->abs.y; + return; + } else { + *x = device->abs.x * device->abs.calibration[0] + + device->abs.y * device->abs.calibration[1] + + device->abs.calibration[2]; + + *y = device->abs.x * device->abs.calibration[3] + + device->abs.y * device->abs.calibration[4] + + device->abs.calibration[5]; + } } static void evdev_flush_motion(struct evdev_device *device, uint32_t time) { - struct weston_seat *master = device->seat; - wl_fixed_t x, y; - int slot; + struct weston_seat *master = device->seat; + wl_fixed_t x, y; + int32_t cx, cy; + int slot; - if (!(device->pending_events & EVDEV_SYN)) + if (!(device->pending_events & EVDEV_SYN)) return; slot = device->mt.slot; @@ -296,16 +295,15 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time) if (device->pending_events & EVDEV_ABSOLUTE_MT_UP) { notify_touch(master, time, device->mt.slot, 0, 0, WL_TOUCH_UP); - device->pending_events &= ~EVDEV_ABSOLUTE_MT_UP; - } - if (device->pending_events & EVDEV_ABSOLUTE_MOTION) { - transform_absolute(device); - weston_output_transform_coordinate(device->output, - device->abs.x, - device->abs.y, &x, &y); - - if (device->caps & EVDEV_TOUCH) { - if (master->num_tp == 0) + device->pending_events &= ~EVDEV_ABSOLUTE_MT_UP; + } + if (device->pending_events & EVDEV_ABSOLUTE_MOTION) { + transform_absolute(device, &cx, &cy); + weston_output_transform_coordinate(device->output, + cx, cy, &x, &y); + + if (device->caps & EVDEV_TOUCH) { + if (master->num_tp == 0) notify_touch(master, time, 0, x, y, WL_TOUCH_DOWN); else