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:
parent
56efbc0986
commit
669f6810af
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue
Block a user