#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct args ARGS; struct args { const char *call; 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; unsigned int mask; LX_XID BackPixmap; unsigned int BackPixel; LX_XID BorderPixmap; unsigned int BorderPixel; LX_GRAVITY BitGravity; LX_GRAVITY WinGravity; LX_BACKINGSTORE BackingStore; unsigned int BackingPlanes; unsigned int BackingPixel; int OverrideRedirect; int SaveUnder; unsigned int EventMask; unsigned int DontPropagate; LX_XID Colormap; LX_XID Cursor; } ; static LX_XID do_CreateWindow(LX_CONN *xc, ARGS *a) { LX_XID wid; int o; unsigned char req[92]; int proto_BitGravity; int proto_WinGravity; int proto_BackingStore; int proto_wclass; do <"badcall"> { if ( (a->x < -32768) || (a->x > 32767) || (a->y < -32768) || (a->y > 32767) || (a->w > 65535) || (a->h > 65535) || (a->bw > 65535) || ((a->mask & 0x0800) && (a->EventMask & EVM_EVENT_MBZ)) || ((a->mask & 0x1000) && (a->DontPropagate & EVM_DEVICEEVENT_MBZ)) ) break <"badcall">; if (a->mask & 0x0010) { proto_BitGravity = lx__bitgravity_to_proto(a->BitGravity); if (proto_BitGravity < 0) break <"badcall">; } if (a->mask & 0x0020) { proto_WinGravity = lx__wingravity_to_proto(a->WinGravity); if (proto_WinGravity < 0) break <"badcall">; } if (a->mask & 0x0040) { proto_BackingStore = lx__backingstore_to_proto(a->BackingStore); if (proto_BackingStore < 0) break <"badcall">; } proto_wclass = lx__wclass_to_proto(a->class); if (proto_wclass < 0) break <"badcall">; if (a->visual == LX_VISUAL_CopyFromParent) a->visual = 0; wid = lx__new_resource_id(xc); req[0] = XP_REQ_CreateWindow; req[1] = a->depth; // req[2] and [3] filled in later w_card32(&req[4],wid); w_card32(&req[8],a->parent); w_int16(&req[12],a->x); w_int16(&req[14],a->y); w_card16(&req[16],a->w); w_card16(&req[18],a->h); w_card16(&req[20],a->bw); w_card16(&req[22],proto_wclass); w_card32(&req[24],a->visual); w_card32(&req[28],a->mask); if (a->mask & 0x0001) { switch (a->BackPixmap) { case LX_PIXMAP_None: a->BackPixmap = 0; case LX_PIXMAP_ParentRelative: a->BackPixmap = 1; } } if ((a->mask & 0x0004) && (a->BorderPixmap == LX_PIXMAP_CopyFromParent)) a->BorderPixmap = 0; if ((a->mask & 0x2000) && (a->Colormap == LX_COLORMAP_CopyFromParent)) a->Colormap = 0; if ((a->mask & 0x4000) && (a->Cursor == LX_COLORMAP_None)) a->Cursor = 0; o = 32; #define FOO(bit,val) do { if (a->mask & (bit)) { w_card32(&req[o],(val)); o += 4; } } while (0) FOO(0x0001,a->BackPixmap); FOO(0x0002,a->BackPixel); FOO(0x0004,a->BorderPixmap); FOO(0x0008,a->BorderPixel); FOO(0x0010,proto_BitGravity); FOO(0x0020,proto_WinGravity); FOO(0x0040,proto_BackingStore); FOO(0x0080,a->BackingPlanes); FOO(0x0100,a->BackingPixel); FOO(0x0200,a->OverrideRedirect?1:0); FOO(0x0400,a->SaveUnder?1:0); FOO(0x0800,a->EventMask); FOO(0x1000,a->DontPropagate); FOO(0x2000,a->Colormap); FOO(0x4000,a->Cursor); #undef FOO w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); return(wid); } while (0); lx__bad_call(xc,a->call); return(LX_WINDOW_None); } LX_XID lx_CreateWindow_va( 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, ... ) { int key; ARGS a; va_list ap; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateWindow_va"); return(LX_WINDOW_None); } a.call = "lx_CreateWindow_va"; a.parent = parent; a.x = x; a.y = y; a.w = w; a.h = h; a.bw = bw; a.depth = depth; a.class = class; a.visual = visual; a.mask = 0; va_start(ap,visual); while <"args"> (1) { key = va_arg(ap,int); #define ARG(name,type,bit)\ case LX__CWV_##name: \ a.name = va_arg(ap,type); \ a.mask |= bit; \ break; switch (key) { ARG(BackPixmap,unsigned long int,0x0001) ARG(BackPixel,unsigned int,0x0002) ARG(BorderPixmap,unsigned long int,0x0004) ARG(BorderPixel,unsigned int,0x0008); ARG(BitGravity,unsigned long int,0x0010); ARG(WinGravity,unsigned long int,0x0020); ARG(BackingStore,unsigned long int,0x0040); ARG(BackingPlanes,unsigned int,0x0080); ARG(BackingPixel,unsigned int,0x0100); ARG(OverrideRedirect,int,0x0200); ARG(SaveUnder,int,0x0400); ARG(EventMask,unsigned int,0x0800); ARG(DontPropagate,unsigned int,0x1000); ARG(Colormap,unsigned long int,0x2000); ARG(Cursor,unsigned long int,0x4000); case LX__CWV_END: break <"args">; default: lx__bad_call(xc,"lx_CreateWindow_va"); return(LX_WINDOW_None); break; } #undef ARG } va_end(ap); return(do_CreateWindow(xc,&a)); } LX_XID lx_CreateWindow_attr( 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, unsigned int mask, const LX_SET_WINDOW_ATTRIBUTES *attr ) { ARGS a; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_CreateWindow_attr"); return(LX_WINDOW_None); } a.call = "lx_CreateWindow_attr"; a.parent = parent; a.x = x; a.y = y; a.w = w; a.h = h; a.bw = bw; a.depth = depth; a.class = class; a.visual = visual; a.mask = mask; if (mask & 0x0001) a.BackPixmap = attr->background_pixmap; if (mask & 0x0002) a.BackPixel = attr->background_pixel; if (mask & 0x0004) a.BorderPixmap = attr->border_pixmap; if (mask & 0x0008) a.BorderPixel = attr->border_pixel; if (mask & 0x0010) a.BitGravity = attr->bit_gravity; if (mask & 0x0020) a.WinGravity = attr->win_gravity; if (mask & 0x0040) a.BackingStore = attr->backing_store; if (mask & 0x0080) a.BackingPlanes = attr->backing_planes; if (mask & 0x0100) a.BackingPixel = attr->backing_pixel; if (mask & 0x0200) a.OverrideRedirect = attr->override_redirect; if (mask & 0x0400) a.SaveUnder = attr->save_under; if (mask & 0x0800) a.EventMask = attr->event_mask; if (mask & 0x1000) a.DontPropagate = attr->dont_propagate; if (mask & 0x2000) a.Colormap = attr->colormap; if (mask & 0x4000) a.Cursor = attr->cursor; return(do_CreateWindow(xc,&a)); }