Mtdev is only usefull for protocol A devices (quite a few now). For all the others, it adds some memory and process which is not required as it just passes the events to the caller.
Signed-off-by: Benjamin Tissoires <[email protected]> --- src/evdev.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 1dccd34..ec38272 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -783,13 +783,19 @@ last_mt_vals_slot(EvdevPtr pEvdev) return value < num_slots(pEvdev) ? value : -1; } +static int +EvdevIsMTDevice(EvdevPtr pEvdev) +{ + return pEvdev->mtdev || EvdevBitIsSet(pEvdev->abs_bitmask, ABS_MT_SLOT); +} + static void EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev) { EvdevPtr pEvdev = pInfo->private; int map; - if (!pEvdev->mtdev) + if (!EvdevIsMTDevice(pEvdev)) return; if (ev->code == ABS_MT_SLOT) { @@ -1395,7 +1401,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) } #ifdef MULTITOUCH - if (pEvdev->mtdev && num_mt_axes_total > 0) + if (num_mt_axes_total > 0) { int num_touches = num_slots(pEvdev); int mode = pEvdev->flags & EVDEV_TOUCHPAD ? @@ -2335,7 +2341,8 @@ EvdevSetCalibration(InputInfoPtr pInfo, int num_calibration, int calibration[4]) #ifdef MULTITOUCH /** * Open an mtdev device for this device. mtdev is a bit too generous with - * memory usage, so only do so for devices with multitouch bits set. + * memory usage, so only do so for devices with multitouch bits using + * protocol A (without ABS_MT_SLOT axis). * * @return FALSE on error, TRUE if mtdev was initiated or the device doesn't * need it @@ -2380,6 +2387,19 @@ EvdevOpenMTDev(InputInfoPtr pInfo) !EvdevBitIsSet(abs_bitmask, ABS_MT_POSITION_Y)) return TRUE; + if (EvdevBitIsSet(abs_bitmask, ABS_MT_SLOT)) { + /* Use ioctl here too, this may still be called before EvdevCache */ + len = ioctl(pInfo->fd, EVIOCGABS(ABS_MT_SLOT), &pEvdev->absinfo[ABS_MT_SLOT]); + if (len < 0) { + xf86IDrvMsg(pInfo, X_ERROR, "ioctl EVIOCGABS(ABS_MT_SLOT) failed: %s\n", + strerror(errno)); + return FALSE; + } + pEvdev->cur_slot = pEvdev->absinfo[ABS_MT_SLOT].value; + xf86IDrvMsg(pInfo, X_INFO, "Ignoring mtdev for this device\n"); + return TRUE; + } + xf86IDrvMsg(pInfo, X_INFO, "Using mtdev for this device\n"); pEvdev->mtdev = mtdev_new_open(pInfo->fd); if (pEvdev->mtdev) -- 1.8.0.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
