Hi all, I would like your opinion about the following: thumb detection on the upper side of the touchpad.
Here's the story. I recently bought a new laptop (T14s AMD gen3) with pretty shallow keys. I use the touchpad buttons quite often, and with the shallower trackpad buttons, my thumb is detected as a pointer movement every now and then. My proposed solution: copy the thumb detection areas to the top as well. The attached patch does this (at least, I tried to do this in a clean way). Feedback is more than welcome, I would love to clean this up and submit it for merging. Thanks for your time, Roemer ----------------------------- diff --git a/src/evdev-mt-touchpad-thumb.c b/src/evdev-mt-touchpad-thumb.c index ceb123ef..d3d3aae3 100644 --- a/src/evdev-mt-touchpad-thumb.c +++ b/src/evdev-mt-touchpad-thumb.c @@ -85,11 +85,20 @@ static bool tp_thumb_in_exclusion_area(const struct tp_dispatch *tp, const struct tp_touch *t) { - return (t->point.y > tp->thumb.lower_thumb_line && + return ((t->point.y > tp->thumb.lower_thumb_line || + t->point.y < tp->thumb.upper_top_thumb_line) && tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE); } +static bool +tp_thumb_in_main_area(const struct tp_dispatch *tp, + const struct tp_touch *t) +{ + return (t->point.y < tp->thumb.upper_thumb_line && + t->point.y > tp->thumb.lower_top_thumb_line); +} + static bool tp_thumb_detect_pressure_size(const struct tp_dispatch *tp, const struct tp_touch *t) @@ -114,9 +123,9 @@ tp_thumb_detect_pressure_size(const struct tp_dispatch *tp, static bool tp_thumb_needs_jail(const struct tp_dispatch *tp, const struct tp_touch *t) { - if (t->point.y < tp->thumb.upper_thumb_line || - tp->scroll.method == LIBINPUT_CONFIG_SCROLL_EDGE) - return false; + if (tp_thumb_in_main_area(tp, t) || + tp->scroll.method == LIBINPUT_CONFIG_SCROLL_EDGE) + return false; if (!tp_thumb_in_exclusion_area(tp, t) && (tp->thumb.use_size || tp->thumb.use_pressure) && @@ -360,7 +369,8 @@ tp_thumb_update_multifinger(struct tp_dispatch *tp) if (newest && (newest->initial_time - oldest->initial_time) < THUMB_TIMEOUT && - first->point.y < tp->thumb.lower_thumb_line) { + (first->point.y < tp->thumb.lower_thumb_line && + first->point.y > tp->thumb.upper_top_thumb_line)) { tp_thumb_lift(tp); return; } @@ -417,7 +427,16 @@ tp_init_thumb(struct tp_dispatch *tp) edges = evdev_device_mm_to_units(device, &mm); tp->thumb.lower_thumb_line = edges.y; - quirks = evdev_libinput_context(device)->quirks; + /* ThinkPad trackpad button fix */ + mm.y = h * 0.15; + edges = evdev_device_mm_to_units(device, &mm); + tp->thumb.lower_top_thumb_line = edges.y; + + mm.y = h * 0.08; + edges = evdev_device_mm_to_units(device, &mm); + tp->thumb.upper_top_thumb_line = edges.y; + + quirks = evdev_libinput_context(device)->quirks; q = quirks_fetch_for_device(quirks, device->udev_device); if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_MT_PRESSURE)) { diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index c99b190f..c46a3edc 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -489,6 +489,10 @@ struct tp_dispatch { int upper_thumb_line; int lower_thumb_line; + /* ThinkPad trackpad button fix */ + int upper_top_thumb_line; + int lower_top_thumb_line; + bool use_pressure; int pressure_threshold;