dix: factor out the duplicate the RemoveDevice code paths
This is the same loop twice, once over inputInfo.devices and once over inputInfo.off_devices, let's make both the same.
This commit is contained in:
parent
e44e9262df
commit
0a9f223eec
|
@ -1134,6 +1134,26 @@ UndisplayDevices(void)
|
|||
screen->DisplayCursor(dev, screen, NullCursor);
|
||||
}
|
||||
|
||||
static int
|
||||
CloseOneDevice(const DeviceIntPtr dev, DeviceIntPtr *listHead)
|
||||
{
|
||||
DeviceIntPtr tmp, next, prev = NULL;
|
||||
|
||||
for (tmp = *listHead; tmp; (prev = tmp), (tmp = next)) {
|
||||
next = tmp->next;
|
||||
if (tmp == dev) {
|
||||
if (prev == NULL)
|
||||
*listHead = next;
|
||||
else
|
||||
prev->next = next;
|
||||
|
||||
CloseDevice(tmp);
|
||||
return Success;
|
||||
}
|
||||
}
|
||||
return BadMatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a device from the device list, closes it and thus frees all
|
||||
* resources.
|
||||
|
@ -1150,12 +1170,12 @@ UndisplayDevices(void)
|
|||
int
|
||||
RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
|
||||
{
|
||||
DeviceIntPtr prev, tmp, next;
|
||||
int ret = BadMatch;
|
||||
ScreenPtr screen = screenInfo.screens[0];
|
||||
int deviceid;
|
||||
int initialized;
|
||||
int flags[MAXDEVICES] = { 0 };
|
||||
int flag;
|
||||
|
||||
DebugF("(dix) removing device %d\n", dev->id);
|
||||
|
||||
|
@ -1173,41 +1193,13 @@ RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
|
|||
flags[dev->id] = XIDeviceDisabled;
|
||||
}
|
||||
|
||||
flag = IsMaster(dev) ? XIMasterRemoved : XISlaveRemoved;
|
||||
|
||||
input_lock();
|
||||
|
||||
prev = NULL;
|
||||
for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
|
||||
next = tmp->next;
|
||||
if (tmp == dev) {
|
||||
|
||||
if (prev == NULL)
|
||||
inputInfo.devices = next;
|
||||
else
|
||||
prev->next = next;
|
||||
|
||||
flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
|
||||
CloseDevice(tmp);
|
||||
ret = Success;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
prev = NULL;
|
||||
for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
|
||||
next = tmp->next;
|
||||
if (tmp == dev) {
|
||||
flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
|
||||
CloseDevice(tmp);
|
||||
|
||||
if (prev == NULL)
|
||||
inputInfo.off_devices = next;
|
||||
else
|
||||
prev->next = next;
|
||||
|
||||
ret = Success;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((ret = CloseOneDevice(dev, &inputInfo.devices)) == Success ||
|
||||
(ret = CloseOneDevice(dev, &inputInfo.off_devices)) == Success)
|
||||
flags[deviceid] = flag;
|
||||
|
||||
input_unlock();
|
||||
|
||||
|
|
Loading…
Reference in New Issue