diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-07-04 10:45:54 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-07-04 10:45:54 +1000 |
commit | 7e9fe80c24c6afb16a4428e942c07abed1d6c45e (patch) | |
tree | 992ff50e4a6b7cdb7866101e4a1aa4e1c5459085 | |
parent | c0125f85200c16b6fcd995a09b36080a98d3d0c5 (diff) |
Handle mtdev through the mtdev plumbing layerlibevdev
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | src/evdev.c | 68 |
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 |