#include #include "lx.h" #include "proto.h" #include "internal.h" LX_XID lx_CreateGC_va(LX_CONN *xc, LX_XID drawable, ...) { LX_XID gcid; 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[108]; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateGC_va"); return(LX_GC_None); } mask = 0; va_start(ap,drawable); 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_CreateGC_va"); \ return(LX_GC_None); \ } \ 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); gcid = lx__new_resource_id(xc); req[0] = XP_REQ_CreateGC; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],gcid); w_card32(&req[8],drawable); w_card32(&req[12],mask); o = 16; #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 w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); return(gcid); } LX_XID lx_CreateGC_attr(LX_CONN *xc, LX_XID drawable, unsigned int attrmask, const LX_GC_ATTRIBUTES *attr) { LX_XID gcid; int o; unsigned int protomask; unsigned char req[108]; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateGC_attr"); return(LX_GC_None); } gcid = lx__new_resource_id(xc); req[0] = XP_REQ_CreateGC; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],gcid); w_card32(&req[8],drawable); // req[12] through [15] filled in later o = 16; protomask = 0; #define SIMPLE(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ protomask |= bit; \ w_card32(&req[o],attr->field); \ o += 4; \ } #define MAPPED(name,converter,bit,field)\ if (attrmask & LX_GCM_##name) \ { int pv; \ attrmask &= ~LX_GCM_##name; \ protomask |= bit; \ pv = converter(attr->field); \ if (pv < 0) \ { lx__bad_call(xc,"lx_CreateGC_attr"); \ return(LX_GC_None); \ } \ w_card32(&req[o],pv); \ o += 4; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ protomask |= bit; \ w_card32(&req[o],lx__boolean_to_proto(attr->field)); \ o += 4; \ } #define CLIPMASK(name,type,suf,bit,field)\ if (attrmask & LX_GCM_##name) \ { attrmask &= ~LX_GCM_##name; \ protomask |= bit; \ w_card32(&req[o],(attr->field==LX_GCCLIPMASK_None)?0:attr->field);\ o += 4; \ } GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK if (attrmask) { lx__bad_call(xc,"lx_CreateGC_attr"); return(LX_WINDOW_None); } w_card16(&req[2],o>>2); w_card32(&req[12],protomask); lx__send_req(xc,&req[0],o); return(gcid); }