Thumb detection at upper side of the touchpad (patch)

Jonas Ådahl jadahl at gmail.com
Fri Mar 3 09:49:28 UTC 2023


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.claasen at 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;
> >


More information about the wayland-devel mailing list