touchpad: set ntouches for single-touch pads depending on key bits
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 15 Apr 2014 12:27:58 +0000 (14:27 +0200)
committerHans de Goede <hdegoede@redhat.com>
Thu, 22 May 2014 12:39:00 +0000 (14:39 +0200)
A single-touch touchpad that provides BTN_TOOL_TRIPLETAP has 3 touches, etc.
There aren't a lot of these out there, but some touchpads don't have slots but
do provide two- or three-finger detection.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad.c

index 109441d..b4a89e3 100644 (file)
@@ -715,9 +715,29 @@ tp_init_slots(struct tp_dispatch *tp,
                tp->slot = absinfo->value;
                tp->has_mt = true;
        } else {
-               tp->ntouches = 5; /* FIXME: based on DOUBLETAP, etc. */
+               struct map {
+                       unsigned int code;
+                       int ntouches;
+               } max_touches[] = {
+                       { BTN_TOOL_QUINTTAP, 5 },
+                       { BTN_TOOL_QUADTAP, 4 },
+                       { BTN_TOOL_TRIPLETAP, 3 },
+                       { BTN_TOOL_DOUBLETAP, 2 },
+               };
+               struct map *m;
+
                tp->slot = 0;
                tp->has_mt = false;
+               tp->ntouches = 1;
+
+               ARRAY_FOR_EACH(max_touches, m) {
+                       if (libevdev_has_event_code(device->evdev,
+                                                   EV_KEY,
+                                                   m->code)) {
+                               tp->ntouches = m->ntouches;
+                               break;
+                       }
+               }
        }
        tp->touches = calloc(tp->ntouches,
                             sizeof(struct tp_touch));