On Fri, Mar 03, 2023 at 10:37:45AM +0100, Roemer Claasen wrote: > Apologies, should have mentioned this concerns *libinput.* Hope this is the > right way to do things here.
The right thing would be to open a merge request with your suggested change on the libinput project. You can find it here: https://gitlab.freedesktop.org/libinput/libinput. Jonas > > 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; > >