summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-07-04 10:45:54 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-07-04 10:45:54 +1000
commit7e9fe80c24c6afb16a4428e942c07abed1d6c45e (patch)
tree992ff50e4a6b7cdb7866101e4a1aa4e1c5459085
parentc0125f85200c16b6fcd995a09b36080a98d3d0c5 (diff)
Handle mtdev through the mtdev plumbing layerlibevdev
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/evdev.c68
1 files changed, 30 insertions, 38 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 0ad816b..97e45a4 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -54,6 +54,9 @@
#include <evdev-properties.h>
#include <xserver-properties.h>
+#include <mtdev-plumbing.h>
+
+
#ifndef XI_PROP_PRODUCT_ID
#define XI_PROP_PRODUCT_ID "Device Product ID"
#endif
@@ -1087,6 +1090,27 @@ EvdevFreeMasks(EvdevPtr pEvdev)
/* just a magic number to reduce the number of reads */
#define NUM_EVENTS 16
+/* mtdev's normal API doesn't like being handed events instead of reading
+ them off the fd directly. So we use the plumbing layer and essentially
+ re-implement mtdev_get() here.
+ read until the next SYN_REPORT, then fetch all events one-by-one and pass
+ them to EvdevProcessEvent.
+ */
+static void
+EvdevHandleMTDevEvent(InputInfoPtr pInfo, struct input_event *ev)
+{
+ EvdevPtr pEvdev = pInfo->private;
+
+ mtdev_put_event(pEvdev->mtdev, ev);
+ if (libevdev_is_event_code(ev, EV_SYN, SYN_REPORT)) {
+ while (!mtdev_empty(pEvdev->mtdev)) {
+ struct input_event e;
+ mtdev_get_event(pEvdev->mtdev, &e);
+ EvdevProcessEvent(pInfo, &e);
+ }
+ }
+}
+
static void
EvdevReadInput(InputInfoPtr pInfo)
{
@@ -1103,8 +1127,12 @@ EvdevReadInput(InputInfoPtr pInfo)
LogMessageVerbSigSafe(X_ERROR, 0, "%s: Read error: %s\n", pInfo->name,
strerror(-rc));
break;
- } else if (rc == 0)
- EvdevProcessEvent(pInfo, &ev);
+ } else if (rc == 0) {
+ if (pEvdev->mtdev)
+ EvdevHandleMTDevEvent(pInfo, &ev);
+ else
+ EvdevProcessEvent(pInfo, &ev);
+ }
else {
/* SYN_DROPPED, need to sync properly */
while (rc == 1) {
@@ -1113,42 +1141,6 @@ EvdevReadInput(InputInfoPtr pInfo)
}
}
} while (rc == 0);
-
- /* FIXME: mtdev doesn't work with the current libevdev api */
-#if 0
- while (len == sizeof(ev))
- {
-#ifdef MULTITOUCH
- EvdevPtr pEvdev = pInfo->private;
-
- if (pEvdev->mtdev)
- len = mtdev_get(pEvdev->mtdev, pInfo->fd, ev, NUM_EVENTS) *
- sizeof(struct input_event);
- else
-#endif
- len = read(pInfo->fd, &ev, sizeof(ev));
-
- if (len <= 0)
- {
- if (errno == ENODEV) /* May happen after resume */
- xf86RemoveEnabledDevice(pInfo);
- else if (errno != EAGAIN)
- LogMessageVerbSigSafe(X_ERROR, 0, "%s: Read error: %s\n", pInfo->name,
- strerror(errno));
- break;
- }
-
- /* The kernel promises that we always only read a complete
- * event, so len != sizeof ev is an error. */
- if (len % sizeof(ev[0])) {
- LogMessageVerbSigSafe(X_ERROR, 0, "%s: Read error: %s\n", pInfo->name, strerror(errno));
- break;
- }
-
- for (i = 0; i < len/sizeof(ev[0]); i++)
- EvdevProcessEvent(pInfo, &ev[i]);
- }
-#endif
}
static void