From 8b6572bfae15c19fdb9ea0121ed6f397bb3ffead Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 24 Nov 2014 12:16:05 +0100 Subject: touchpad: Add code to get the touchpad model / manufacturer 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- src/evdev-mt-touchpad.c | 36 ++++++++++++++++++++++++++++++++++++ src/evdev-mt-touchpad.h | 10 ++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 7a1c32d0..6d4b5835 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -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; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 11c4d495..7f3ce493 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -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 */ -- cgit v1.2.1