From 4f05f9591e5492c72f3856bd7a2ff13378f59f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:57:48 +0300 Subject: [PATCH] Input: Always add devices with first available ID Scan the device list when adding a new device, and make sure we can use the first available ID, instead of always incrementing. --- dix/devices.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 004cb13fc..c2d4f22a5 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -86,15 +86,27 @@ DeviceIntPtr AddInputDevice(DeviceProc deviceProc, Bool autoStart) { DeviceIntPtr dev, *prev; /* not a typo */ + DeviceIntPtr devtmp; + int devid; + char devind[MAX_DEVICES]; - if (inputInfo.numDevices >= MAX_DEVICES) + /* Find next available id */ + memset(devind, 0, sizeof(char)*MAX_DEVICES); + for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devid = 0; devid < MAX_DEVICES && devind[devid]; devid++) + ; + + if (devid >= MAX_DEVICES) return (DeviceIntPtr)NULL; dev = (DeviceIntPtr) xcalloc(sizeof(DeviceIntRec), 1); if (!dev) return (DeviceIntPtr)NULL; dev->name = (char *)NULL; dev->type = 0; - dev->id = inputInfo.numDevices; + dev->id = devid; inputInfo.numDevices++; dev->public.on = FALSE; dev->public.processInputProc = (ProcessInputProc)NoopDDA; @@ -572,6 +584,7 @@ RemoveDevice(DeviceIntPtr dev) } if (ret == Success) { + inputInfo.numDevices--; ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; ev.devchange = 0;