Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 src/evdev-mt-touchpad.c | 46 ++++++++++++++++++++++++++++++++++++++++++++--
 src/evdev-mt-touchpad.h |  3 +++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index b2c22ff..08014f6 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -680,6 +680,34 @@ tp_palm_detect_multifinger(struct tp_dispatch *tp, struct 
tp_touch *t, uint64_t
 }
 
 static inline bool
+tp_palm_detect_touch_size_triggered(struct tp_dispatch *tp,
+                                   struct tp_touch *t,
+                                   uint64_t time)
+{
+       const struct rthreshold *thr = &tp->palm.threshold;
+       int angle;
+
+       if (!tp->touch_size.use_touch_size)
+               return false;
+
+       /* If a finger size is large enough for palm, we stick with that and
+        * force the user to release and reset the finger */
+       if (t->palm.state != PALM_NONE && t->palm.state != PALM_TOUCH_SIZE)
+               return false;
+
+       angle = abs(t->orientation) * tp->touch_size.orientation_to_angle;
+
+       if (angle > 45 && t->major > rthreshold_at_angle(thr, angle)) {
+               evdev_log_debug(tp->device,
+                               "palm: touch size exceeded\n");
+               t->palm.state = PALM_TOUCH_SIZE;
+               return true;
+       }
+
+       return false;
+}
+
+static inline bool
 tp_palm_detect_edge(struct tp_dispatch *tp,
                    struct tp_touch *t,
                    uint64_t time)
@@ -739,6 +767,9 @@ tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, 
uint64_t time)
        if (tp_palm_detect_trackpoint_triggered(tp, t, time))
                goto out;
 
+       if (tp_palm_detect_touch_size_triggered(tp, t, time))
+               goto out;
+
        if (tp_palm_detect_edge(tp, t, time))
                goto out;
 
@@ -757,6 +788,9 @@ out:
        case PALM_TRACKPOINT:
                palm_state = "trackpoint";
                break;
+       case PALM_TOUCH_SIZE:
+               palm_state = "touch size";
+               break;
        case PALM_NONE:
        default:
                abort();
@@ -2310,14 +2344,22 @@ tp_init_palmdetect(struct tp_dispatch *tp,
        tp->palm.right_edge = INT_MAX;
        tp->palm.left_edge = INT_MIN;
 
+       if (tp->touch_size.use_touch_size) {
+               const int mm = 17;
+               int xres = device->abs.absinfo_x->resolution,
+                   yres = device->abs.absinfo_y->resolution;
+
+               tp->palm.threshold = rthreshold_init(mm, xres, yres);
+       }
+
        if (device->tags & EVDEV_TAG_EXTERNAL_TOUCHPAD &&
            !tp_is_tpkb_combo_below(device))
                return;
 
        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 */
+       /* Enable edge palm detection on touchpads >= 70 mm. Anything
+        * smaller probably won't need it, until we find out it does */
        if (width < 70.0)
                return;
 
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 5282b67..ee0c9d5 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -66,6 +66,7 @@ enum touch_palm_state {
        PALM_EDGE,
        PALM_TYPING,
        PALM_TRACKPOINT,
+       PALM_TOUCH_SIZE,
 };
 
 enum button_event {
@@ -360,6 +361,8 @@ struct tp_dispatch {
                uint64_t trackpoint_last_event_time;
                uint32_t trackpoint_event_count;
                bool monitor_trackpoint;
+
+               struct rthreshold threshold;
        } palm;
 
        struct {
-- 
2.9.3

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

Reply via email to