#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); }