[PATCH evdev] Add option TypeName (#62831)

Peter Hutterer peter.hutterer at who-t.net
Sun Apr 14 22:57:55 PDT 2013


evdev tries to assign the right XI 1.x type-name based on various device
capabilities. In some cases, that fails. e.g. the Mionix Naos 5000 mouse
looks like a keyboard. And we assign a keyboard type in that case since
there are plenty of keyboards that also advertise some axes or others.

Add a new option TypeName to allow for system-wide configuration of such
devices in a quirks file.

This can also be used to address #55867

X.Org Bug 62831 <http://bugs.freedesktop.org/show_bug.cgi?id=62831>

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 man/evdev.man |  6 ++++++
 src/evdev.c   | 13 +++++++++++++
 src/evdev.h   |  2 ++
 3 files changed, 21 insertions(+)

diff --git a/man/evdev.man b/man/evdev.man
index 2709d7a..220dd13 100644
--- a/man/evdev.man
+++ b/man/evdev.man
@@ -220,6 +220,12 @@ is mapped to the negative Y axis motion and button number
 .I N2
 is mapped to the positive Y axis motion.  Default: "4 5". Property:
 "Evdev Wheel Emulation Axes".
+.TP 7
+.BI "Option \*qTypeName\*q \*q"type"\*q
+Specify the X Input 1.x type (see XListInputDevices(__libmansuffix__)).
+There is rarely a need to use this option, evdev will guess the device type
+based on the device's capabilities. This option is provided for devices that
+need quirks.
 
 .SH SUPPORTED PROPERTIES
 The following properties are provided by the
diff --git a/src/evdev.c b/src/evdev.c
index 235db71..08c5384 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2554,6 +2554,9 @@ EvdevUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
         /* Release string allocated in EvdevOpenDevice. */
         free(pEvdev->device);
         pEvdev->device = NULL;
+
+        free(pEvdev->type_name);
+        pEvdev->type_name = NULL;
     }
     xf86DeleteInput(pInfo, flags);
 }
@@ -2585,6 +2588,8 @@ EvdevAlloc(void)
     pEvdev->rel_axis_map[0] = 0;
     pEvdev->rel_axis_map[1] = 1;
 
+    pEvdev->type_name = NULL;
+
     return pEvdev;
 }
 
@@ -2629,6 +2634,14 @@ EvdevPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
         goto error;
     }
 
+    /* Overwrite type_name with custom-defined one (#62831).
+       Note: pInfo->type_name isn't freed so we need to manually do this
+     */
+    pEvdev->type_name = xf86SetStrOption(pInfo->options,
+                                         "TypeName",
+                                         pInfo->type_name);
+    pInfo->type_name = pEvdev->type_name;
+
     EvdevAddDevice(pInfo);
 
     if (pEvdev->flags & EVDEV_BUTTON_EVENTS)
diff --git a/src/evdev.h b/src/evdev.h
index 63c3bfa..6ae389c 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -251,6 +251,8 @@ typedef struct {
     EventQueueRec           queue[EVDEV_MAXQUEUE];
 
     enum fkeymode           fkeymode;
+
+    char *type_name;
 } EvdevRec, *EvdevPtr;
 
 /* Event posting functions */
-- 
1.8.1.4



More information about the xorg-devel mailing list