From 01fc6f81f0a2935741dd1114aa3fa267d8be9095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= Date: Wed, 15 Dec 2010 13:48:09 +0200 Subject: Implemented second part of XResource extension v1.2: XResQueryResourceBytes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Erkki Seppälä Reviewed-by: Rami Ylimäki Reviewed-by: Tiago Vignatti Signed-off-by: Alan Coopersmith --- include/X11/extensions/XRes.h | 32 ++++++++++++ src/XRes.c | 110 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 1 deletion(-) diff --git a/include/X11/extensions/XRes.h b/include/X11/extensions/XRes.h index b9759e3..1c81616 100644 --- a/include/X11/extensions/XRes.h +++ b/include/X11/extensions/XRes.h @@ -43,6 +43,24 @@ typedef struct { void *value; } XResClientIdValue; +typedef struct { + XID resource; + Atom type; +} XResResourceIdSpec; + +typedef struct { + XResResourceIdSpec spec; + long bytes; + long ref_count; + long use_count; +} XResResourceSizeSpec; + +typedef struct { + XResResourceSizeSpec size; + long num_cross_references; + XResResourceSizeSpec *cross_references; +} XResResourceSizeValue; + _XFUNCPROTOBEGIN /* v1.0 */ @@ -98,6 +116,20 @@ void XResClientIdsDestroy ( XResClientIdValue *client_ids ); +Status XResQueryResourceBytes ( + Display *dpy, + XID client, + long num_specs, + XResResourceIdSpec *resource_specs, /* in */ + long *num_sizes, /* out */ + XResResourceSizeValue **sizes /* out */ +); + +void XResResourceSizeValuesDestroy ( + long num_sizes, + XResResourceSizeValue *sizes +); + _XFUNCPROTOEND #endif /* _XRES_H */ diff --git a/src/XRes.c b/src/XRes.c index 0781666..1744196 100644 --- a/src/XRes.c +++ b/src/XRes.c @@ -237,7 +237,7 @@ static Bool ReadClientValues( int c; for (c = 0; c < num_ids; ++c) { XResClientIdValue* client = client_ids + c; - CARD32 value; + long int value; _XRead32 (dpy, &value, 4); client->spec.client = value; _XRead32 (dpy, &value, 4); @@ -344,3 +344,111 @@ pid_t XResGetClientPid( return (pid_t) -1; } } + +static Status ReadResourceSizeSpec( + Display *dpy, + XResResourceSizeSpec *size +) +{ + long int value; + _XRead32(dpy, &value, 4); + size->spec.resource = value; + _XRead32(dpy, &value, 4); + size->spec.type = value; + _XRead32(dpy, &value, 4); + size->bytes = value; + _XRead32(dpy, &value, 4); + size->ref_count = value; + _XRead32(dpy, &value, 4); + size->use_count = value; + return 0; +} + +static Status ReadResourceSizeValues( + Display *dpy, + long num_sizes, + XResResourceSizeValue *sizes) +{ + int c; + int d; + for (c = 0; c < num_sizes; ++c) { + long int num; + ReadResourceSizeSpec(dpy, &sizes[c].size); + _XRead32(dpy, &num, 4); + sizes[c].num_cross_references = num; + sizes[c].cross_references = num ? calloc(num, sizeof(*sizes[c].cross_references)) : NULL; + for (d = 0; d < num; ++d) { + ReadResourceSizeSpec(dpy, &sizes[c].cross_references[d]); + } + } + return Success; +} + +Status XResQueryResourceBytes ( + Display *dpy, + XID client, + long num_specs, + XResResourceIdSpec *resource_specs, /* in */ + long *num_sizes, /* out */ + XResResourceSizeValue **sizes /* out */ +) +{ + XExtDisplayInfo *info = find_display (dpy); + xXResQueryResourceBytesReq *req; + xXResQueryResourceBytesReply rep; + int c; + + *num_sizes = 0; + + XResCheckExtension (dpy, info, 0); + + LockDisplay (dpy); + GetReq (XResQueryResourceBytes, req); + req->reqType = info->codes->major_opcode; + req->XResReqType = X_XResQueryResourceBytes; + req->length += num_specs * 2; /* 2 longs per client id spec */ + req->client = client; + req->numSpecs = num_specs; + + for (c = 0; c < num_specs; ++c) { + Data32(dpy, &resource_specs[c].resource, 4); + Data32(dpy, &resource_specs[c].type, 4); + } + + *num_sizes = 0; + *sizes = NULL; + + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { + goto error; + } + + *sizes = calloc(rep.numSizes, sizeof(**sizes)); + *num_sizes = rep.numSizes; + + if (ReadResourceSizeValues(dpy, *num_sizes, *sizes) != Success) { + goto error; + } + + UnlockDisplay (dpy); + SyncHandle (); + return Success; + + error: + XResResourceSizeValuesDestroy(*num_sizes, *sizes); + + UnlockDisplay (dpy); + SyncHandle (); + return !Success; +} + +void XResResourceSizeValuesDestroy ( + long num_sizes, + XResResourceSizeValue *sizes +) +{ + int c; + for (c = 0; c < num_sizes; ++c) { + free(sizes[c].cross_references); + } + free(sizes); +} -- cgit v1.2.1