The weston_seat struct now keeps a bit mask of the touch points that
are pressed so that it can give a warning if it gets a down event for
a finger that is already down or an up event for one that is already
up.
---

I was using this patch to test bug 67563 but I think it could be a
good idea to land so that we'll catch similar bugs in future.

 src/compositor.h |  3 +++
 src/input.c      | 16 ++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/compositor.h b/src/compositor.h
index a19d966..117406b 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -478,6 +478,9 @@ struct weston_seat {
        struct wl_signal selection_signal;
 
        uint32_t num_tp;
+       /* This is just used to generate a warning if the touch
+        * up/down events get out of sync */
+       uint32_t tp_mask;
 
        void (*led_update)(struct weston_seat *ws, enum weston_led leds);
 
diff --git a/src/input.c b/src/input.c
index 0c3e480..b040e22 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1102,6 +1102,14 @@ notify_touch(struct weston_seat *seat, uint32_t time, 
int touch_id,
 
                seat->num_tp++;
 
+               if (touch_id < (int) sizeof(seat->tp_mask) * 8) {
+                       if ((seat->tp_mask & (1 << touch_id)))
+                               weston_log("touch down received for %i "
+                                          "but it is already down\n",
+                                          touch_id);
+                       seat->tp_mask |= 1 << touch_id;
+               }
+
                /* the first finger down picks the surface, and all further go
                 * to that surface for the remainder of the touch session i.e.
                 * until all touch points are up again. */
@@ -1142,6 +1150,14 @@ notify_touch(struct weston_seat *seat, uint32_t time, 
int touch_id,
                weston_compositor_idle_release(ec);
                seat->num_tp--;
 
+               if (touch_id < (int) sizeof(seat->tp_mask) * 8) {
+                       if (!(seat->tp_mask & (1 << touch_id)))
+                               weston_log("touch up received for %i "
+                                          "but it isn't down\n",
+                                          touch_id);
+                       seat->tp_mask &= ~(1 << touch_id);
+               }
+
                grab->interface->up(grab, time, touch_id);
                if (seat->num_tp == 0)
                        weston_touch_set_focus(seat, NULL);
-- 
1.8.3.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to