touchpad: make the hysteresis dependent on physical distance
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 11 Jun 2015 06:31:00 +0000 (16:31 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 15 Jun 2015 00:50:25 +0000 (10:50 +1000)
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@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad.c

index 34cc85d..c82d733 100644 (file)
@@ -1492,10 +1492,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;