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 <[email protected]> CC: Alexandr Shadchin <[email protected]> --- 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 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
