[PATCH libinput 1/4] evdev: factor out resolution changing code

Peter Hutterer peter.hutterer at who-t.net
Tue Nov 4 20:44:23 PST 2014


No functional changes.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev.c | 57 ++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index 3aa87a7..ecf105d 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1038,13 +1038,31 @@ evdev_tag_device(struct evdev_device *device)
 	udev_unref(udev);
 }
 
+static inline int
+evdev_fix_abs_resolution(struct libevdev *evdev,
+			 unsigned int code,
+			 const struct input_absinfo *absinfo)
+{
+	struct input_absinfo fixed;
+
+	if (absinfo->resolution == 0) {
+		fixed = *absinfo;
+		fixed.resolution = 1;
+		/* libevdev_set_abs_info() changes the absinfo we already
+		   have a pointer to, no need to fetch it again */
+		libevdev_set_abs_info(evdev, code, &fixed);
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
 static int
 evdev_configure_device(struct evdev_device *device)
 {
 	struct libinput *libinput = device->base.seat->libinput;
 	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;
@@ -1063,22 +1081,18 @@ 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);
+			if (evdev_fix_abs_resolution(evdev,
+						     ABS_X,
+						     absinfo))
 				device->abs.fake_resolution = 1;
-			}
 			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);
+			if (evdev_fix_abs_resolution(evdev,
+						     ABS_Y,
+						     absinfo))
 				device->abs.fake_resolution = 1;
-			}
 			device->abs.absinfo_y = absinfo;
 			has_abs = 1;
 		}
@@ -1088,24 +1102,17 @@ 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);
+			if (evdev_fix_abs_resolution(evdev,
+						     ABS_MT_POSITION_X,
+						     absinfo))
 				device->abs.fake_resolution = 1;
-			}
 			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);
+			if (evdev_fix_abs_resolution(evdev,
+						     ABS_MT_POSITION_Y,
+						     absinfo))
 				device->abs.fake_resolution = 1;
-			}
 			device->abs.absinfo_y = absinfo;
 			device->is_mt = 1;
 			has_touch = 1;
-- 
2.1.0



More information about the wayland-devel mailing list