mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-07 03:48:06 +02:00
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>
This commit is contained in:
parent
26080263e6
commit
8b6572bfae
2 changed files with 46 additions and 0 deletions
|
|
@ -1146,6 +1146,40 @@ tp_change_to_left_handed(struct evdev_device *device)
|
||||||
device->buttons.left_handed = device->buttons.want_left_handed;
|
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 *
|
struct evdev_dispatch *
|
||||||
evdev_mt_touchpad_create(struct evdev_device *device)
|
evdev_mt_touchpad_create(struct evdev_device *device)
|
||||||
{
|
{
|
||||||
|
|
@ -1155,6 +1189,8 @@ evdev_mt_touchpad_create(struct evdev_device *device)
|
||||||
if (!tp)
|
if (!tp)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
tp->model = tp_get_model(device);
|
||||||
|
|
||||||
if (tp_init(tp, device) != 0) {
|
if (tp_init(tp, device) != 0) {
|
||||||
tp_destroy(&tp->base);
|
tp_destroy(&tp->base);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,15 @@ enum touchpad_event {
|
||||||
TOUCHPAD_EVENT_BUTTON_RELEASE = (1 << 2),
|
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 {
|
enum touch_state {
|
||||||
TOUCH_NONE = 0,
|
TOUCH_NONE = 0,
|
||||||
TOUCH_BEGIN,
|
TOUCH_BEGIN,
|
||||||
|
|
@ -156,6 +165,7 @@ struct tp_dispatch {
|
||||||
unsigned int slot; /* current slot */
|
unsigned int slot; /* current slot */
|
||||||
bool has_mt;
|
bool has_mt;
|
||||||
bool semi_mt;
|
bool semi_mt;
|
||||||
|
enum touchpad_model model;
|
||||||
|
|
||||||
unsigned int real_touches; /* number of slots */
|
unsigned int real_touches; /* number of slots */
|
||||||
unsigned int ntouches; /* no slots inc. fakes */
|
unsigned int ntouches; /* no slots inc. fakes */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue