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