summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-11-24 12:16:05 +0100
committerPeter Hutterer <peter.hutterer@who-t.net>2014-11-25 17:02:27 +1000
commit8b6572bfae15c19fdb9ea0121ed6f397bb3ffead (patch)
tree19f6b7ff44cbe9225dbd544114567a8b99f0ffe8
parent26080263e6ee7c3cd179a395fd6de1c224aba036 (diff)
downloadlibinput-8b6572bfae15c19fdb9ea0121ed6f397bb3ffead.tar.gz
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 <hdegoede@redhat.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/evdev-mt-touchpad.c36
-rw-r--r--src/evdev-mt-touchpad.h10
2 files changed, 46 insertions, 0 deletions
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 */