[PATCH synaptics 13/17] Don't autoprobe for devices when Option Device is set.

Peter Hutterer peter.hutterer at who-t.net
Sun Mar 20 19:08:30 PDT 2011


If only Option Device is set but no protocol, the code calls into
AutoDevProbe. eventcomm (the only backend with an AutoDevProbe) then runs
through all /dev/input/event devices and takes the first one it can find.

If two touchpads are connected on a system, this may cause the same touchpad
to be added twice and the other one not at all - even though the device path
is specified. (This can only happen when the event device is not grabbed,
otherwise the grabcheck prevents the touchpad from being added twice)

Pass the device option into AutoDevProbe and check that device first. If it
is a touchpad, finish with success. If it isn't, fail AutoDevProbe.

Introduced in dce6006f6a851be4147e16731caa453dd0d1ec1c.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
CC: Alexandr Shadchin <alexandr.shadchin at gmail.com>
---
 src/eventcomm.c |   17 ++++++++++++++++-
 src/synaptics.c |    2 +-
 src/synproto.h  |    2 +-
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/eventcomm.c b/src/eventcomm.c
index 41dd669..d59efdc 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -504,7 +504,7 @@ EventReadDevDimensions(InputInfoPtr pInfo)
 }
 
 static Bool
-EventAutoDevProbe(InputInfoPtr pInfo)
+EventAutoDevProbe(InputInfoPtr pInfo, const char *device)
 {
     /* We are trying to find the right eventX device or fall back to
        the psaux protocol and the given device from XF86Config */
@@ -512,6 +512,21 @@ EventAutoDevProbe(InputInfoPtr pInfo)
     Bool touchpad_found = FALSE;
     struct dirent **namelist;
 
+    if (device) {
+	int fd = -1;
+	SYSCALL(fd = open(device, O_RDONLY));
+	if (fd >= 0)
+	{
+	    touchpad_found = event_query_is_touchpad(fd, TRUE);
+
+	    SYSCALL(close(fd));
+	    /* if a device is set and not a touchpad, we must return FALSE.
+	     * Otherwise, we'll add a device that wasn't requested for and
+	     * repeat f5687a6741a19ef3081e7fd83ac55f6df8bcd5c2. */
+	    return touchpad_found;
+	}
+    }
+
     i = scandir(DEV_INPUT_EVENT, &namelist, EventDevOnly, alphasort);
     if (i < 0) {
 		xf86Msg(X_ERROR, "Couldn't open %s\n", DEV_INPUT_EVENT);
diff --git a/src/synaptics.c b/src/synaptics.c
index 1233917..102a701 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -261,7 +261,7 @@ SetDeviceAndProtocol(InputInfoPtr pInfo)
     for (i = 0; protocols[i].name; i++) {
         if ((!device || !proto) &&
             protocols[i].proto_ops->AutoDevProbe &&
-            protocols[i].proto_ops->AutoDevProbe(pInfo))
+            protocols[i].proto_ops->AutoDevProbe(pInfo, device))
             break;
         else if (proto && !strcmp(proto, protocols[i].name))
             break;
diff --git a/src/synproto.h b/src/synproto.h
index 251dc84..75f90e4 100644
--- a/src/synproto.h
+++ b/src/synproto.h
@@ -75,7 +75,7 @@ struct SynapticsProtocolOperations {
     Bool (*QueryHardware)(InputInfoPtr pInfo);
     Bool (*ReadHwState)(InputInfoPtr pInfo,
 			struct CommData *comm, struct SynapticsHwState *hwRet);
-    Bool (*AutoDevProbe)(InputInfoPtr pInfo);
+    Bool (*AutoDevProbe)(InputInfoPtr pInfo, const char *device);
     void (*ReadDevDimensions)(InputInfoPtr pInfo);
 };
 
-- 
1.7.4



More information about the xorg-devel mailing list