#include "lx.h" #include "proto.h" #include "internal.h" LX_XID lx_SGC_GC(LX_CONN *xc, LX_SGC sgcid) { SGC *sgc; union { unsigned char cre[108]; unsigned char chg[104]; } req; unsigned int protomask; int o; unsigned char *rqp; unsigned char *maskp; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_SGC_GC"); return(LX_GC_None); } sgc = lx__lookup_sgc(xc,sgcid); if (! sgc) { lx__bad_call(xc,"lx_SGC_GC"); return(LX_GC_None); } sgc->unk &= ~sgc->set; if (sgc->gcid == LX_GC_None) { sgc->gcid = lx__new_resource_id(xc); req.cre[0] = XP_REQ_CreateGC; req.cre[1] = 0; // req.cre[2] and [3] filled in later w_card32(&req.cre[4],sgc->gcid); w_card32(&req.cre[8],sgc->drawable); // req.cre[12] through [15] filled in later o = 16; rqp = &req.cre[0]; } else if (sgc->set) { req.chg[0] = XP_REQ_ChangeGC; req.chg[1] = 0; // req.chg[2] and [3] filled in later w_card32(&req.chg[4],sgc->gcid); // req.chg[8] through [11] filled in later o = 12; rqp = &req.chg[0]; } else { return(sgc->gcid); } protomask = 0; maskp = &rqp[o-4]; #define SIMPLE(name,type,suf,bit,field)\ if (sgc->set & LX_GCM_##name) \ { sgc->set &= ~LX_GCM_##name; \ protomask |= bit; \ w_card32(&rqp[o],sgc->shadow.field); \ o += 4; \ } #define MAPPED(name,converter,bit,field)\ if (sgc->set & LX_GCM_##name) \ { int v; \ sgc->set &= ~LX_GCM_##name; \ protomask |= bit; \ v = converter(sgc->shadow.field); \ if (v < 0) \ { lx_abort(); \ return(LX_GC_None); \ } \ w_card32(&rqp[o],v); \ o += 4; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field); #define CLIPMASK(name,type,suf,bit,field)\ if (sgc->set & LX_GCM_##name) \ { sgc->set &= ~LX_GCM_##name; \ protomask |= bit; \ w_card32(&rqp[o],(sgc->shadow.field==LX_GCCLIPMASK_None)?0:sgc->shadow.field);\ o += 4; \ } GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK w_card16(&rqp[2],o>>2); w_card32(maskp,protomask); lx__send_req(xc,rqp,o); return(sgc->gcid); }