On Sun, Mar 20, 2011 at 9:08 PM, Peter Hutterer <[email protected]> wrote: > 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.
I think I've stared at this enough to understand most of it. If double adds were happening before I think its important not just that its a touchpad but that its a touchpad that hasn't been previously grabbed (for 2 touchpad case). If so, that might be nice to add in comment somewhere. Reviewed-by: Chris Bagwell <[email protected]> > > 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 > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
