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