// Copyright status: this file is in the public domain. #include #include "lx.h" #include "proto.h" #include "internal.h" LX_SGC lx_CreateSGC_va(LX_CONN *xc, LX_XID drawable, ...) { SGC *sgc; va_list ap; int key; int pv; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateSGC_va"); return(LX_SGC_None); } sgc = lx__new_sgc(xc); if (! sgc) { lx__nomem_fail(xc); return(LX_SGC_None); } sgc->drawable = drawable; va_start(ap,drawable); while <"args"> (1) { key = va_arg(ap,int); #define SIMPLE(name,type,suf,bit,field)\ case LX__GCV_##name: \ { type arg; \ arg = va_arg(ap,type); \ sgc->setv.field = arg; \ sgc->set |= LX_GCM_##name; \ break; \ } #define MAPPED(name,converter,bit,field)\ case LX__GCV_##name: \ { unsigned long int v; \ v = va_arg(ap,unsigned long int); \ pv = converter(v); \ if (pv < 0) \ { lx__bad_call(xc,"lx_CreateGC_va"); \ lx__free_sgc(xc,sgc); \ return(LX_SGC_None); \ } \ sgc->setv.field = v; \ sgc->set |= LX_GCM_##name; \ break; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ case LX__GCV_##name: \ { type arg; \ arg = lx__boolean_to_proto(va_arg(ap,type)); \ sgc->setv.field = arg; \ sgc->set |= LX_GCM_##name; \ break; \ } #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) switch (key) { GCFIELDS case LX__GCV_END: break <"args">; default: lx_abort(); break; } #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK } va_end(ap); return(sgc->sgcid); } LX_SGC lx_CreateSGC_attr(LX_CONN *xc, LX_XID drawable, unsigned int mask, const LX_GC_ATTRIBUTES *attr) { SGC *sgc; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateSGC_attr"); return(LX_SGC_None); } sgc = lx__new_sgc(xc); if (! sgc) { lx__nomem_fail(xc); return(LX_SGC_None); } sgc->drawable = drawable; #define SIMPLE(name,type,suf,bit,field)\ if (mask & LX_GCM_##name) \ { mask &= ~LX_GCM_##name; \ sgc->setv.field = attr->field; \ sgc->set |= LX_GCM_##name; \ } #define MAPPED(name,converter,bit,field)\ if (mask & LX_GCM_##name) \ { mask &= ~LX_GCM_##name; \ if (converter(attr->field) < 0) \ { lx__bad_call(xc,"lx_CreateGC_attr"); \ lx__free_sgc(xc,sgc); \ return(LX_SGC_None); \ } \ sgc->setv.field = attr->field; \ sgc->set |= LX_GCM_##name; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ if (mask & LX_GCM_##name) \ { int v; \ v = lx__boolean_to_proto(attr->field); \ mask &= ~LX_GCM_##name; \ sgc->setv.field = v; \ sgc->set |= LX_GCM_##name; \ } #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK return(sgc->sgcid); }