Thumb detection at upper side of the touchpad (patch)

2023-03-03 Thread Roemer Claasen
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;


Re: Thumb detection at upper side of the touchpad (patch)

2023-03-03 Thread Roemer Claasen
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 
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;
>


Re: Thumb detection at upper side of the touchpad (patch)

2023-03-03 Thread Jonas Ådahl
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 
> 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;
> >