Convert touchpad absolute events to relative.
authorKristian Høgsberg <krh@redhat.com>
Wed, 26 Nov 2008 04:16:31 +0000 (23:16 -0500)
committerKristian Høgsberg <krh@redhat.com>
Wed, 26 Nov 2008 04:16:31 +0000 (23:16 -0500)
evdev.c

diff --git a/evdev.c b/evdev.c
index 3682321..713670a 100644 (file)
--- a/evdev.c
+++ b/evdev.c
@@ -13,8 +13,8 @@ struct wl_input_device {
        struct wl_event_source *source;
        struct wl_display *display;
        int fd;
-       int tool;
-       int32_t x, y;
+       int tool, new_x, new_y;
+       int32_t x, y, base_x, base_y;
 };
 
 static const struct wl_method input_device_methods[] = {
@@ -65,10 +65,18 @@ static void wl_input_device_data(int fd, uint32_t mask, void *data)
                        absolute_event = 1;
                        switch (e->code) {
                        case ABS_X:
-                               device->x = value;
+                               if (device->new_x) {
+                                       device->base_x = device->x - value;
+                                       device->new_x = 0;
+                               }
+                               device->x = device->base_x + value;
                                break;
                        case ABS_Y:
-                               device->y = value;
+                               if (device->new_y) {
+                                       device->base_y = device->y - value;
+                                       device->new_y = 0;
+                               }
+                               device->y = device->base_y + value;
                                break;
                        }
                        break;
@@ -87,6 +95,10 @@ static void wl_input_device_data(int fd, uint32_t mask, void *data)
                        case BTN_TOOL_FINGER:
                        case BTN_TOOL_MOUSE:
                        case BTN_TOOL_LENS:
+                               if (device->tool == 0 && value) {
+                                       device->new_x = 1;
+                                       device->new_y = 1;
+                               }
                                device->tool = value ? e->code : 0;
                                break;
 
@@ -135,6 +147,10 @@ wl_input_device_create(struct wl_display *display, const char *path)
        device->base.interface = &input_device_interface;
        device->display = display;
        device->tool = 1;
+       device->x = 100;
+       device->y = 100;
+       device->new_x = 1;
+       device->new_y = 1;
 
        device->fd = open(path, O_RDONLY);
        if (device->fd < 0) {