Apologies, should have mentioned this concerns *libinput.* Hope this is the right way to do things here.
On Fri, Mar 3, 2023 at 10:29 AM Roemer Claasen <roemer.claa...@gmail.com> wrote: > 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; >