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