#define NEED_REPLIES
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
int
XGetWindowProperty(
register Display *dpy,
Window w,
Atom property,
long offset,
long length,
Bool delete,
Atom req_type,
Atom *actual_type,
int *actual_format,
unsigned long *nitems,
unsigned long *bytesafter,
unsigned char **prop)
{
xGetPropertyReply reply;
register xGetPropertyReq *req;
xError error;
LockDisplay(dpy);
GetReq (GetProperty, req);
req->window = w;
req->property = property;
req->type = req_type;
req->delete = delete;
req->longOffset = offset;
req->longLength = length;
error.sequenceNumber = dpy->request;
if (!_XReply (dpy, (xReply *) &reply, 0, xFalse)) {
UnlockDisplay(dpy);
SyncHandle();
return (1);
}
*prop = (unsigned char *) NULL;
if (reply.propertyType != None) {
long nbytes, netbytes;
switch (reply.format) {
case 8:
nbytes = netbytes = reply.nItems;
if (nbytes + 1 > 0 &&
(*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
_XReadPad (dpy, (char *) *prop, netbytes);
break;
case 16:
nbytes = reply.nItems * sizeof (short);
netbytes = reply.nItems << 1;
if (nbytes + 1 > 0 &&
(*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
_XRead16Pad (dpy, (short *) *prop, netbytes);
break;
case 32:
nbytes = reply.nItems * sizeof (long);
netbytes = reply.nItems << 2;
if (nbytes + 1 > 0 &&
(*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
_XRead32 (dpy, (long *) *prop, netbytes);
break;
default:
{
error.type = X_Error;
error.majorCode = X_GetProperty;
error.minorCode = 0;
error.errorCode = BadImplementation;
_XError(dpy, &error);
}
nbytes = netbytes = 0L;
break;
}
if (! *prop) {
_XEatData(dpy, (unsigned long) netbytes);
UnlockDisplay(dpy);
SyncHandle();
return(BadAlloc);
}
(*prop)[nbytes] = '\0';
}
*actual_type = reply.propertyType;
*actual_format = reply.format;
*nitems = reply.nItems;
*bytesafter = reply.bytesAfter;
UnlockDisplay(dpy);
SyncHandle();
return(Success);
}