[PATCH v2 libinput 4/4] touchpad: change manual calculations of dimensions to helper functions

Peter Hutterer peter.hutterer at who-t.net
Mon Jul 18 03:28:10 UTC 2016


Wherever we use an absolute size in mm on the touchpad, switch to the new
helper functions. In a few cases we only need one coordinate so just leave the
other one as 0 in those cases.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
Changes to v2:
- remove duplicate evdev_device_mm_to_units() call to get the button height,
- fix middle button on dell touchpads, in v1 only the le got assigned (and
  to the y coordinate)

 src/evdev-mt-touchpad-buttons.c     | 81 ++++++++++++++++++-------------------
 src/evdev-mt-touchpad-edge-scroll.c | 17 ++++----
 src/evdev-mt-touchpad.c             | 33 ++++++++++-----
 3 files changed, 71 insertions(+), 60 deletions(-)

diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
index 85a355f..581236d 100644
--- a/src/evdev-mt-touchpad-buttons.c
+++ b/src/evdev-mt-touchpad-buttons.c
@@ -541,33 +541,26 @@ static void
 tp_init_softbuttons(struct tp_dispatch *tp,
 		    struct evdev_device *device)
 {
-	int width, height;
-	const struct input_absinfo *absinfo_x, *absinfo_y;
-	struct device_coords offset;
-	int xres, yres;
+	double width, height;
+	struct device_coords edges;
 	int mb_le, mb_re; /* middle button left/right edge */
+	struct phys_coords mm = { 0.0, 0.0 };
 
-	absinfo_x = device->abs.absinfo_x;
-	absinfo_y = device->abs.absinfo_y;
-
-	offset.x = absinfo_x->minimum,
-	offset.y = absinfo_y->minimum,
-	xres = absinfo_x->resolution;
-	yres = absinfo_y->resolution;
-	width = device->abs.dimensions.x;
-	height = device->abs.dimensions.y;
+	evdev_device_get_size(device, &width, &height);
 
 	/* button height: 10mm or 15% or the touchpad height,
 	   whichever is smaller */
-	if ((height * 0.15)/yres > 10) {
-		tp->buttons.bottom_area.top_edge =
-			absinfo_y->maximum - 10 * yres;
-	} else {
-		tp->buttons.bottom_area.top_edge = height * .85 + offset.y;
-	}
+	if (height * 0.15 > 10)
+		mm.y = height - 10;
+	else
+		mm.y = height * 0.85;
+
+	mm.x = width * 0.5;
+	edges = evdev_device_mm_to_units(device, &mm);
+	tp->buttons.bottom_area.top_edge = edges.y;
+	tp->buttons.bottom_area.rightbutton_left_edge = edges.x;
 
 	tp->buttons.bottom_area.middlebutton_left_edge = INT_MAX;
-	tp->buttons.bottom_area.rightbutton_left_edge = width/2 + offset.x;
 
 	/* if middlebutton emulation is enabled, don't init a software area */
 	if (device->middlebutton.want_enabled)
@@ -584,14 +577,21 @@ tp_init_softbuttons(struct tp_dispatch *tp,
 	 * All Dell touchpads appear to have a middle marker.
 	 */
 	if (tp->device->model_flags & EVDEV_MODEL_DELL_TOUCHPAD) {
-		const int MIDDLE_BUTTON_WIDTH = 10; /* mm */
-		int half_width = MIDDLE_BUTTON_WIDTH/2 * xres; /* units */
+		mm.x = width/2 - 5; /* 10mm wide */
+		edges = evdev_device_mm_to_units(device, &mm);
+		mb_le = edges.x;
 
-		mb_le = offset.x + width/2 - half_width;
-		mb_re = offset.x + width/2 + half_width;
+		mm.x = width/2 + 5; /* 10mm wide */
+		edges = evdev_device_mm_to_units(device, &mm);
+		mb_re = edges.x;
 	} else {
-		mb_le = offset.x + width * 0.375;
-		mb_re = offset.x + width * 0.625;
+		mm.x = width * 0.375;
+		edges = evdev_device_mm_to_units(device, &mm);
+		mb_le = edges.x;
+
+		mm.x = width * 0.625;
+		edges = evdev_device_mm_to_units(device, &mm);
+		mb_re = edges.x;
 	}
 
 	tp->buttons.bottom_area.middlebutton_left_edge = mb_le;
@@ -603,18 +603,7 @@ tp_init_top_softbuttons(struct tp_dispatch *tp,
 			struct evdev_device *device,
 			double topbutton_size_mult)
 {
-	int width;
-	const struct input_absinfo *absinfo_x, *absinfo_y;
-	struct device_coords offset;
-	int yres;
-
-	absinfo_x = device->abs.absinfo_x;
-	absinfo_y = device->abs.absinfo_y;
-
-	offset.x = absinfo_x->minimum,
-	offset.y = absinfo_y->minimum;
-	yres = absinfo_y->resolution;
-	width = device->abs.dimensions.x;
+	struct device_coords edges;
 
 	if (tp->buttons.has_topbuttons) {
 		/* T440s has the top button line 5mm from the top, event
@@ -622,10 +611,20 @@ tp_init_top_softbuttons(struct tp_dispatch *tp,
 		   top - which maps to 15%.  We allow the caller to enlarge the
 		   area using a multiplier for the touchpad disabled case. */
 		double topsize_mm = 10 * topbutton_size_mult;
+		struct phys_coords mm;
+		double width, height;
 
-		tp->buttons.top_area.bottom_edge = offset.y + topsize_mm * yres;
-		tp->buttons.top_area.rightbutton_left_edge = width * .58 + offset.x;
-		tp->buttons.top_area.leftbutton_right_edge = width * .42 + offset.x;
+		evdev_device_get_size(device, &width, &height);
+
+		mm.x = width * 0.58;
+		mm.y = topsize_mm;
+		edges = evdev_device_mm_to_units(device, &mm);
+		tp->buttons.top_area.bottom_edge = edges.y;
+		tp->buttons.top_area.rightbutton_left_edge = edges.x;
+
+		mm.x = width * 0.42;
+		edges = evdev_device_mm_to_units(device, &mm);
+		tp->buttons.top_area.leftbutton_right_edge = edges.x;
 	} else {
 		tp->buttons.top_area.bottom_edge = INT_MIN;
 	}
diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c
index 610744a..7675885 100644
--- a/src/evdev-mt-touchpad-edge-scroll.c
+++ b/src/evdev-mt-touchpad-edge-scroll.c
@@ -285,28 +285,29 @@ int
 tp_edge_scroll_init(struct tp_dispatch *tp, struct evdev_device *device)
 {
 	struct tp_touch *t;
-	int edge_width, edge_height;
 	double width, height;
 	bool want_horiz_scroll = true;
+	struct device_coords edges;
+	struct phys_coords mm = { 0.0, 0.0 };
 
+	evdev_device_get_size(device, &width, &height);
 	/* Touchpads smaller than 50mm are not tall enough to have a
 	   horizontal scroll area, it takes too much space away. But
 	   clickpads have enough space here anyway because of the
 	   software button area (and all these tiny clickpads were built
 	   when software buttons were a thing, e.g. Lenovo *20 series)
 	 */
-	if (!tp->buttons.is_clickpad) {
-	    evdev_device_get_size(device, &width, &height);
+	if (!tp->buttons.is_clickpad)
 	    want_horiz_scroll = (height >= 50);
-	}
 
 	/* 7mm edge size */
-	edge_width = device->abs.absinfo_x->resolution * 7;
-	edge_height = device->abs.absinfo_y->resolution * 7;
+	mm.x = width - 7;
+	mm.y = height - 7;
+	edges = evdev_device_mm_to_units(device, &mm);
 
-	tp->scroll.right_edge = device->abs.absinfo_x->maximum - edge_width;
+	tp->scroll.right_edge = edges.x;
 	if (want_horiz_scroll)
-		tp->scroll.bottom_edge = device->abs.absinfo_y->maximum - edge_height;
+		tp->scroll.bottom_edge = edges.y;
 	else
 		tp->scroll.bottom_edge = INT_MAX;
 
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index a7b5a87..eff09f9 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1993,25 +1993,32 @@ static int
 tp_init_palmdetect(struct tp_dispatch *tp,
 		   struct evdev_device *device)
 {
-	int width;
+	double width, height;
+	struct phys_coords mm = { 0.0, 0.0 };
+	struct device_coords edges;
 
 	tp->palm.right_edge = INT_MAX;
 	tp->palm.left_edge = INT_MIN;
 
-	width = device->abs.dimensions.x;
-
 	/* Wacom doesn't have internal touchpads */
 	if (device->model_flags & EVDEV_MODEL_WACOM_TOUCHPAD)
 		return 0;
 
+	evdev_device_get_size(device, &width, &height);
+
 	/* Enable palm detection on touchpads >= 70 mm. Anything smaller
 	   probably won't need it, until we find out it does */
-	if (width/device->abs.absinfo_x->resolution < 70)
+	if (width < 70.0)
 		return 0;
 
 	/* palm edges are 5% of the width on each side */
-	tp->palm.right_edge = device->abs.absinfo_x->maximum - width * 0.05;
-	tp->palm.left_edge = device->abs.absinfo_x->minimum + width * 0.05;
+	mm.x = width * 0.05;
+	edges = evdev_device_mm_to_units(device, &mm);
+	tp->palm.left_edge = edges.x;
+
+	mm.x = width * 0.95;
+	edges = evdev_device_mm_to_units(device, &mm);
+	tp->palm.right_edge = edges.x;
 
 	tp->palm.monitor_trackpoint = true;
 
@@ -2038,8 +2045,9 @@ tp_init_thumb(struct tp_dispatch *tp)
 	struct evdev_device *device = tp->device;
 	const struct input_absinfo *abs;
 	double w = 0.0, h = 0.0;
+	struct device_coords edges;
+	struct phys_coords mm = { 0.0, 0.0 };
 	int xres, yres;
-	int ymax;
 	double threshold;
 
 	if (!tp->buttons.is_clickpad)
@@ -2057,10 +2065,13 @@ tp_init_thumb(struct tp_dispatch *tp)
 
 	/* detect thumbs by pressure in the bottom 15mm, detect thumbs by
 	 * lingering in the bottom 8mm */
-	ymax = tp->device->abs.absinfo_y->maximum;
-	yres = tp->device->abs.absinfo_y->resolution;
-	tp->thumb.upper_thumb_line = ymax - yres * 15;
-	tp->thumb.lower_thumb_line = ymax - yres * 8;
+	mm.y = h * 0.85;
+	edges = evdev_device_mm_to_units(device, &mm);
+	tp->thumb.upper_thumb_line = edges.y;
+
+	mm.y = h * 0.92;
+	edges = evdev_device_mm_to_units(device, &mm);
+	tp->thumb.lower_thumb_line = edges.y;
 
 	abs = libevdev_get_abs_info(device->evdev, ABS_MT_PRESSURE);
 	if (!abs)
-- 
2.7.4



More information about the wayland-devel mailing list