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