This patch is a simple ellipsis size thumb detection. By using MAJOR*MINOR we
can get what correspond to the pressure value, and we can find a suitable
pressure threshold that can separate thumbs from fingers.

Signed-off-by: Yao Wei <m...@lxde.org>

---
 src/evdev-mt-touchpad.c | 39 ++++++++++++++++++++++++++++++++++++++-
 src/evdev-mt-touchpad.h |  7 +++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 872da98..2096dee 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -319,6 +319,14 @@ tp_process_absolute(struct tp_dispatch *tp,
                t->dirty = true;
                tp->queued |= TOUCHPAD_EVENT_MOTION;
                break;
+       case ABS_MT_TOUCH_MAJOR:
+               t->ellipsis.major = e->value;
+               /* falls through, minor = major when major changes */
+       case ABS_MT_TOUCH_MINOR:
+               t->ellipsis.minor = e->value;
+               t->dirty = true;
+               tp->queued |= TOUCHPAD_EVENT_MOTION;
+               break;
        }
 }
 
@@ -697,8 +705,18 @@ tp_thumb_detect(struct tp_dispatch *tp, struct tp_touch 
*t, uint64_t time)
         * A finger that remains at the very bottom of the touchpad becomes
         * a thumb.
         */
-       if (t->pressure > tp->thumb.threshold)
+       if (tp->thumb.pressure_detection && t->pressure > tp->thumb.threshold)
                t->thumb.state = THUMB_STATE_YES;
+       else if (tp->thumb.ellipsis_detection) {
+               log_debug(tp_libinput_context(tp),
+                         "ellipsis: major %d, minor %d => %d, threshold is 
%d\n",
+                         t->ellipsis.major,
+                         t->ellipsis.minor,
+                         t->ellipsis.major * t->ellipsis.minor,
+                         tp->thumb.threshold);
+               if (t->ellipsis.major * t->ellipsis.minor > tp->thumb.threshold)
+                       t->thumb.state = THUMB_STATE_YES;
+       }
        else if (t->point.y > tp->thumb.lower_thumb_line &&
                 tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE &&
                 t->thumb.first_touch_time + THUMB_MOVE_TIMEOUT < time)
@@ -1783,6 +1801,25 @@ tp_init_thumb(struct tp_dispatch *tp)
        tp->thumb.upper_thumb_line = ymax - yres * 15;
        tp->thumb.lower_thumb_line = ymax - yres * 8;
 
+       abs = libevdev_get_abs_info(device->evdev, ABS_MT_TOUCH_MAJOR);
+       if (!abs)
+               goto pressure;
+
+       /* Use ABS_MT_TOUCH_MAJOR and ABS_MT_TOUCH_MINOR as pressure
+        * detection.
+        * Use MacBookPro11,1 (13" Retina, Mid-2014) as reference,
+        * The ABS_MT_TOUCH_MAJOR * ABS_MT_TOUCH_MINOR should not
+        * exceed 350000. However, this need a test if higher res
+        * touchpads exhibit higher threshold value */
+
+       tp->thumb.detect_thumbs = true;
+       tp->thumb.ellipsis_detection = true;
+       tp->thumb.threshold = 350000.0;
+
+       goto out; /* skip pressure detection */
+
+pressure:
+
        abs = libevdev_get_abs_info(device->evdev, ABS_MT_PRESSURE);
        if (!abs)
                goto out;
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 3bd8425..110f824 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -215,6 +215,11 @@ struct tp_touch {
                uint64_t first_touch_time;
                struct device_coords initial;
        } thumb;
+
+       struct {
+               int major;
+               int minor;
+       } ellipsis;
 };
 
 struct tp_dispatch {
@@ -347,6 +352,8 @@ struct tp_dispatch {
 
        struct {
                bool detect_thumbs;
+               bool pressure_detection;
+               bool ellipsis_detection;
                int threshold;
                int upper_thumb_line;
                int lower_thumb_line;
-- 
2.5.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to