mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-04-14 11:44:16 +00:00
Try harder to make unplugging work.
This commit is contained in:
38
src/evdev.c
38
src/evdev.c
@@ -116,10 +116,8 @@ EvdevReadInput(InputInfoPtr pInfo)
|
||||
* event, so len != sizeof ev is an error. */
|
||||
xf86Msg(X_ERROR, "Read error: %s (%d, %d != %ld)\n",
|
||||
strerror(errno), errno, len, sizeof (ev));
|
||||
if (len < 0) {
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
EvdevProc(pEvdev->pInfo->dev, DEVICE_OFF);
|
||||
}
|
||||
if (len < 0)
|
||||
EvdevProc(pInfo->dev, DEVICE_CLOSE);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -275,13 +273,13 @@ InputInfoPtr
|
||||
EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
{
|
||||
InputInfoPtr pInfo;
|
||||
evdevDevicePtr device;
|
||||
evdevDevicePtr pEvdev;
|
||||
|
||||
if (!(pInfo = xf86AllocateInput(drv, 0)))
|
||||
return NULL;
|
||||
|
||||
device = Xcalloc (sizeof (evdevDeviceRec));
|
||||
if (!device) {
|
||||
pEvdev = Xcalloc (sizeof (evdevDeviceRec));
|
||||
if (!pEvdev) {
|
||||
pInfo->private = NULL;
|
||||
xf86DeleteInput (pInfo, 0);
|
||||
return NULL;
|
||||
@@ -299,36 +297,36 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
#endif
|
||||
pInfo->conf_idev = dev;
|
||||
|
||||
pInfo->private = device;
|
||||
pInfo->private = pEvdev;
|
||||
|
||||
device->device = xf86CheckStrOption(dev->commonOptions, "Device", NULL);
|
||||
pEvdev->device = xf86CheckStrOption(dev->commonOptions, "Device", NULL);
|
||||
|
||||
xf86CollectInputOptions(pInfo, NULL, NULL);
|
||||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||
|
||||
SYSCALL(pInfo->fd = open (device->device, O_RDWR | O_NONBLOCK));
|
||||
SYSCALL(pInfo->fd = open (pEvdev->device, O_RDWR | O_NONBLOCK));
|
||||
if (pInfo->fd == -1) {
|
||||
xf86Msg(X_ERROR, "%s: cannot open input device\n", pInfo->name);
|
||||
xf86Msg(X_ERROR, "%s: cannot open input pEvdev\n", pInfo->name);
|
||||
pInfo->private = NULL;
|
||||
xfree(device);
|
||||
xfree(pEvdev);
|
||||
xf86DeleteInput (pInfo, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!evdevGetBits (pInfo->fd, &device->bits)) {
|
||||
if (!evdevGetBits (pInfo->fd, &pEvdev->bits)) {
|
||||
xf86Msg(X_ERROR, "%s: cannot load bits\n", pInfo->name);
|
||||
pInfo->private = NULL;
|
||||
close (pInfo->fd);
|
||||
xfree(device);
|
||||
xfree(pEvdev);
|
||||
xf86DeleteInput (pInfo, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ioctl(pInfo->fd, EVIOCGRAB, (void *)1)) {
|
||||
xf86Msg(X_INFO, "%s: Unable to grab device (%s). Cowardly refusing to check use as keyboard.\n", pInfo->name, strerror(errno));
|
||||
device->state.can_grab = 0;
|
||||
xf86Msg(X_INFO, "%s: Unable to grab pEvdev (%s). Cowardly refusing to check use as keyboard.\n", pInfo->name, strerror(errno));
|
||||
pEvdev->state.can_grab = 0;
|
||||
} else {
|
||||
device->state.can_grab = 1;
|
||||
pEvdev->state.can_grab = 1;
|
||||
ioctl(pInfo->fd, EVIOCGRAB, (void *)0);
|
||||
}
|
||||
|
||||
@@ -340,7 +338,7 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
EvdevAxesNew1 (pInfo);
|
||||
EvdevBtnNew1 (pInfo);
|
||||
|
||||
if (device->state.can_grab)
|
||||
if (pEvdev->state.can_grab)
|
||||
EvdevKeyNew (pInfo);
|
||||
|
||||
close (pInfo->fd);
|
||||
@@ -348,10 +346,10 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
|
||||
pInfo->flags |= XI86_OPEN_ON_INIT;
|
||||
if (!(pInfo->flags & XI86_CONFIGURED)) {
|
||||
xf86Msg(X_ERROR, "%s: Don't know how to use device.\n", pInfo->name);
|
||||
xf86Msg(X_ERROR, "%s: Don't know how to use pEvdev.\n", pInfo->name);
|
||||
pInfo->private = NULL;
|
||||
close (pInfo->fd);
|
||||
xfree(device);
|
||||
xfree(pEvdev);
|
||||
xf86DeleteInput (pInfo, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -170,8 +170,6 @@ typedef struct _evdevState {
|
||||
typedef struct _evdevDevice {
|
||||
const char *device;
|
||||
|
||||
InputInfoPtr pInfo;
|
||||
|
||||
evdevBitsRec bits;
|
||||
|
||||
evdevStateRec state;
|
||||
|
||||
Reference in New Issue
Block a user