upload tizen2.0 source
[framework/uifw/xorg/lib/libxres.git] / src / XRes.c
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
17 static XExtensionInfo _xres_ext_info_data;
18 static XExtensionInfo *xres_ext_info = &_xres_ext_info_data;
19 static const char *xres_extension_name = XRES_NAME;
20
21 #define XResCheckExtension(dpy,i,val) \
22   XextCheckExtension (dpy, i, xres_extension_name, val)
23
24 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xres_ext_info)
25
26 static 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
40 static XEXT_GENERATE_FIND_DISPLAY (find_display, xres_ext_info,
41                                    xres_extension_name,
42                                    &xres_extension_hooks,
43                                    0, NULL)
44
45 Bool 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
62 Status 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
93 Status 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
143 Status 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
195 Status 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