Xi: add XIPropToInt() auxiliary function.

Converts an XIPropertyValuePtr to an integer, provided that type and format is
right.

Code originally written by Simon Thum.

Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
This commit is contained in:
Peter Hutterer 2008-11-19 15:50:57 +10:00 committed by Peter Hutterer
parent 56efbc0986
commit 669f6810af
2 changed files with 74 additions and 0 deletions

View File

@ -32,6 +32,7 @@
#include "dix.h"
#include "inputstr.h"
#include <X11/extensions/XI.h>
#include <X11/Xatom.h>
#include <X11/extensions/XIproto.h>
#include "exglobals.h"
#include "exevents.h"
@ -70,6 +71,73 @@ XIGetKnownProperty(char *name)
return 0;
}
/**
* Convert the given property's value(s) into @nelem_return integer values and
* store them in @buf_return. If @nelem_return is larger than the number of
* values in the property, @nelem_return is set to the number of values in the
* property.
*
* If *@buf_return is NULL and @nelem_return is 0, memory is allocated
* automatically and must be freed by the caller.
*
* Possible return codes.
* Success ... No error.
* BadMatch ... Wrong atom type, atom is not XA_INTEGER
* BadAlloc ... NULL passed as buffer and allocation failed.
* BadLength ... @buff is NULL but @nelem_return is non-zero.
*
* @param val The property value
* @param nelem_return The maximum number of elements to return.
* @param buf_return Pointer to an array of at least @nelem_return values.
* @return Success or the error code if an error occured.
*/
_X_EXPORT int
XIPropToInt(XIPropertyValuePtr val, int *nelem_return, int **buf_return)
{
int i;
int *buf;
if (val->type != XA_INTEGER)
return BadMatch;
if (!*buf_return && *nelem_return)
return BadLength;
switch(val->format)
{
case 8:
case 16:
case 32:
break;
default:
return BadValue;
}
buf = *buf_return;
if (!buf && !(*nelem_return))
{
buf = xcalloc(val->size, sizeof(int));
if (!buf)
return BadAlloc;
*buf_return = buf;
*nelem_return = val->size;
} else if (val->size < *nelem_return)
*nelem_return = val->size;
for (i = 0; i < val->size && i < *nelem_return; i++)
{
switch(val->format)
{
case 8: buf[i] = ((CARD8*)val->data)[i]; break;
case 16: buf[i] = ((CARD16*)val->data)[i]; break;
case 32: buf[i] = ((CARD32*)val->data)[i]; break;
}
}
return Success;
}
/**
* Init those properties that are allocated by the server and most likely used
* by the DIX or the DDX.

View File

@ -251,4 +251,10 @@ extern _X_EXPORT Atom XIGetKnownProperty(
extern _X_EXPORT DeviceIntPtr XIGetDevice(xEvent *ev);
extern _X_EXPORT int XIPropToInt(
XIPropertyValuePtr val,
int *nelem_return,
int **buf_return
);
#endif /* EXEVENTS_H */