XRes.c revision 5bcb6992
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_base_return, 51 int *error_base_return 52) 53{ 54 XExtDisplayInfo *info = find_display (dpy); 55 56 if (XextHasExtension(info)) { 57 *event_base_return = info->codes->first_event; 58 *error_base_return = info->codes->first_error; 59 return True; 60 } else { 61 return False; 62 } 63} 64 65Status XResQueryVersion( 66 Display *dpy, 67 int *major_version_return, 68 int *minor_version_return 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_version_return = rep.server_major; 89 *minor_version_return = 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