XRes.c revision 47e89262
1/*
2   Copyright (c) 2002  XFree86 Inc
3*/
4
5#ifdef HAVE_CONFIG_H
6#include <config.h>
7#endif
8#include <stdlib.h>
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>
15
16
17static XExtensionInfo _xres_ext_info_data;
18static XExtensionInfo *xres_ext_info = &_xres_ext_info_data;
19static char *xres_extension_name = XRES_NAME;
20
21#define XResCheckExtension(dpy,i,val) \
22  XextCheckExtension (dpy, i, xres_extension_name, val)
23
24static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xres_ext_info)
25
26static XExtensionHooks xres_extension_hooks = {
27    NULL,                               /* create_gc */
28    NULL,                               /* copy_gc */
29    NULL,                               /* flush_gc */
30    NULL,                               /* free_gc */
31    NULL,                               /* create_font */
32    NULL,                               /* free_font */
33    close_display,                      /* close_display */
34    NULL,                               /* wire_to_event */
35    NULL,                               /* event_to_wire */
36    NULL,                               /* error */
37    NULL,                               /* error_string */
38};
39
40static XEXT_GENERATE_FIND_DISPLAY (find_display, xres_ext_info,
41                                   xres_extension_name,
42                                   &xres_extension_hooks,
43                                   0, NULL)
44
45Bool XResQueryExtension (
46    Display *dpy,
47    int *event_base_return,
48    int *error_base_return
49)
50{
51    XExtDisplayInfo *info = find_display (dpy);
52
53    if (XextHasExtension(info)) {
54        *event_base_return = info->codes->first_event;
55        *error_base_return = info->codes->first_error;
56        return True;
57    } else {
58        return False;
59    }
60}
61
62Status XResQueryVersion(
63    Display *dpy,
64    int *major_version_return,
65    int *minor_version_return
66)
67{
68    XExtDisplayInfo *info = find_display (dpy);
69    xXResQueryVersionReply rep;
70    xXResQueryVersionReq *req;
71
72    XResCheckExtension (dpy, info, 0);
73
74    LockDisplay (dpy);
75    GetReq (XResQueryVersion, req);
76    req->reqType = info->codes->major_opcode;
77    req->XResReqType = X_XResQueryVersion;
78    req->client_major = XRES_MAJOR_VERSION;
79    req->client_minor = XRES_MINOR_VERSION;
80    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
81        UnlockDisplay (dpy);
82        SyncHandle ();
83        return 0;
84    }
85    *major_version_return = rep.server_major;
86    *minor_version_return = rep.server_minor;
87    UnlockDisplay (dpy);
88    SyncHandle ();
89    return 1;
90}
91
92
93Status XResQueryClients (
94    Display *dpy,
95    int *num_clients,
96    XResClient **clients
97)
98{
99    XExtDisplayInfo *info = find_display (dpy);
100    xXResQueryClientsReq *req;
101    xXResQueryClientsReply rep;
102    XResClient *clnts;
103    int result = 0;
104
105    *num_clients = 0;
106    *clients = NULL;
107
108    XResCheckExtension (dpy, info, 0);
109
110    LockDisplay (dpy);
111    GetReq (XResQueryClients, req);
112    req->reqType = info->codes->major_opcode;
113    req->XResReqType = X_XResQueryClients;
114    if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
115        UnlockDisplay (dpy);
116        SyncHandle ();
117        return 0;
118    }
119
120    if(rep.num_clients) {
121        if((clnts = Xmalloc(sizeof(XResClient) * rep.num_clients))) {
122            xXResClient scratch;
123            int i;
124
125            for(i = 0; i < rep.num_clients; i++) {
126                _XRead(dpy, (char*)&scratch, sz_xXResClient);
127                clnts[i].resource_base = scratch.resource_base;
128                clnts[i].resource_mask = scratch.resource_mask;
129            }
130            *clients = clnts;
131            *num_clients = rep.num_clients;
132            result = 1;
133        } else {
134            _XEatData(dpy, rep.length << 2);
135        }
136    }
137
138    UnlockDisplay (dpy);
139    SyncHandle ();
140    return result;
141}
142
143Status XResQueryClientResources (
144    Display *dpy,
145    XID xid,
146    int *num_types,
147    XResType **types
148)
149{
150    XExtDisplayInfo *info = find_display (dpy);
151    xXResQueryClientResourcesReq *req;
152    xXResQueryClientResourcesReply rep;
153    XResType *typs;
154    int result = 0;
155
156    *num_types = 0;
157    *types = NULL;
158
159    XResCheckExtension (dpy, info, 0);
160
161    LockDisplay (dpy);
162    GetReq (XResQueryClientResources, req);
163    req->reqType = info->codes->major_opcode;
164    req->XResReqType = X_XResQueryClientResources;
165    req->xid = xid;
166    if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
167        UnlockDisplay (dpy);
168        SyncHandle ();
169        return 0;
170    }
171
172    if(rep.num_types) {
173        if((typs = Xmalloc(sizeof(XResType) * rep.num_types))) {
174            xXResType scratch;
175            int i;
176
177            for(i = 0; i < rep.num_types; i++) {
178                _XRead(dpy, (char*)&scratch, sz_xXResType);
179                typs[i].resource_type = scratch.resource_type;
180                typs[i].count = scratch.count;
181            }
182            *types = typs;
183            *num_types = rep.num_types;
184            result = 1;
185        } else {
186            _XEatData(dpy, rep.length << 2);
187        }
188    }
189
190    UnlockDisplay (dpy);
191    SyncHandle ();
192    return result;
193}
194
195Status XResQueryClientPixmapBytes (
196    Display *dpy,
197    XID xid,
198    unsigned long *bytes
199)
200{
201    XExtDisplayInfo *info = find_display (dpy);
202    xXResQueryClientPixmapBytesReq *req;
203    xXResQueryClientPixmapBytesReply rep;
204
205    *bytes = 0;
206
207    XResCheckExtension (dpy, info, 0);
208
209    LockDisplay (dpy);
210    GetReq (XResQueryClientPixmapBytes, req);
211    req->reqType = info->codes->major_opcode;
212    req->XResReqType = X_XResQueryClientPixmapBytes;
213    req->xid = xid;
214    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
215        UnlockDisplay (dpy);
216        SyncHandle ();
217        return 0;
218    }
219
220#ifdef LONG64
221    *bytes = (rep.bytes_overflow * 4294967295) + rep.bytes;
222#else
223    *bytes = rep.bytes_overflow ? 0xffffffff : rep.bytes;
224#endif
225
226    UnlockDisplay (dpy);
227    SyncHandle ();
228    return 1;
229}
230
231