Thumb detection at upper side of the touchpad (patch)

Roemer Claasen roemer.claasen at gmail.com
Fri Mar 3 09:37:45 UTC 2023


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.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;
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20230303/b751bf1a/attachment.htm>


More information about the wayland-devel mailing list