touchpad: Add code to get the touchpad model / manufacturer
authorHans de Goede <hdegoede@redhat.com>
Mon, 24 Nov 2014 11:16:05 +0000 (12:16 +0100)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 25 Nov 2014 07:02:27 +0000 (17:02 +1000)
This is useful to know in some cases, it is e.g. necessary to figure out
which percentage of a touchpads range to use as edge for edge-scrolling.

Note this is a slightly cleaned up copy of the same code in
xf86-input-synaptics.

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

index 7a1c32d044513cf5b9d7bc751d8f063b4982b3d2..6d4b5835b5779f421773d2165a4f467502f997c1 100644 (file)
@@ -1146,6 +1146,40 @@ tp_change_to_left_handed(struct evdev_device *device)
        device->buttons.left_handed = device->buttons.want_left_handed;
 }
 
+struct model_lookup_t {
+       uint16_t vendor;
+       uint16_t product_start;
+       uint16_t product_end;
+       enum touchpad_model model;
+};
+
+static struct model_lookup_t model_lookup_table[] = {
+       { 0x0002, 0x0007, 0x0007, MODEL_SYNAPTICS },
+       { 0x0002, 0x0008, 0x0008, MODEL_ALPS },
+       { 0x0002, 0x000e, 0x000e, MODEL_ELANTECH },
+       { 0x05ac,      0, 0x0222, MODEL_APPLETOUCH },
+       { 0x05ac, 0x0223, 0x0228, MODEL_UNIBODY_MACBOOK },
+       { 0x05ac, 0x0229, 0x022b, MODEL_APPLETOUCH },
+       { 0x05ac, 0x022c, 0xffff, MODEL_UNIBODY_MACBOOK },
+       { 0, 0, 0, 0 }
+};
+
+static enum touchpad_model
+tp_get_model(struct evdev_device *device)
+{
+       struct model_lookup_t *lookup;
+       uint16_t vendor  = libevdev_get_id_vendor(device->evdev);
+       uint16_t product = libevdev_get_id_product(device->evdev);
+
+       for (lookup = model_lookup_table; lookup->vendor; lookup++) {
+               if (lookup->vendor == vendor &&
+                   lookup->product_start <= product &&
+                   product <= lookup->product_end)
+                       return lookup->model;
+       }
+       return MODEL_UNKNOWN;
+}
+
 struct evdev_dispatch *
 evdev_mt_touchpad_create(struct evdev_device *device)
 {
@@ -1155,6 +1189,8 @@ evdev_mt_touchpad_create(struct evdev_device *device)
        if (!tp)
                return NULL;
 
+       tp->model = tp_get_model(device);
+
        if (tp_init(tp, device) != 0) {
                tp_destroy(&tp->base);
                return NULL;
index 11c4d495dcae8af9b0f3507082fdfa3107129051..7f3ce49376f13425163b21a46f7ab12b390f027a 100644 (file)
@@ -42,6 +42,15 @@ enum touchpad_event {
        TOUCHPAD_EVENT_BUTTON_RELEASE   = (1 << 2),
 };
 
+enum touchpad_model {
+       MODEL_UNKNOWN = 0,
+       MODEL_SYNAPTICS,
+       MODEL_ALPS,
+       MODEL_APPLETOUCH,
+       MODEL_ELANTECH,
+       MODEL_UNIBODY_MACBOOK
+};
+
 enum touch_state {
        TOUCH_NONE = 0,
        TOUCH_BEGIN,
@@ -156,6 +165,7 @@ struct tp_dispatch {
        unsigned int slot;                      /* current slot */
        bool has_mt;
        bool semi_mt;
+       enum touchpad_model model;
 
        unsigned int real_touches;              /* number of slots */
        unsigned int ntouches;                  /* no slots inc. fakes */