[PATCH evdev 5/5] Disable axis faking and MT event processing on fake MT devices

Peter Hutterer peter.hutterer at who-t.net
Tue Mar 10 22:53:37 PDT 2015


This effectively disables all axes >= ABS_MT_SLOT on those devices. But at
least the device comes up without an error and it didn't work correctly
beforehand anyway.

https://bugs.freedesktop.org/show_bug.cgi?id=89473

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev.c | 15 +++++++++++++++
 src/evdev.h |  1 +
 2 files changed, 16 insertions(+)

diff --git a/src/evdev.c b/src/evdev.c
index 7ce7405..639e4a1 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -696,6 +696,9 @@ EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev)
         !libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_MT_SLOT))
         return;
 
+    if (pEvdev->fake_mt)
+        return;
+
     if (ev->code == ABS_MT_SLOT) {
         EvdevProcessTouch(pInfo);
         if (ev->value >= num_slots(pEvdev) ) {
@@ -1174,6 +1177,9 @@ EvdevAddFakeSingleTouchAxes(InputInfoPtr pInfo)
     int num_axes = 0;
     int i;
 
+    if (pEvdev->fake_mt)
+        return 0;
+
     /* Android drivers often have ABS_MT_POSITION_X but not ABS_X.
        Loop over the MT->legacy axis table and add fake axes. */
     for (i = 0; i < ArrayLength(mt_axis_mappings); i++)
@@ -1207,6 +1213,9 @@ EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total,
 {
     int axis;
 
+    if (pEvdev->fake_mt)
+        return;
+
     /* Absolute multitouch axes: adjust mapping and axes counts. */
     for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++)
     {
@@ -2199,6 +2208,10 @@ EvdevProbe(InputInfoPtr pInfo)
         }
     }
 
+    if (libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_MT_SLOT) &&
+        libevdev_get_num_slots(pEvdev->dev) == -1)
+        pEvdev->fake_mt = TRUE;
+
     if (ignore_abs && has_abs_axes)
     {
         xf86IDrvMsg(pInfo, X_INFO, "Absolute axes present but ignored.\n");
@@ -2220,6 +2233,8 @@ EvdevProbe(InputInfoPtr pInfo)
                     pEvdev->flags |= EVDEV_BUTTON_EVENTS;
                 }
             }
+            if (pEvdev->fake_mt)
+                xf86IDrvMsg(pInfo, X_PROBED, "Fake MT device detected\n");
         }
 
         if ((libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_X) &&
diff --git a/src/evdev.h b/src/evdev.h
index 4aa7652..0f71d78 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -161,6 +161,7 @@ typedef struct {
         enum SlotState state;
     } *slots;
     struct mtdev *mtdev;
+    BOOL fake_mt;
 
     int flags;
     int in_proximity;           /* device in proximity */
-- 
2.1.0



More information about the xorg-devel mailing list