touchpad: fix the button timestamps for double/tripletap
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 27 Apr 2017 04:12:11 +0000 (14:12 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 28 Apr 2017 05:11:30 +0000 (15:11 +1000)
Both events had the same timestamp but we have the timestamp from the original
event - use it.

https://bugs.freedesktop.org/show_bug.cgi?id=100796

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/evdev-mt-touchpad-tap.c
test/test-touchpad-tap.c

index 29989c9..6c989d9 100644 (file)
@@ -341,7 +341,10 @@ tp_tap_touch2_release_handle_event(struct tp_dispatch *tp,
                tp_tap_clear_timer(tp);
                break;
        case TAP_EVENT_RELEASE:
-               tp_tap_notify(tp, time, 2, LIBINPUT_BUTTON_STATE_PRESSED);
+               tp_tap_notify(tp,
+                             tp->tap.first_press_time,
+                             2,
+                             LIBINPUT_BUTTON_STATE_PRESSED);
                tp_tap_notify(tp, time, 2, LIBINPUT_BUTTON_STATE_RELEASED);
                tp->tap.state = TAP_STATE_IDLE;
                break;
@@ -376,7 +379,10 @@ tp_tap_touch3_handle_event(struct tp_dispatch *tp,
        case TAP_EVENT_RELEASE:
                tp->tap.state = TAP_STATE_TOUCH_2_HOLD;
                if (t->tap.state == TAP_TOUCH_STATE_TOUCH) {
-                       tp_tap_notify(tp, time, 3, LIBINPUT_BUTTON_STATE_PRESSED);
+                       tp_tap_notify(tp,
+                                     tp->tap.first_press_time,
+                                     3,
+                                     LIBINPUT_BUTTON_STATE_PRESSED);
                        tp_tap_notify(tp, time, 3, LIBINPUT_BUTTON_STATE_RELEASED);
                }
                break;
index cc0d86f..2739f85 100644 (file)
@@ -916,6 +916,9 @@ START_TEST(touchpad_2fg_tap)
        struct libinput *li = dev->libinput;
        enum libinput_config_tap_button_map map = _i; /* ranged test */
        unsigned int button = 0;
+       struct libinput_event *ev;
+       struct libinput_event_pointer *ptrev;
+       uint64_t ptime, rtime;
 
        litest_enable_tap(dev->libinput_device);
        litest_set_tap_map(dev->libinput_device, map);
@@ -940,11 +943,20 @@ START_TEST(touchpad_2fg_tap)
 
        libinput_dispatch(li);
 
-       litest_assert_button_event(li, button,
-                                  LIBINPUT_BUTTON_STATE_PRESSED);
-       litest_timeout_tap();
-       litest_assert_button_event(li, button,
-                                  LIBINPUT_BUTTON_STATE_RELEASED);
+       ev = libinput_get_event(li);
+       ptrev = litest_is_button_event(ev,
+                                      button,
+                                      LIBINPUT_BUTTON_STATE_PRESSED);
+       ptime = libinput_event_pointer_get_time_usec(ptrev);
+       libinput_event_destroy(ev);
+       ev = libinput_get_event(li);
+       ptrev = litest_is_button_event(ev,
+                                      button,
+                                      LIBINPUT_BUTTON_STATE_RELEASED);
+       rtime = libinput_event_pointer_get_time_usec(ptrev);
+       libinput_event_destroy(ev);
+
+       ck_assert_int_lt(ptime, rtime);
 
        litest_assert_empty_queue(li);
 }
@@ -956,6 +968,9 @@ START_TEST(touchpad_2fg_tap_inverted)
        struct libinput *li = dev->libinput;
        enum libinput_config_tap_button_map map = _i; /* ranged test */
        unsigned int button = 0;
+       struct libinput_event *ev;
+       struct libinput_event_pointer *ptrev;
+       uint64_t ptime, rtime;
 
        litest_enable_tap(dev->libinput_device);
        litest_set_tap_map(dev->libinput_device, map);
@@ -980,11 +995,20 @@ START_TEST(touchpad_2fg_tap_inverted)
 
        libinput_dispatch(li);
 
-       litest_assert_button_event(li, button,
-                                  LIBINPUT_BUTTON_STATE_PRESSED);
-       litest_timeout_tap();
-       litest_assert_button_event(li, button,
-                                  LIBINPUT_BUTTON_STATE_RELEASED);
+       ev = libinput_get_event(li);
+       ptrev = litest_is_button_event(ev,
+                                      button,
+                                      LIBINPUT_BUTTON_STATE_PRESSED);
+       ptime = libinput_event_pointer_get_time_usec(ptrev);
+       libinput_event_destroy(ev);
+       ev = libinput_get_event(li);
+       ptrev = litest_is_button_event(ev,
+                                      button,
+                                      LIBINPUT_BUTTON_STATE_RELEASED);
+       rtime = libinput_event_pointer_get_time_usec(ptrev);
+       libinput_event_destroy(ev);
+
+       ck_assert_int_lt(ptime, rtime);
 
        litest_assert_empty_queue(li);
 }
@@ -1379,6 +1403,10 @@ START_TEST(touchpad_3fg_tap)
        }
 
        for (i = 0; i < 3; i++) {
+               uint64_t ptime, rtime;
+               struct libinput_event *ev;
+               struct libinput_event_pointer *ptrev;
+
                litest_drain_events(li);
 
                litest_touch_down(dev, 0, 50, 50);
@@ -1391,13 +1419,21 @@ START_TEST(touchpad_3fg_tap)
 
                libinput_dispatch(li);
 
-               litest_assert_button_event(li, button,
-                                          LIBINPUT_BUTTON_STATE_PRESSED);
-               litest_timeout_tap();
-               litest_assert_button_event(li, button,
-                                          LIBINPUT_BUTTON_STATE_RELEASED);
+               ev = libinput_get_event(li);
+               ptrev = litest_is_button_event(ev,
+                                              button,
+                                              LIBINPUT_BUTTON_STATE_PRESSED);
+               ptime = libinput_event_pointer_get_time_usec(ptrev);
+               libinput_event_destroy(ev);
+               ev = libinput_get_event(li);
+               ptrev = litest_is_button_event(ev,
+                                              button,
+                                              LIBINPUT_BUTTON_STATE_RELEASED);
+               rtime = libinput_event_pointer_get_time_usec(ptrev);
+               libinput_event_destroy(ev);
+
+               ck_assert_int_lt(ptime, rtime);
 
-               litest_assert_empty_queue(li);
        }
 }
 END_TEST