[PATCH libinput] touchpad: make the hysteresis dependent on physical distance

Peter Hutterer peter.hutterer at who-t.net
Thu Jun 11 23:09:00 PDT 2015


Some touchpads, e.g. the Cyapa in the Acer c720 have a small axis range
([0, 870], [0, 470]), so the diagonal/magic value yields a hysteresis margin
of 1 device unit. On that device, that's one-tenth of a millimeter, causing
pointer motion just by holding the finger.

For touchpads that provide a physical resolution, set the hysteresis axes to
0.5mm and do away with the magic factor.

https://bugzilla.redhat.com/show_bug.cgi?id=1230441

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 8c28ff7..e9870ad 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1495,10 +1495,18 @@ tp_init(struct tp_dispatch *tp,
 						       EV_ABS,
 						       ABS_MT_DISTANCE);
 
-	tp->hysteresis_margin.x =
-		diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
-	tp->hysteresis_margin.y =
-		diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
+	if (device->abs.fake_resolution) {
+		tp->hysteresis_margin.x =
+			diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
+		tp->hysteresis_margin.y =
+			diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
+	} else {
+		int res_x = tp->device->abs.absinfo_x->resolution,
+		    res_y = tp->device->abs.absinfo_y->resolution;
+
+		tp->hysteresis_margin.x = res_x/2;
+		tp->hysteresis_margin.y = res_y/2;
+	}
 
 	if (tp_init_accel(tp, diagonal) != 0)
 		return -1;
-- 
2.4.3



More information about the wayland-devel mailing list