#include #include "lx.h" #include "proto.h" #include "internal.h" void lx_ChangeGC_va(LX_CONN *xc, LX_XID gc, ...) { va_list ap; int key; #define SIMPLE(name,type,suf,bit,field)\ type arg_##name; #define MAPPED(name,converter,bit,field)\ LX_XID arg_##name; \ int proto_##name; #define GRAPHICSEXPOSURES(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK unsigned int mask; int o; unsigned char req[104]; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ChangeGC_va"); return; } mask = 0; va_start(ap,gc); while <"args"> (1) { key = va_arg(ap,int); #define SIMPLE(name,type,suf,bit,field)\ case LX__GCV_##name: \ arg_##name = va_arg(ap,type); \ mask |= bit; \ break; #define MAPPED(name,converter,bit,field)\ case LX__GCV_##name: \ arg_##name = va_arg(ap,unsigned long int); \ proto_##name = converter(arg_##name); \ if (proto_##name < 0) \ { lx__bad_call(xc,"lx_ChangeGC_va"); \ return; \ } \ mask |= bit; \ break; #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ case LX__GCV_##name: \ arg_##name = lx__boolean_to_proto(va_arg(ap,type)); \ mask |= bit; \ break; #define CLIPMASK(name,type,suf,bit,field)\ case LX__GCV_##name: \ arg_##name = va_arg(ap,type); \ if (arg_##name == LX_GCCLIPMASK_None) arg_##name = 0; \ mask |= bit; \ break; switch (key) { GCFIELDS case LX__GCV_END: break <"args">; default: lx_abort(); break; } #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK } va_end(ap); req[0] = XP_REQ_ChangeGC; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],gc); w_card32(&req[8],mask); o = 12; #define SIMPLE(name,type,suf,bit,field)\ if (mask & bit) { mask &= ~bit; w_card32(&req[o],arg_##name); o += 4; } #define MAPPED(name,converter,bit,field)\ if (mask & bit) { mask &= ~bit; w_card32(&req[o],proto_##name); o += 4; } #define GRAPHICSEXPOSURES(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK // XXX update GC shdadow, if any w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); } void lx_ChangeGC_attr(LX_CONN *xc, LX_XID gc, unsigned int attrmask, const LX_GC_ATTRIBUTES *attr) { int o; unsigned int protomask; unsigned char req[104]; int v; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ChangeGC_attr"); return; } req[0] = XP_REQ_ChangeGC; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],gc); // req[8] through [11] filled in later o = 12; protomask = 0; #define SIMPLE(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ w_card32(&req[o],attr->field); \ o += 4; \ protomask |= bit; \ } #define MAPPED(name,converter,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ v = converter(attr->field); \ if (v < 0) \ { lx__bad_call(xc,"lx_ChangeGC_attr"); \ return; \ } \ w_card32(&req[o],v); \ o += 4; \ protomask |= bit; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ w_card32(&req[o],lx__boolean_to_proto(attr->field)); \ o += 4; \ protomask |= bit; \ } #define CLIPMASK(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ w_card32(&req[o],(attr->field==LX_GCCLIPMASK_None)?0:attr->field);\ o += 4; \ protomask |= bit; \ } GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK w_card16(&req[2],o>>2); w_card32(&req[8],protomask); lx__send_req(xc,&req[0],o); }