Signed-off-by: Hans de Goede <hdego...@redhat.com> --- src/eventcomm.c | 10 ++++++++-- src/synaptics.c | 30 +++++++++++++++++++++--------- src/synproto.h | 4 ++++ 3 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/src/eventcomm.c b/src/eventcomm.c index a0a2af0..49a8a3f 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -942,7 +942,11 @@ EventAutoDevProbe(InputInfoPtr pInfo, const char *device) if (device) { int fd = -1; - SYSCALL(fd = open(device, O_RDONLY)); + if (pInfo->flags & XI86_SERVER_FD) + fd = pInfo->fd; + else + SYSCALL(fd = open(device, O_RDONLY)); + if (fd >= 0) { int rc; struct libevdev *evdev; @@ -953,7 +957,9 @@ EventAutoDevProbe(InputInfoPtr pInfo, const char *device) libevdev_free(evdev); } - SYSCALL(close(fd)); + if (!(pInfo->flags & XI86_SERVER_FD)) + SYSCALL(close(fd)); + /* if a device is set and not a touchpad (or already grabbed), * we must return FALSE. Otherwise, we'll add a device that * wasn't requested for and repeat diff --git a/src/synaptics.c b/src/synaptics.c index f778d39..6df50e6 100644 --- a/src/synaptics.c +++ b/src/synaptics.c @@ -184,6 +184,10 @@ InputDriverRec SYNAPTICS = { SynapticsPreInit, SynapticsUnInit, NULL, + NULL, +#ifdef XI86_DRV_CAP_SERVER_FD + XI86_DRV_CAP_SERVER_FD +#endif }; static XF86ModuleVersionInfo VersionRec = { @@ -898,14 +902,16 @@ SynapticsPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) XisbFree(priv->comm.buffer); priv->comm.buffer = NULL; } - xf86CloseSerial(pInfo->fd); + if (!(pInfo->flags & XI86_SERVER_FD)) { + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; + } } - pInfo->fd = -1; return Success; SetupProc_fail: - if (pInfo->fd >= 0) { + if (pInfo->fd >= 0 && !(pInfo->flags & XI86_SERVER_FD)) { xf86CloseSerial(pInfo->fd); pInfo->fd = -1; } @@ -996,8 +1002,10 @@ DeviceOn(DeviceIntPtr dev) priv->comm.buffer = XisbNew(pInfo->fd, INPUT_BUFFER_SIZE); if (!priv->comm.buffer) { - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; + if (!(pInfo->flags & XI86_SERVER_FD)) { + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; + } return !Success; } @@ -1007,8 +1015,10 @@ DeviceOn(DeviceIntPtr dev) if (!QueryHardware(pInfo)) { XisbFree(priv->comm.buffer); priv->comm.buffer = NULL; - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; + if (!(pInfo->flags & XI86_SERVER_FD)) { + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; + } return !Success; } @@ -1074,8 +1084,10 @@ DeviceOff(DeviceIntPtr dev) XisbFree(priv->comm.buffer); priv->comm.buffer = NULL; } - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; + if (!(pInfo->flags & XI86_SERVER_FD)) { + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; + } } dev->public.on = FALSE; return rc; diff --git a/src/synproto.h b/src/synproto.h index f164393..d81ee42 100644 --- a/src/synproto.h +++ b/src/synproto.h @@ -36,6 +36,10 @@ #include <xf86Xinput.h> #include <xisb.h> +#ifndef XI86_SERVER_FD +#define XI86_SERVER_FD 0x20 +#endif + struct _SynapticsPrivateRec; typedef struct _SynapticsPrivateRec SynapticsPrivate; -- 1.8.4.2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel