touchpad: check touchpad for basic features we expect

If a relative device is tagged by udev as ID_INPUT_TOUCHPAD we need to
catch this before we try to dereference device->abs.absinfo_x.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Peter Hutterer 2015-05-28 13:41:58 +10:00
parent d8208940e0
commit a4313f13e3

View file

@ -1439,6 +1439,30 @@ tp_init_sendevents(struct tp_dispatch *tp,
return 0;
}
static int
tp_sanity_check(struct tp_dispatch *tp,
struct evdev_device *device)
{
struct libevdev *evdev = device->evdev;
struct libinput *libinput = tp_libinput_context(tp);
if (!libevdev_has_event_code(evdev, EV_ABS, ABS_X))
goto error;
if (!libevdev_has_event_code(evdev, EV_KEY, BTN_TOUCH))
goto error;
if (!libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_FINGER))
goto error;
return 0;
error:
log_bug_kernel(libinput,
"device %s failed touchpad sanity checks\n");
return -1;
}
static int
tp_init(struct tp_dispatch *tp,
struct evdev_device *device)
@ -1449,6 +1473,9 @@ tp_init(struct tp_dispatch *tp,
tp->base.interface = &tp_interface;
tp->device = device;
if (tp_sanity_check(tp, device) != 0)
return -1;
if (tp_init_slots(tp, device) != 0)
return -1;