On Fri, Jul 24, 2015 at 10:41:41AM +0200, Hans de Goede wrote:
> Hi,
> 
> On 24-07-15 02:35, Peter Hutterer wrote:
> >It's reasonable to expect a thumb (or the other hand's index finger) to click
> >a button while a finger is down for movement. It's less reasonable to expect
> >this when two fingers are interacting with the touchpad, or when two fingers
> >click the touchpad (even on a large touchpad that's an awkward position).
> >
> >Simplify the clickfinger detection mechanism - if we have three touches down,
> >it's always a three-finger click. Two fingers may be a right click or a index
> >+ thumb click.
> >
> >Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
> >---
> >  src/evdev-mt-touchpad-buttons.c | 23 ++++---------
> >  test/touchpad-buttons.c         | 74 
> > +++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 80 insertions(+), 17 deletions(-)
> >
> >diff --git a/src/evdev-mt-touchpad-buttons.c 
> >b/src/evdev-mt-touchpad-buttons.c
> >index a2fb4b4..0e6426c 100644
> >--- a/src/evdev-mt-touchpad-buttons.c
> >+++ b/src/evdev-mt-touchpad-buttons.c
> >@@ -856,11 +856,9 @@ tp_clickfinger_set_button(struct tp_dispatch *tp)
> >     unsigned int nfingers = tp->nfingers_down;
> >     struct tp_touch *t;
> >     struct tp_touch *first = NULL,
> >-                    *second = NULL,
> >-                    *third = NULL;
> >-    uint32_t close_touches = 0;
> >+                    *second = NULL;
> >
> >-    if (nfingers < 2 || nfingers > 3)
> >+    if (nfingers < 2 || nfingers >= 3)
> >             goto out;
> >
> >     /* two or three fingers down on the touchpad. Check for distance
> 
> This comment should now be:
>       /* two fingers down on the touchpad. Check for distance
> 
> And you should also simplify the test above the comment to match and make it:
> 
>       if (nfingers != 2)
>               goto out;
> 
> Which is what the code in your patch also does in a somewhat complicated 
> manner.
> 
> With this fixed: Reviewed-by: Hans de Goede <hdego...@redhat.com>

both fixed, thanks.

Cheers,
   Peter
 
> >@@ -873,10 +871,6 @@ tp_clickfinger_set_button(struct tp_dispatch *tp)
> >                     first = t;
> >             else if (!second)
> >                     second = t;
> >-            else if (!third) {
> >-                    third = t;
> >-                    break;
> >-            }
> >     }
> >
> >     if (!first || !second) {
> >@@ -884,15 +878,10 @@ tp_clickfinger_set_button(struct tp_dispatch *tp)
> >             goto out;
> >     }
> >
> >-    close_touches |= tp_check_clickfinger_distance(tp, first, second) << 0;
> >-    close_touches |= tp_check_clickfinger_distance(tp, second, third) << 1;
> >-    close_touches |= tp_check_clickfinger_distance(tp, first, third) << 2;
> >-
> >-    switch(__builtin_popcount(close_touches)) {
> >-    case 0: nfingers = 1; break;
> >-    case 1: nfingers = 2; break;
> >-    default: nfingers = 3; break;
> >-    }
> >+    if (tp_check_clickfinger_distance(tp, first, second))
> >+            nfingers = 2;
> >+    else
> >+            nfingers = 1;
> >
> >  out:
> >     switch (nfingers) {
> >diff --git a/test/touchpad-buttons.c b/test/touchpad-buttons.c
> >index ccc3b88..5767114 100644
> >--- a/test/touchpad-buttons.c
> >+++ b/test/touchpad-buttons.c
> >@@ -444,6 +444,78 @@ START_TEST(touchpad_2fg_clickfinger_distance)
> >  }
> >  END_TEST
> >
> >+START_TEST(touchpad_3fg_clickfinger_distance)
> >+{
> >+    struct litest_device *dev = litest_current_device();
> >+    struct libinput *li = dev->libinput;
> >+
> >+    if (libevdev_get_num_slots(dev->evdev) < 3)
> >+            return;
> >+
> >+    enable_clickfinger(dev);
> >+
> >+    litest_drain_events(li);
> >+
> >+    litest_touch_down(dev, 0, 90, 90);
> >+    litest_touch_down(dev, 1, 10, 15);
> >+    litest_touch_down(dev, 2, 10, 15);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_event(dev, EV_KEY, BTN_LEFT, 1);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_event(dev, EV_KEY, BTN_LEFT, 0);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_touch_up(dev, 0);
> >+    litest_touch_up(dev, 1);
> >+    litest_touch_up(dev, 2);
> >+
> >+    litest_assert_button_event(li,
> >+                               BTN_MIDDLE,
> >+                               LIBINPUT_BUTTON_STATE_PRESSED);
> >+    litest_assert_button_event(li,
> >+                               BTN_MIDDLE,
> >+                               LIBINPUT_BUTTON_STATE_RELEASED);
> >+}
> >+END_TEST
> >+
> >+START_TEST(touchpad_3fg_clickfinger_distance_btntool)
> >+{
> >+    struct litest_device *dev = litest_current_device();
> >+    struct libinput *li = dev->libinput;
> >+
> >+    if (libevdev_get_num_slots(dev->evdev) > 2)
> >+            return;
> >+
> >+    enable_clickfinger(dev);
> >+
> >+    litest_drain_events(li);
> >+
> >+    litest_touch_down(dev, 0, 90, 90);
> >+    litest_touch_down(dev, 1, 10, 15);
> >+    libinput_dispatch(li);
> >+    litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
> >+    litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    libinput_dispatch(li);
> >+    litest_event(dev, EV_KEY, BTN_LEFT, 1);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_event(dev, EV_KEY, BTN_LEFT, 0);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
> >+    litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
> >+    litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >+    litest_touch_up(dev, 0);
> >+    litest_touch_up(dev, 1);
> >+
> >+    litest_assert_button_event(li,
> >+                               BTN_MIDDLE,
> >+                               LIBINPUT_BUTTON_STATE_PRESSED);
> >+    litest_assert_button_event(li,
> >+                               BTN_MIDDLE,
> >+                               LIBINPUT_BUTTON_STATE_RELEASED);
> >+}
> >+END_TEST
> >+
> >  START_TEST(touchpad_2fg_clickfinger_bottom)
> >  {
> >     struct litest_device *dev = litest_current_device();
> >@@ -1415,6 +1487,8 @@ litest_setup_tests(void)
> >     litest_add("touchpad:clickfinger", 
> > touchpad_4fg_clickfinger_btntool_2slots, LITEST_CLICKPAD, LITEST_ANY);
> >     litest_add("touchpad:clickfinger", 
> > touchpad_4fg_clickfinger_btntool_3slots, LITEST_CLICKPAD, LITEST_ANY);
> >     litest_add("touchpad:clickfinger", touchpad_2fg_clickfinger_distance, 
> > LITEST_CLICKPAD, LITEST_ANY);
> >+    litest_add("touchpad:clickfinger", touchpad_3fg_clickfinger_distance, 
> >LITEST_CLICKPAD, LITEST_ANY);
> >+    litest_add("touchpad:clickfinger", 
> >touchpad_3fg_clickfinger_distance_btntool, LITEST_CLICKPAD, LITEST_ANY);
> >     litest_add_for_device("touchpad:clickfinger", 
> > touchpad_2fg_clickfinger_bottom, LITEST_SYNAPTICS_TOPBUTTONPAD);
> >     litest_add("touchpad:clickfinger", touchpad_clickfinger_to_area_method, 
> > LITEST_CLICKPAD, LITEST_ANY);
> >     litest_add("touchpad:clickfinger",
> >
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to