// Copyright status: this file is in the public domain. #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; unsigned char opc; 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); } if (sgc->gcid == LX_GC_None) { opc = XP_REQ_CreateGC; o = 16; rqp = &req.cre[0]; } else { opc = XP_REQ_ChangeGC; o = 12; rqp = &req.chg[0]; } maskp = &rqp[o-4]; protomask = 0; #define SIMPLE(name,type,suf,bit,field)\ if (sgc->set & LX_GCM_##name) \ { sgc->set &= ~LX_GCM_##name; \ if (sgc->setv.field != sgc->pushv.field) \ { sgc->pushv.field = sgc->setv.field; \ protomask |= bit; \ w_card32(&rqp[o],sgc->pushv.field); \ o += 4; \ } \ } #define MAPPED(name,converter,bit,field)\ if (sgc->set & LX_GCM_##name) \ { int v; \ sgc->set &= ~LX_GCM_##name; \ if (sgc->setv.field != sgc->pushv.field) \ { v = converter(sgc->setv.field); \ if (v < 0) \ { lx_abort(); \ return(LX_GC_None); \ } \ sgc->pushv.field = sgc->setv.field; \ protomask |= bit; \ 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; \ if (sgc->setv.field != sgc->pushv.field) \ { sgc->pushv.field = sgc->setv.field; \ protomask |= bit; \ w_card32(&rqp[o],(sgc->setv.field==LX_GCCLIPMASK_None)?0:sgc->setv.field);\ o += 4; \ } \ } GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK if (protomask || (opc == XP_REQ_CreateGC)) { lx__nochain(xc); switch (opc) { case XP_REQ_CreateGC: sgc->gcid = lx__new_resource_id(xc); w_card32(&rqp[8],sgc->drawable); break; case XP_REQ_ChangeGC: break; default: lx_abort(); return(LX_XID_Error); break; } rqp[0] = opc; rqp[1] = 0; w_card16(&rqp[2],o>>2); w_card32(&rqp[4],sgc->gcid); w_card32(maskp,protomask); lx__send_req(xc,rqp,o); } return(sgc->gcid); }