#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_LookupColor PRIV_LookupColor; struct priv_LookupColor { unsigned char *req; unsigned int *xrp; unsigned int *xgp; unsigned int *xbp; unsigned int *vrp; unsigned int *vgp; unsigned int *vbp; } ; static void done_LookupColor(LX_OP *op, const unsigned char *rep) { PRIV_LookupColor *p; p = op->reqpriv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"LookupColor response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } if (p->xrp) *p->xrp = r_card16(rep+8); if (p->xgp) *p->xgp = r_card16(rep+10); if (p->xbp) *p->xbp = r_card16(rep+12); if (p->vrp) *p->vrp = r_card16(rep+14); if (p->vgp) *p->vgp = r_card16(rep+16); if (p->vbp) *p->vbp = r_card16(rep+18); } while (0); op->reqpriv = 0; free(p->req); free(p); } static LX_OP *do_LookupColor( const char *call, LX_CONN *xc, LX_XID cmap, const char *name, int namelen, unsigned int *xrp, unsigned int *xgp, unsigned int *xbp, unsigned int *vrp, unsigned int *vgp, unsigned int *vbp ) { unsigned char *req; int reqlen; PRIV_LookupColor *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,call); return(0); } if (namelen == -1) namelen = strlen(name); if ((namelen < 0) || (namelen > 65535)) { lx__bad_call(xc,call); return(0); } reqlen = 3 + ((namelen + 3) >> 2); req = malloc(reqlen*4); if (! req) { lx__nomem_fail(xc); return(0); } p = malloc(sizeof(PRIV_LookupColor)); if (! p) { free(req); lx__nomem_fail(xc); return(0); } p->req = req; p->xrp = xrp; p->xgp = xgp; p->xbp = xbp; p->vrp = vrp; p->vgp = vgp; p->vbp = vbp; req[0] = XP_REQ_LookupColor; req[1] = 0; w_card16(req+2,reqlen); w_card32(req+4,cmap); w_card16(req+8,namelen); bcopy(name,req+16,namelen); return(lx__expect_reply(xc,req,reqlen,&done_LookupColor,p,0)); } LX_OP *lx_LookupColor( LX_CONN *xc, LX_XID cmap, const char *name, int namelen, unsigned int *xrp, unsigned int *xgp, unsigned int *xbp, unsigned int *vrp, unsigned int *vgp, unsigned int *vbp ) { return(do_LookupColor("lx_LookupColor",xc,cmap,name,namelen,xrp,xgp,xbp,vrp,vgp,vbp)); } LX_OP *lx_LookupColor_rgb(LX_CONN *xc, LX_XID cmap, const char *name, int namelen, LX_RGB *x, LX_RGB *v) { return(do_LookupColor("lx_LookupColor",xc,cmap,name,namelen,x?&x->r:0,x?&x->g:0,x?&x->b:0,v?&v->r:0,v?&v->g:0,v?&v->b:0)); }