aboutsummaryrefslogtreecommitdiff
path: root/src/evdev_brain.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-04-23 10:08:48 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-04-23 10:08:48 +0930
commitba65c34068a836ae393565a6a8260a4e96709816 (patch)
tree7bf959c46149514dc73a16f07c1cf54213df95a4 /src/evdev_brain.c
parentRemove direct call to DEVICE_INIT, ActivateDevice() takes care of that. (diff)
downloadxf86-input-evdev-ba65c34068a836ae393565a6a8260a4e96709816.tar.gz
xf86-input-evdev-ba65c34068a836ae393565a6a8260a4e96709816.tar.bz2
xf86-input-evdev-ba65c34068a836ae393565a6a8260a4e96709816.zip
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.
Diffstat (limited to 'src/evdev_brain.c')
-rw-r--r--src/evdev_brain.c62
1 files changed, 59 insertions, 3 deletions
diff --git a/src/evdev_brain.c b/src/evdev_brain.c
index d0d1ac6..03506c4 100644
--- a/src/evdev_brain.c
+++ b/src/evdev_brain.c
@@ -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);
+}
+