#include #include "lx.h" #include "proto.h" #include "internal.h" void lx_ChangeWindowAttributes(LX_CONN *xc, LX_XID window, ...) { va_list ap; int key; LX_XID arg_BackPixmap; unsigned int arg_BackPixel; LX_XID arg_BorderPixmap; unsigned int arg_BorderPixel; LX_XID arg_BitGravity; int proto_BitGravity; LX_XID arg_WinGravity; int proto_WinGravity; LX_XID arg_BackingStore; int proto_BackingStore; unsigned int arg_BackingPlanes; unsigned int arg_BackingPixel; int arg_OverrideRedirect; int arg_SaveUnder; unsigned int arg_EventMask; unsigned int arg_DontPropagate; LX_XID arg_Colormap; LX_XID arg_Cursor; unsigned int mask; int o; unsigned char req[92]; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateWindow"); return; } mask = 0; va_start(ap,window); while <"args"> (1) { key = va_arg(ap,int); #define SIMPLE(name,type,bit)\ case LX__CWV_##name: \ arg_##name = va_arg(ap,type); \ mask |= bit; \ break; #define BOOLEAN(name,bit)\ case LX__CWV_##name: \ arg_##name = lx__boolean_to_proto(va_arg(ap,int)); \ mask |= bit; \ break; #define MAPPED(name,mapper,bit)\ case LX__CWV_##name: \ arg_##name = va_arg(ap,unsigned long int); \ proto_##name = mapper(arg_##name); \ if (proto_##name < 0) \ { lx__bad_call(xc,"lx_CreateWindow"); \ return; \ } \ mask |= bit; \ break; switch (key) { case LX__CWV_BackPixmap: arg_BackPixmap = va_arg(ap,unsigned long int); switch (arg_BackPixmap) { case LX_PIXMAP_None: arg_BackPixmap = 0; break; case LX_PIXMAP_ParentRelative: arg_BackPixmap = 1; break; } mask |= 0x0001; break; SIMPLE(BackPixel,unsigned int,0x0002) case LX__CWV_BorderPixmap: arg_BorderPixmap = va_arg(ap,unsigned long int); if (arg_BorderPixmap == LX_PIXMAP_CopyFromParent) arg_BorderPixmap = 0; mask |= 0x0004; break; SIMPLE(BorderPixel,unsigned int,0x0008); MAPPED(BitGravity,lx__bitgravity_to_proto,0x0010); MAPPED(WinGravity,lx__wingravity_to_proto,0x0020); MAPPED(BackingStore,lx__backingstore_to_proto,0x0040); SIMPLE(BackingPlanes,unsigned int,0x0080); SIMPLE(BackingPixel,unsigned int,0x0100); BOOLEAN(OverrideRedirect,0x0200); BOOLEAN(SaveUnder,0x0400); SIMPLE(EventMask,unsigned int,0x0800); SIMPLE(DontPropagate,unsigned int,0x1000); case LX__CWV_Colormap: arg_Colormap = va_arg(ap,unsigned long int); if (arg_Colormap == LX_COLORMAP_CopyFromParent) arg_Colormap = 0; mask |= 0x2000; break; case LX__CWV_Cursor: arg_Cursor = va_arg(ap,unsigned long int); if (arg_Cursor == LX_CURSOR_None) arg_Cursor = 0; mask |= 0x4000; break; case LX__CWV_END: break <"args">; default: lx_abort(); break; } #undef SIMPLE #undef BOOLEAN #undef MAPPED } va_end(ap); req[0] = XP_REQ_ChangeWindowAttributes; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],window); w_card32(&req[8],mask); o = 12; #define FOO(bit,var) do { if (mask & (bit)) { mask &= ~(bit); w_card32(&req[o],(var)); o += 4; } } while (0) FOO(0x0001,arg_BackPixmap); FOO(0x0002,arg_BackPixel); FOO(0x0004,arg_BorderPixmap); FOO(0x0008,arg_BorderPixel); FOO(0x0010,proto_BitGravity); FOO(0x0020,proto_WinGravity); FOO(0x0040,proto_BackingStore); FOO(0x0080,arg_BackingPlanes); FOO(0x0100,arg_BackingPixel); FOO(0x0200,arg_OverrideRedirect); FOO(0x0400,arg_SaveUnder); FOO(0x0800,arg_EventMask); FOO(0x1000,arg_DontPropagate); FOO(0x2000,arg_Colormap); FOO(0x4000,arg_Cursor); #undef FOO w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); }