summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErkki Seppälä <erkki.seppala@vincit.fi>2010-12-15 13:48:09 +0200
committerAlan Coopersmith <alan.coopersmith@oracle.com>2012-04-23 19:04:43 -0700
commit01fc6f81f0a2935741dd1114aa3fa267d8be9095 (patch)
tree00d8e5de8332f367058e503ec24f8e1ea0566f48
parent0f38938a27df1f865dcdda35f4d2ef191092ba42 (diff)
downloadxorg-lib-libXRes-01fc6f81f0a2935741dd1114aa3fa267d8be9095.tar.gz
Implemented second part of XResource extension v1.2: XResQueryResourceBytes
Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi> Reviewed-by: Rami Ylimäki <rami.ylimaki@vincit.fi> Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com> Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r--include/X11/extensions/XRes.h32
-rw-r--r--src/XRes.c110
2 files changed, 141 insertions, 1 deletions
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);
+}