[PATCH 6/6] xserver: input device id counter fix
Peter Hutterer
mailinglists at who-t.net
Wed Mar 28 19:01:19 PDT 2007
On 29/03/2007, at 07:42 , Magnus Vigerlöf wrote:
> Input device id counter fix
>
> Change of the id calculaton for every new attached input device. The
> first available id is now used and the device count is now decreased
> when one is removed.
>
> --
> dix/devices.c | 23 +++++++++++++++++++----
> 1 files changed, 19 insertions(+), 4 deletions(-)
>
> --
> diff --git a/dix/devices.c b/dix/devices.c
> index f622be7..6536c4b 100644
> --- a/dix/devices.c
> +++ b/dix/devices.c
> @@ -82,20 +82,32 @@ #include "exevents.h"
> int CoreDevicePrivatesIndex = 0;
> static int CoreDevicePrivatesGeneration = -1;
>
> +/* Array of pointers to the current devices for simple calculation
> + * of the next free device id. */
> +static DeviceIntPtr *inputDeviceArrayId = NULL;
> +
> DeviceIntPtr
> AddInputDevice(DeviceProc deviceProc, Bool autoStart)
> {
> DeviceIntPtr dev, *prev; /* not a typo */
> + int devid;
>
> - if (inputInfo.numDevices >= MAX_DEVICES)
> + if (!inputDeviceArrayId)
> + inputDeviceArrayId = xnfcalloc(sizeof(DeviceIntPtr), MAX_DEVICES);
> + /* find out the next available id */
> + for (devid = 0; devid < MAX_DEVICES; devid++)
> + if (!inputDeviceArrayId[devid])
> + break;
> + if (devid == MAX_DEVICES)
> return (DeviceIntPtr)NULL;
> dev = (DeviceIntPtr) xcalloc(sizeof(DeviceIntRec), 1);
> if (!dev)
> return (DeviceIntPtr)NULL;
> + inputInfo.numDevices++;
> + inputDeviceArrayId[devid] = dev;
> dev->name = (char *)NULL;
> dev->type = 0;
> - dev->id = inputInfo.numDevices;
> - inputInfo.numDevices++;
> + dev->id = devid;
> dev->public.on = FALSE;
> dev->public.processInputProc = (ProcessInputProc)NoopDDA;
> dev->public.realInputProc = (ProcessInputProc)NoopDDA;
> @@ -565,8 +577,11 @@ RemoveDevice(DeviceIntPtr dev)
> ret = Success;
> }
> }
> -
> +
> if (ret == Success) {
> + inputInfo.numDevices--;
> + inputDeviceArrayId[dev->id] = NULL;
> +
> ev.type = DevicePresenceNotify;
> ev.time = currentTime.milliseconds;
> ev.devchange = 0;
if you keep the inputInfo.devices list sorted, you won't need the
inputDeviceArray and we don't have to worry about keeping the array
synchronised with the list.
Cheers,
Peter
--
Multi-Pointer X Server
http://wearables.unisa.edu.au/mpx
More information about the xorg
mailing list