test: move semi-mt special tracking into the shared litest.c
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 16 Dec 2014 01:28:26 +0000 (11:28 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 15 Jan 2015 21:42:50 +0000 (07:42 +1000)
An upcoming synaptics semi-mt device needs the same code.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
test/litest-alps-semi-mt.c
test/litest.c
test/litest.h

index 12b93b8..4d95ac9 100644 (file)
 #include "litest.h"
 #include "litest-int.h"
 
-static int tracking_id;
-
-/* this is a semi-mt device, so we keep track of the touches that the tests
- * send and modify them so that the first touch is always slot 0 and sends
- * the top-left of the bounding box, the second is always slot 1 and sends
- * the bottom-right of the bounding box.
- * Lifting any of two fingers terminates slot 1
- */
-struct alps {
-       /* The actual touches requested by the test for the two slots
-        * in the 0..100 range used by litest */
-       struct {
-               double x, y;
-       } touches[2];
-};
 
 static void alps_create(struct litest_device *d);
 
@@ -57,140 +42,27 @@ litest_alps_setup(void)
 }
 
 static void
-send_abs_xy(struct litest_device *d, double x, double y)
-{
-       struct input_event e;
-       int val;
-
-       e.type = EV_ABS;
-       e.code = ABS_X;
-       e.value = LITEST_AUTO_ASSIGN;
-       val = litest_auto_assign_value(d, &e, 0, x, y);
-       litest_event(d, EV_ABS, ABS_X, val);
-
-       e.code = ABS_Y;
-       val = litest_auto_assign_value(d, &e, 0, x, y);
-       litest_event(d, EV_ABS, ABS_Y, val);
-}
-
-static void
-send_abs_mt_xy(struct litest_device *d, double x, double y)
-{
-       struct input_event e;
-       int val;
-
-       e.type = EV_ABS;
-       e.code = ABS_MT_POSITION_X;
-       e.value = LITEST_AUTO_ASSIGN;
-       val = litest_auto_assign_value(d, &e, 0, x, y);
-       litest_event(d, EV_ABS, ABS_MT_POSITION_X, val);
-
-       e.code = ABS_MT_POSITION_Y;
-       e.value = LITEST_AUTO_ASSIGN;
-       val = litest_auto_assign_value(d, &e, 0, x, y);
-       litest_event(d, EV_ABS, ABS_MT_POSITION_Y, val);
-}
-
-static void
 alps_touch_down(struct litest_device *d, unsigned int slot, double x, double y)
 {
-       struct alps *alps = d->private;
-       double t, l, r = 0, b = 0; /* top, left, right, bottom */
-
-       if (d->ntouches_down > 2 || slot > 1)
-               return;
-
-       if (d->ntouches_down == 1) {
-               l = x;
-               t = y;
-       } else {
-               int other = (slot + 1) % 2;
-               l = min(x, alps->touches[other].x);
-               t = min(y, alps->touches[other].y);
-               r = max(x, alps->touches[other].x);
-               b = max(y, alps->touches[other].y);
-       }
+       struct litest_semi_mt *semi_mt = d->private;
 
-       send_abs_xy(d, l, t);
-
-       litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
-
-       if (d->ntouches_down == 1)
-               litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, ++tracking_id);
-
-       send_abs_mt_xy(d, l, t);
-
-       if (d->ntouches_down == 2) {
-               litest_event(d, EV_ABS, ABS_MT_SLOT, 1);
-               litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, ++tracking_id);
-
-               send_abs_mt_xy(d, r, b);
-       }
-
-       litest_event(d, EV_SYN, SYN_REPORT, 0);
-
-       alps->touches[slot].x = x;
-       alps->touches[slot].y = y;
+       litest_semi_mt_touch_down(d, semi_mt, slot, x, y);
 }
 
 static void
 alps_touch_move(struct litest_device *d, unsigned int slot, double x, double y)
 {
-       struct alps *alps = d->private;
-       double t, l, r = 0, b = 0; /* top, left, right, bottom */
-
-       if (d->ntouches_down > 2 || slot > 1)
-               return;
+       struct litest_semi_mt *semi_mt = d->private;
 
-       if (d->ntouches_down == 1) {
-               l = x;
-               t = y;
-       } else {
-               int other = (slot + 1) % 2;
-               l = min(x, alps->touches[other].x);
-               t = min(y, alps->touches[other].y);
-               r = max(x, alps->touches[other].x);
-               b = max(y, alps->touches[other].y);
-       }
-
-       send_abs_xy(d, l, t);
-
-       litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
-       send_abs_mt_xy(d, l, t);
-
-       if (d->ntouches_down == 2) {
-               litest_event(d, EV_ABS, ABS_MT_SLOT, 1);
-               send_abs_mt_xy(d, r, b);
-       }
-
-       litest_event(d, EV_SYN, SYN_REPORT, 0);
-
-       alps->touches[slot].x = x;
-       alps->touches[slot].y = y;
+       litest_semi_mt_touch_move(d, semi_mt, slot, x, y);
 }
 
 static void
 alps_touch_up(struct litest_device *d, unsigned int slot)
 {
-       struct alps *alps = d->private;
-
-       /* note: ntouches_down is decreased before we get here */
-       if (d->ntouches_down >= 2 || slot > 1)
-               return;
-
-       litest_event(d, EV_ABS, ABS_MT_SLOT, d->ntouches_down);
-       litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, -1);
-
-       /* if we have one finger left, send x/y coords for that finger left.
-          this is likely to happen with a real touchpad */
-       if (d->ntouches_down == 1) {
-               int other = (slot + 1) % 2;
-               send_abs_xy(d, alps->touches[other].x, alps->touches[other].y);
-               litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
-               send_abs_mt_xy(d, alps->touches[other].x, alps->touches[other].y);
-       }
+       struct litest_semi_mt *semi_mt = d->private;
 
-       litest_event(d, EV_SYN, SYN_REPORT, 0);
+       litest_semi_mt_touch_up(d, semi_mt, slot);
 }
 
 static struct litest_device_interface interface = {
@@ -247,10 +119,10 @@ struct litest_test_device litest_alps_device = {
 static void
 alps_create(struct litest_device *d)
 {
-       struct alps *alps = zalloc(sizeof(*alps));
-       assert(alps);
+       struct litest_semi_mt *semi_mt = zalloc(sizeof(*semi_mt));
+       assert(semi_mt);
 
-       d->private = alps;
+       d->private = semi_mt;
 
        d->uinput = litest_create_uinput_device_from_description(litest_alps_device.name,
                                                                 litest_alps_device.id,
index 757f445..adba461 100644 (file)
@@ -1277,3 +1277,144 @@ litest_pop_event_frame(struct litest_device *dev)
        dev->skip_ev_syn = false;
        litest_event(dev, EV_SYN, SYN_REPORT, 0);
 }
+
+static void
+send_abs_xy(struct litest_device *d, double x, double y)
+{
+       struct input_event e;
+       int val;
+
+       e.type = EV_ABS;
+       e.code = ABS_X;
+       e.value = LITEST_AUTO_ASSIGN;
+       val = litest_auto_assign_value(d, &e, 0, x, y);
+       litest_event(d, EV_ABS, ABS_X, val);
+
+       e.code = ABS_Y;
+       val = litest_auto_assign_value(d, &e, 0, x, y);
+       litest_event(d, EV_ABS, ABS_Y, val);
+}
+
+static void
+send_abs_mt_xy(struct litest_device *d, double x, double y)
+{
+       struct input_event e;
+       int val;
+
+       e.type = EV_ABS;
+       e.code = ABS_MT_POSITION_X;
+       e.value = LITEST_AUTO_ASSIGN;
+       val = litest_auto_assign_value(d, &e, 0, x, y);
+       litest_event(d, EV_ABS, ABS_MT_POSITION_X, val);
+
+       e.code = ABS_MT_POSITION_Y;
+       e.value = LITEST_AUTO_ASSIGN;
+       val = litest_auto_assign_value(d, &e, 0, x, y);
+       litest_event(d, EV_ABS, ABS_MT_POSITION_Y, val);
+}
+
+void
+litest_semi_mt_touch_down(struct litest_device *d,
+                         struct litest_semi_mt *semi_mt,
+                         unsigned int slot,
+                         double x, double y)
+{
+       double t, l, r = 0, b = 0; /* top, left, right, bottom */
+
+       if (d->ntouches_down > 2 || slot > 1)
+               return;
+
+       if (d->ntouches_down == 1) {
+               l = x;
+               t = y;
+       } else {
+               int other = (slot + 1) % 2;
+               l = min(x, semi_mt->touches[other].x);
+               t = min(y, semi_mt->touches[other].y);
+               r = max(x, semi_mt->touches[other].x);
+               b = max(y, semi_mt->touches[other].y);
+       }
+
+       send_abs_xy(d, l, t);
+
+       litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
+
+       if (d->ntouches_down == 1)
+               litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, ++semi_mt->tracking_id);
+
+       send_abs_mt_xy(d, l, t);
+
+       if (d->ntouches_down == 2) {
+               litest_event(d, EV_ABS, ABS_MT_SLOT, 1);
+               litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, ++semi_mt->tracking_id);
+
+               send_abs_mt_xy(d, r, b);
+       }
+
+       litest_event(d, EV_SYN, SYN_REPORT, 0);
+
+       semi_mt->touches[slot].x = x;
+       semi_mt->touches[slot].y = y;
+}
+
+void
+litest_semi_mt_touch_move(struct litest_device *d,
+                         struct litest_semi_mt *semi_mt,
+                         unsigned int slot,
+                         double x, double y)
+{
+       double t, l, r = 0, b = 0; /* top, left, right, bottom */
+
+       if (d->ntouches_down > 2 || slot > 1)
+               return;
+
+       if (d->ntouches_down == 1) {
+               l = x;
+               t = y;
+       } else {
+               int other = (slot + 1) % 2;
+               l = min(x, semi_mt->touches[other].x);
+               t = min(y, semi_mt->touches[other].y);
+               r = max(x, semi_mt->touches[other].x);
+               b = max(y, semi_mt->touches[other].y);
+       }
+
+       send_abs_xy(d, l, t);
+
+       litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
+       send_abs_mt_xy(d, l, t);
+
+       if (d->ntouches_down == 2) {
+               litest_event(d, EV_ABS, ABS_MT_SLOT, 1);
+               send_abs_mt_xy(d, r, b);
+       }
+
+       litest_event(d, EV_SYN, SYN_REPORT, 0);
+
+       semi_mt->touches[slot].x = x;
+       semi_mt->touches[slot].y = y;
+}
+
+void
+litest_semi_mt_touch_up(struct litest_device *d,
+                       struct litest_semi_mt *semi_mt,
+                       unsigned int slot)
+{
+       /* note: ntouches_down is decreased before we get here */
+       if (d->ntouches_down >= 2 || slot > 1)
+               return;
+
+       litest_event(d, EV_ABS, ABS_MT_SLOT, d->ntouches_down);
+       litest_event(d, EV_ABS, ABS_MT_TRACKING_ID, -1);
+
+       /* if we have one finger left, send x/y coords for that finger left.
+          this is likely to happen with a real touchpad */
+       if (d->ntouches_down == 1) {
+               int other = (slot + 1) % 2;
+               send_abs_xy(d, semi_mt->touches[other].x, semi_mt->touches[other].y);
+               litest_event(d, EV_ABS, ABS_MT_SLOT, 0);
+               send_abs_mt_xy(d, semi_mt->touches[other].x, semi_mt->touches[other].y);
+       }
+
+       litest_event(d, EV_SYN, SYN_REPORT, 0);
+}
index 31011a2..5ac1003 100644 (file)
@@ -180,6 +180,33 @@ void litest_timeout_buttonscroll(void);
 void litest_push_event_frame(struct litest_device *dev);
 void litest_pop_event_frame(struct litest_device *dev);
 
+/* this is a semi-mt device, so we keep track of the touches that the tests
+ * send and modify them so that the first touch is always slot 0 and sends
+ * the top-left of the bounding box, the second is always slot 1 and sends
+ * the bottom-right of the bounding box.
+ * Lifting any of two fingers terminates slot 1
+ */
+struct litest_semi_mt {
+       int tracking_id;
+       /* The actual touches requested by the test for the two slots
+        * in the 0..100 range used by litest */
+       struct {
+               double x, y;
+       } touches[2];
+};
+
+void litest_semi_mt_touch_down(struct litest_device *d,
+                              struct litest_semi_mt *semi_mt,
+                              unsigned int slot,
+                              double x, double y);
+void litest_semi_mt_touch_move(struct litest_device *d,
+                              struct litest_semi_mt *semi_mt,
+                              unsigned int slot,
+                              double x, double y);
+void litest_semi_mt_touch_up(struct litest_device *d,
+                            struct litest_semi_mt *semi_mt,
+                            unsigned int slot);
+
 #ifndef ck_assert_notnull
 #define ck_assert_notnull(ptr) ck_assert_ptr_ne(ptr, NULL)
 #endif