evdev: force a resolution of 1 where no resolution is set
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 19 Jun 2014 01:17:10 +0000 (11:17 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 19 Jun 2014 02:07:17 +0000 (12:07 +1000)
Avoids nasty surprises later when we divide by 0. This matters particularly
when testing a device through uinput, which can't set the resolution.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev.c

index 907d18e5bc2906706cef1d009e5f9482a16e7929..2b2725cfc37de869c15fbb4bb292990de3658225 100644 (file)
@@ -593,6 +593,7 @@ evdev_configure_device(struct evdev_device *device)
 {
        struct libevdev *evdev = device->evdev;
        const struct input_absinfo *absinfo;
+       struct input_absinfo fixed;
        int has_abs, has_rel, has_mt;
        int has_button, has_keyboard, has_touch;
        struct mt_slot *slots;
@@ -611,10 +612,20 @@ evdev_configure_device(struct evdev_device *device)
        if (libevdev_has_event_type(evdev, EV_ABS)) {
 
                if ((absinfo = libevdev_get_abs_info(evdev, ABS_X))) {
+                       if (absinfo->resolution == 0) {
+                               fixed = *absinfo;
+                               fixed.resolution = 1;
+                               libevdev_set_abs_info(evdev, ABS_X, &fixed);
+                       }
                        device->abs.absinfo_x = absinfo;
                        has_abs = 1;
                }
                if ((absinfo = libevdev_get_abs_info(evdev, ABS_Y))) {
+                       if (absinfo->resolution == 0) {
+                               fixed = *absinfo;
+                               fixed.resolution = 1;
+                               libevdev_set_abs_info(evdev, ABS_Y, &fixed);
+                       }
                        device->abs.absinfo_y = absinfo;
                        has_abs = 1;
                }
@@ -624,8 +635,22 @@ evdev_configure_device(struct evdev_device *device)
                if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X) &&
                    libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y)) {
                        absinfo = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X);
+                       if (absinfo->resolution == 0) {
+                               fixed = *absinfo;
+                               fixed.resolution = 1;
+                               libevdev_set_abs_info(evdev,
+                                                     ABS_MT_POSITION_X,
+                                                     &fixed);
+                       }
                        device->abs.absinfo_x = absinfo;
                        absinfo = libevdev_get_abs_info(evdev, ABS_MT_POSITION_Y);
+                       if (absinfo->resolution == 0) {
+                               fixed = *absinfo;
+                               fixed.resolution = 1;
+                               libevdev_set_abs_info(evdev,
+                                                     ABS_MT_POSITION_Y,
+                                                     &fixed);
+                       }
                        device->abs.absinfo_y = absinfo;
                        device->is_mt = 1;
                        has_touch = 1;