2 Copyright (c) 2002 XFree86 Inc
9 #include <X11/Xlibint.h>
10 #include <X11/Xutil.h>
11 #include <X11/extensions/Xext.h>
12 #include <X11/extensions/extutil.h>
13 #include <X11/extensions/XResproto.h>
14 #include <X11/extensions/XRes.h>
17 #ifndef HAVE__XEATDATAWORDS
18 static inline void _XEatDataWords(Display *dpy, unsigned long n)
21 if (n >= (ULONG_MAX >> 2))
24 _XEatData (dpy, n << 2);
28 static XExtensionInfo _xres_ext_info_data;
29 static XExtensionInfo *xres_ext_info = &_xres_ext_info_data;
30 static const char *xres_extension_name = XRES_NAME;
32 #define XResCheckExtension(dpy,i,val) \
33 XextCheckExtension (dpy, i, xres_extension_name, val)
35 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xres_ext_info)
37 static XExtensionHooks xres_extension_hooks = {
42 NULL, /* create_font */
44 close_display, /* close_display */
45 NULL, /* wire_to_event */
46 NULL, /* event_to_wire */
48 NULL, /* error_string */
51 static XEXT_GENERATE_FIND_DISPLAY (find_display, xres_ext_info,
53 &xres_extension_hooks,
56 Bool XResQueryExtension (
58 int *event_base_return,
59 int *error_base_return
62 XExtDisplayInfo *info = find_display (dpy);
64 if (XextHasExtension(info)) {
65 *event_base_return = info->codes->first_event;
66 *error_base_return = info->codes->first_error;
73 Status XResQueryVersion(
75 int *major_version_return,
76 int *minor_version_return
79 XExtDisplayInfo *info = find_display (dpy);
80 xXResQueryVersionReply rep;
81 xXResQueryVersionReq *req;
83 XResCheckExtension (dpy, info, 0);
86 GetReq (XResQueryVersion, req);
87 req->reqType = info->codes->major_opcode;
88 req->XResReqType = X_XResQueryVersion;
89 req->client_major = XRES_MAJOR_VERSION;
90 req->client_minor = XRES_MINOR_VERSION;
91 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
96 *major_version_return = rep.server_major;
97 *minor_version_return = rep.server_minor;
104 Status XResQueryClients (
110 XExtDisplayInfo *info = find_display (dpy);
111 xXResQueryClientsReq *req;
112 xXResQueryClientsReply rep;
119 XResCheckExtension (dpy, info, 0);
122 GetReq (XResQueryClients, req);
123 req->reqType = info->codes->major_opcode;
124 req->XResReqType = X_XResQueryClients;
125 if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
131 if(rep.num_clients) {
132 if (rep.num_clients < (INT_MAX / sizeof(XResClient)))
133 clnts = Xmalloc(sizeof(XResClient) * rep.num_clients);
141 for(i = 0; i < rep.num_clients; i++) {
142 _XRead(dpy, (char*)&scratch, sz_xXResClient);
143 clnts[i].resource_base = scratch.resource_base;
144 clnts[i].resource_mask = scratch.resource_mask;
147 *num_clients = rep.num_clients;
150 _XEatDataWords(dpy, rep.length);
159 Status XResQueryClientResources (
166 XExtDisplayInfo *info = find_display (dpy);
167 xXResQueryClientResourcesReq *req;
168 xXResQueryClientResourcesReply rep;
175 XResCheckExtension (dpy, info, 0);
178 GetReq (XResQueryClientResources, req);
179 req->reqType = info->codes->major_opcode;
180 req->XResReqType = X_XResQueryClientResources;
182 if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
189 if (rep.num_types < (INT_MAX / sizeof(XResType)))
190 typs = Xmalloc(sizeof(XResType) * rep.num_types);
198 for(i = 0; i < rep.num_types; i++) {
199 _XRead(dpy, (char*)&scratch, sz_xXResType);
200 typs[i].resource_type = scratch.resource_type;
201 typs[i].count = scratch.count;
204 *num_types = rep.num_types;
207 _XEatDataWords(dpy, rep.length);
216 Status XResQueryClientPixmapBytes (
222 XExtDisplayInfo *info = find_display (dpy);
223 xXResQueryClientPixmapBytesReq *req;
224 xXResQueryClientPixmapBytesReply rep;
228 XResCheckExtension (dpy, info, 0);
231 GetReq (XResQueryClientPixmapBytes, req);
232 req->reqType = info->codes->major_opcode;
233 req->XResReqType = X_XResQueryClientPixmapBytes;
235 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
242 *bytes = (rep.bytes_overflow * 4294967295) + rep.bytes;
244 *bytes = rep.bytes_overflow ? 0xffffffff : rep.bytes;