#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct args ARGS; struct args { const char *call; LX_XID window; unsigned int mask; int X; int Y; int W; int H; int BorderWidth; LX_XID Sibling; LX_XID StackMode; } ; static void do_ConfigureWindow(LX_CONN *xc, ARGS *a) { unsigned char req[40]; int proto_StackMode; int o; do <"badcall"> { if ( (a->X < -32768) || (a->X > 32767) || (a->Y < -32768) || (a->Y > 32767) || (a->W < 0) || (a->W > 65535) || (a->H < 0) || (a->H > 65535) || (a->BorderWidth < 0) || (a->BorderWidth > 65535) ) break <"badcall">; if (a->mask & 0x0040) { proto_StackMode = lx__stackmode_to_proto(a->StackMode); if (proto_StackMode < 0) break <"badcall">; } req[0] = XP_REQ_ConfigureWindow; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],a->window); w_card16(&req[8],a->mask); o = 12; #define SFIELD(bit,val) do { if (a->mask & (bit)) { w_int32(&req[o],(val)); o += 4; } } while (0) #define UFIELD(bit,val) do { if (a->mask & (bit)) { w_card32(&req[o],(val)); o += 4; } } while (0) SFIELD(0x0001,a->X); SFIELD(0x0002,a->Y); UFIELD(0x0004,a->W); UFIELD(0x0008,a->H); UFIELD(0x0010,a->BorderWidth); UFIELD(0x0020,a->Sibling); UFIELD(0x0040,proto_StackMode); #undef SFIELD #undef UFIELD w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); return; } while (0); lx__bad_call(xc,a->call); } void lx_ConfigureWindow_va(LX_CONN *xc, LX_XID window, ...) { ARGS a; va_list ap; int key; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ConfigureWindow_va"); return; } a.call = "lx_ConfigureWindow_va"; a.window = window; a.mask = 0; va_start(ap,window); 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(X,int,0x0001) ARG(Y,int,0x0002) ARG(W,int,0x0004) ARG(H,int,0x0008) ARG(BorderWidth,int,0x0010) ARG(Sibling,unsigned long int,0x0020) ARG(StackMode,unsigned long int,0x0040) default: lx__bad_call(xc,"lx_ConfigureWindow_va"); return; break; } #undef ARG } va_end(ap); do_ConfigureWindow(xc,&a); } void lx_ConfigureWindow_attr(LX_CONN *xc, LX_XID window, unsigned int mask, const LX_CFG_WINDOW_ATTRIBUTES *attr) { ARGS a; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ConfigureWindow_attr"); return; } a.call = "lx_ConfigureWindow_attr"; a.window = window; a.mask = mask; if (mask & 0x0001) a.X = attr->x; if (mask & 0x0002) a.Y = attr->y; if (mask & 0x0004) a.W = attr->w; if (mask & 0x0008) a.H = attr->h; if (mask & 0x0010) a.BorderWidth = attr->border_width; if (mask & 0x0020) a.Sibling = attr->sibling; if (mask & 0x0040) a.StackMode = attr->stack_mode; do_ConfigureWindow(xc,&a); }