[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