#include #include "lx.h" #include "proto.h" #include "internal.h" LX_XID lx_CreateWindow( LX_CONN *xc, LX_XID parent, int x, int y, unsigned int w, unsigned int h, unsigned int bw, int depth, LX_WINDOW_CLASS class, LX_XID visual, ... ) { LX_XID wid; va_list ap; int v; 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) || (x < -32768) || (x > 32767) || (y < -32768) || (y > 32767) || (w > 65535) || (h > 65535) || (bw > 65535) ) { lx__bad_call(xc,"lx_CreateWindow"); return(LX_WINDOW_None); } mask = 0; va_start(ap,visual); 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(LX_WINDOW_None); \ } \ 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); wid = lx__new_resource_id(xc); req[0] = XP_REQ_CreateWindow; req[1] = depth; // req[2] and [3] filled in later w_card32(&req[4],wid); w_card32(&req[8],parent); w_int16(&req[12],x); w_int16(&req[14],y); w_card16(&req[16],w); w_card16(&req[18],h); w_card16(&req[20],bw); v = lx__wclass_to_proto(class); if (v < 0) { lx__bad_call(xc,"lx_CreateWindow"); return(LX_WINDOW_None); } w_card16(&req[22],v); if (visual == LX_VISUAL_CopyFromParent) visual = 0; w_card32(&req[24],visual); w_card32(&req[28],mask); o = 32; #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); return(wid); }