Remove driver from list if no device is associated any more.

This effectively stops the driver from hotplugging new devices. Devices have
to be added with the dbus hotplugging events.
master
Peter Hutterer 19 years ago
parent 9644a4afbf
commit ba65c34068
  1. 8
      src/evdev.c
  2. 2
      src/evdev.h
  3. 62
      src/evdev_brain.c

@ -461,6 +461,14 @@ EvdevCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
if (pEvdev->devices && pEvdev->devices->pInfo)
return pEvdev->devices->pInfo;
/* In some cases pEvdev->devices is NULL, but on the next
* evdevRescanDevices the device suddenly appears. If we return NULL here,
* the server will clean up and the sudden appearance of the device will
* segfault. We need to remove the driver from the list to avoid this.
* No. I don't know why it just appears. (whot)
*/
evdevRemoveDriver(pEvdev);
return NULL;
}

@ -256,6 +256,8 @@ Bool evdevStart (InputDriverPtr drv);
Bool evdevNewDriver (evdevDriverPtr driver);
Bool evdevGetBits (int fd, evdevBitsPtr bits);
void evdevRemoveDevice (evdevDevicePtr device);
void evdevDeleteDevice (evdevDevicePtr device);
void evdevRemoveDriver (evdevDriverPtr device);
int EvdevBtnInit (DeviceIntPtr device);
int EvdevBtnOn (DeviceIntPtr device);

@ -555,16 +555,24 @@ evdevNewDriver (evdevDriverPtr driver)
void
evdevRemoveDevice (evdevDevicePtr pEvdev)
{
evdevDriverPtr driver;
evdevDriverPtr driver, prev;
evdevDevicePtr *device;
for (driver = evdev_drivers; driver; driver = driver->next) {
prev = evdev_drivers;
for (driver = evdev_drivers; driver; prev = driver, driver = driver->next) {
for (device = &driver->devices; *device; device = &(*device)->next) {
if (*device == pEvdev) {
*device = pEvdev->next;
xf86DeleteInput(pEvdev->pInfo, 0);
pEvdev->next = NULL;
/* driver without device? get rid of it, otherwise it'll
* auto-hotplug when a device is plugged in again.
*/
if (!driver->devices)
{
evdevDeleteDevice(pEvdev);
evdevRemoveDriver(driver);
}
return;
}
}
@ -600,3 +608,51 @@ evdevGetBits (int fd, evdevBitsPtr bits)
return TRUE;
}
/**
* Free memory associated with device.
*/
void
evdevDeleteDevice(evdevDevicePtr pEvdev)
{
/* pEvdev->pInp is freed in xf86DeleteInput() when
* DeleteInputDeviceRequest is called. */
xfree(pEvdev->name);
xfree(pEvdev->phys);
xfree(pEvdev->device);
xfree(pEvdev);
}
/**
* Remove a driver from the list, free memory.
*/
void evdevRemoveDriver(evdevDriverPtr drv)
{
evdevDriverPtr driver, prev;
evdevDevicePtr device;
if (drv == evdev_drivers)
evdev_drivers = evdev_drivers->next;
else
for (prev = evdev_drivers, driver = prev->next; driver;
prev = driver, driver = driver->next)
{
if (driver == drv)
{
prev->next = driver->next;
}
}
xfree(drv->name);
xfree(drv->phys);
xfree(drv->device);
device = drv->devices;
while(device)
{
evdevDeleteDevice(device);
device = device->next;
}
xfree(drv);
}

Loading…
Cancel
Save