#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_LookupColor PRIV_LookupColor; struct priv_LookupColor { 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); } LX_OP *lx__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 reqhdr[12]; int reqlen; PRIV_LookupColor *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,call); return(0); } lx__nochain(xc); if (namelen == -1) namelen = strlen(name); if ((namelen < 0) || (namelen > 65535)) { lx__bad_call(xc,call); return(0); } reqlen = 3 + ((namelen + 3) >> 2); p = malloc(sizeof(PRIV_LookupColor)); if (! p) { lx__nomem_fail(xc); return(0); } p->xrp = xrp; p->xgp = xgp; p->xbp = xbp; p->vrp = vrp; p->vgp = vgp; p->vbp = vbp; reqhdr[0] = XP_REQ_LookupColor; reqhdr[1] = 0; w_card16(&reqhdr[2],reqlen); w_card32(&reqhdr[4],cmap); w_card16(&reqhdr[8],namelen); w_card16(&reqhdr[10],0); lx__just_send(xc,&reqhdr[0],12); lx__just_send(xc,name,namelen); lx__send_padding(xc,namelen); return(lx__expect_reply(xc,0,0,&done_LookupColor,p)); } 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(lx__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(lx__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)); }