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