From dc1d9461701d409a6b81526c81d3a2fb8f567527 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 17 Mar 2015 12:31:37 +1000 Subject: [PATCH] evdev: fix android MT devices These devices don't provide ABS_X/Y, but do have proper multitouch. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/evdev.c b/src/evdev.c index c661af99..ea63356d 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1396,6 +1396,25 @@ evdev_device_get_udev_tags(struct evdev_device *device, return tags; } +static inline void +evdev_fix_android_mt(struct evdev_device *device) +{ + struct libevdev *evdev = device->evdev; + + if (libevdev_has_event_code(evdev, EV_ABS, ABS_X) || + libevdev_has_event_code(evdev, EV_ABS, ABS_Y)) + return; + + if (!libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X) || + !libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y)) + return; + + libevdev_set_abs_info(evdev, ABS_X, + libevdev_get_abs_info(evdev, ABS_MT_POSITION_X)); + libevdev_set_abs_info(evdev, ABS_Y, + libevdev_get_abs_info(evdev, ABS_MT_POSITION_Y)); +} + static int evdev_configure_device(struct evdev_device *device) { @@ -1449,6 +1468,7 @@ evdev_configure_device(struct evdev_device *device) } if (libevdev_has_event_type(evdev, EV_ABS)) { + evdev_fix_android_mt(device); if ((absinfo = libevdev_get_abs_info(evdev, ABS_X))) { if (evdev_fix_abs_resolution(evdev,