[PATCH evdev 3/3 v4] Dummy process of MT events (protocol A).
Benjamin Tissoires
tissoire at cena.fr
Thu Jun 10 08:48:00 PDT 2010
The MT-protocol A is the one that sends SYN_MT_REPORT. It is opposed to
the new one based on MT_SLOTS (protocol B).
(see kernel_src/Documentation/input/multi-touch-protocol.txt)
The processing is "dummy" since there is no computation while receiving
mt events: it just stores it at the first available place, i.e. it does
not override older mt values. This is valid as this protocol forces the
device to send all the values at each frame.
Signed-off-by: Benjamin Tissoires <tissoire at cena.fr>
---
src/evdev.c | 42 +++++++++++++++++++++++++++++++++++++++---
src/evdev.h | 1 +
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/src/evdev.c b/src/evdev.c
index 30e9d4b..07f9d07 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -417,6 +417,8 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
*/
else if (pEvdev->abs && pEvdev->tool) {
memcpy(v, pEvdev->vals, sizeof(int) * pEvdev->num_vals);
+ if (pEvdev->mt_current_touchpoint > pEvdev->mt_max_touchpoints)
+ pEvdev->mt_current_touchpoint = pEvdev->mt_max_touchpoints;
if (pEvdev->swap_axes) {
int tmp = v[0];
@@ -443,7 +445,8 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
v[1] = (pEvdev->absinfo[ABS_Y].maximum - v[1] +
pEvdev->absinfo[ABS_Y].minimum);
- *num_v = pEvdev->num_vals;
+ *num_v = pEvdev->num_vals - (pEvdev->mt_max_touchpoints -
+ pEvdev->mt_current_touchpoint) * pEvdev->mt_num_valuators;
*first_v = 0;
}
}
@@ -523,6 +526,12 @@ EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
}
}
+static inline BOOL
+EvdevIsMTEvent(struct input_event *ev)
+{
+ return ev->code >= EVDEV_FIRST_MT_AXIS && ev->code <= EVDEV_LAST_MT_AXIS;
+}
+
/**
* Take the absolute motion input event and process it accordingly.
*/
@@ -545,7 +554,15 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
if (EvdevWheelEmuFilterMotion(pInfo, ev))
return;
- pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
+ if (!EvdevIsMTEvent(ev))
+ pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
+ else if (pEvdev->mt_current_touchpoint < pEvdev->mt_max_touchpoints) {
+ /* MT value -> store it at the first available place */
+ pEvdev->vals[pEvdev->axis_map[ev->code] +
+ pEvdev->mt_current_touchpoint * pEvdev->mt_num_valuators] = value;
+ } else
+ return; /* mt-event, but not enough place to store it */
+
if (ev->code == ABS_X)
pEvdev->abs |= ABS_X_VALUE;
else if (ev->code == ABS_Y)
@@ -687,6 +704,22 @@ EvdevProcessSyncEvent(InputInfoPtr pInfo, struct input_event *ev)
pEvdev->num_queue = 0;
pEvdev->abs = 0;
pEvdev->rel = 0;
+ pEvdev->mt_current_touchpoint = 0;
+}
+
+/**
+ * Process the event SYN_MT_REPORT.
+ *
+ * This event is required only in the mt-protocol A (the oldest one). This
+ * protocol now handles devices that do not support touchpoint tracking, so
+ * the processing consists in incrementing mt_current_touchpoint to be able
+ * to place the next mt-event after this one in the list of valuators.
+ */
+static void
+EvdevProcessMTSyncReport(InputInfoPtr pInfo, struct input_event *ev)
+{
+ EvdevPtr pEvdev = pInfo->private;
+ pEvdev->mt_current_touchpoint++;
}
/**
@@ -707,7 +740,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
EvdevProcessKeyEvent(pInfo, ev);
break;
case EV_SYN:
- EvdevProcessSyncEvent(pInfo, ev);
+ if (ev->code == SYN_MT_REPORT)
+ EvdevProcessMTSyncReport(pInfo, ev);
+ else
+ EvdevProcessSyncEvent(pInfo, ev);
break;
}
}
diff --git a/src/evdev.h b/src/evdev.h
index 7f9fc47..25c63a7 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -197,6 +197,7 @@ typedef struct {
unsigned int mt_num_valuators;
unsigned int mt_max_touchpoints; /* the number of simultaneous touchpoints
* the device can support */
+ unsigned int mt_current_touchpoint;
} EvdevRec, *EvdevPtr;
/* Event posting functions */
--
1.7.0.1
More information about the xorg-devel
mailing list