Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep) { XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); if (RenderHasExtension(info)) { *event_basep = info->codes->first_event; *error_basep = info->codes->first_error; return True; } else { return False; } }
Status XRenderQueryVersion (Display *dpy, int *major_versionp, int *minor_versionp) { XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); XRenderInfo *xri; if (!RenderHasExtension (info)) return 0; if (!XRenderQueryFormats (dpy)) return 0; xri = info->info; *major_versionp = xri->major_version; *minor_versionp = xri->minor_version; return 1; }
XFilters * XRenderQueryFilters (Display *dpy, Drawable drawable) { XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); XRenderInfo *xri; xRenderQueryFiltersReq *req; xRenderQueryFiltersReply rep; XFilters *filters; char *name; char len; int i; long nbytes, nbytesAlias, nbytesName; if (!RenderHasExtension (info)) return NULL; if (!XRenderQueryFormats (dpy)) return NULL; xri = info->info; if (xri->minor_version < 6) return NULL; LockDisplay (dpy); GetReq (RenderQueryFilters, req); req->reqType = info->codes->major_opcode; req->renderReqType = X_RenderQueryFilters; req->drawable = drawable; if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { UnlockDisplay (dpy); SyncHandle (); return NULL; } /* * Compute total number of bytes for filter names */ nbytes = (long)rep.length << 2; nbytesAlias = rep.numAliases * 2; if (rep.numAliases & 1) nbytesAlias += 2; nbytesName = nbytes - nbytesAlias; /* * Allocate one giant block for the whole data structure */ filters = Xmalloc (sizeof (XFilters) + rep.numFilters * sizeof (char *) + rep.numAliases * sizeof (short) + nbytesName); if (!filters) { _XEatData (dpy, (unsigned long) rep.length << 2); UnlockDisplay (dpy); SyncHandle (); return NULL; } /* * Layout: * XFilters * numFilters char * pointers to filter names * numAliases short alias values * nbytesName char strings */ filters->nfilter = rep.numFilters; filters->nalias = rep.numAliases; filters->filter = (char **) (filters + 1); filters->alias = (short *) (filters->filter + rep.numFilters); name = (char *) (filters->alias + rep.numAliases); /* * Read the filter aliases */ _XRead16Pad (dpy, filters->alias, 2 * rep.numAliases); /* * Read the filter names */ for (i = 0; i < rep.numFilters; i++) { int l; _XRead (dpy, &len, 1); l = len & 0xff; filters->filter[i] = name; _XRead (dpy, name, l); name[l] = '\0'; name += l + 1; } i = name - (char *) (filters->alias + rep.numAliases); if (i & 3) _XEatData (dpy, 4 - (i & 3)); UnlockDisplay (dpy); SyncHandle (); return filters; }