evdev: fetch absolute coordinates inside flush_motion only
authorTiago Vignatti <tiago.vignatti@intel.com>
Tue, 22 Nov 2011 10:05:22 +0000 (12:05 +0200)
committerJonas Ådahl <jadahl@gmail.com>
Sun, 10 Nov 2013 16:51:26 +0000 (17:51 +0100)
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
compositor/evdev.c

index 96fb0cd..06913cf 100644 (file)
@@ -208,8 +208,9 @@ evdev_flush_motion(struct wl_input_device *device, uint32_t time,
                   struct evdev_motion_accumulator *accum)
 {
        if (accum->type == EVDEV_RELATIVE_MOTION) {
-               notify_motion(device, time, accum->x + accum->dx,
-                             accum->y + accum->dy);
+               accum->dx += device->x;
+               accum->dy += device->y;
+               notify_motion(device, time, accum->dx, accum->dy);
                accum->dx = accum->dy = 0;
        }
        if (accum->type == EVDEV_ABSOLUTE_MOTION)
@@ -233,16 +234,14 @@ evdev_input_device_data(int fd, uint32_t mask, void *data)
        if (!ec->focus)
                return 1;
 
-       memset(&accumulator, 0, sizeof accumulator);
-       accumulator.x = device->master->base.input_device.x;
-       accumulator.y = device->master->base.input_device.y;
-
        len = read(fd, &ev, sizeof ev);
        if (len < 0 || len % sizeof e[0] != 0) {
                /* FIXME: call device_removed when errno is ENODEV. */;
                return 1;
        }
 
+       memset(&accumulator, 0, sizeof accumulator);
+
        e = ev;
        end = (void *) ev + len;
        for (e = ev; e < end; e++) {