#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_QueryPointer PRIV_QueryPointer; struct priv_QueryPointer { int *samescreenp; LX_XID *rootp; LX_XID *childp; int *rootxp; int *rootyp; int *winxp; int *winyp; unsigned int *maskp; } ; static void done_QueryPointer(LX_OP *op, const unsigned char *rep) { PRIV_QueryPointer *p; LX_XID child; CARD16 m; p = op->reqpriv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"QueryPointer response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } switch (rep[1]) { case 0: case 1: break; default: lx__protoerr(op->conn,"QueryPointer response has bad same-screen value %d",rep[1]); break <"ret">; } m = r_card16(rep+24); if (m & EVS_KEYBUTMASK_MBZ) { lx__protoerr(op->conn,"QueryPointer response has bad mask 0x%04x",m); break <"ret">; } if (p->samescreenp) *p->samescreenp = rep[1]; if (p->rootp) *p->rootp = r_card32(rep+8); if (p->childp) { child = r_card32(rep+12); if (child == 0) child = LX_WINDOW_None; *p->childp = child; } if (p->rootxp) *p->rootxp = r_int16(rep+16); if (p->rootyp) *p->rootyp = r_int16(rep+18); if (p->winxp) *p->winxp = r_int16(rep+20); if (p->winyp) *p->winyp = r_int16(rep+22); if (p->maskp) *p->maskp = r_card16(rep+24); } while (0); op->reqpriv = 0; free(p); } static LX_OP *do_QueryPointer(LX_CONN *xc, LX_XID window, PRIV_QueryPointer *p) { unsigned char req[8]; req[0] = XP_REQ_QueryPointer; req[1] = 0; w_card16(&req[2],2); w_card32(&req[4],window); return(lx__expect_reply(xc,&req[0],-1,&done_QueryPointer,p)); } LX_OP *lx_QueryPointer( LX_CONN *xc, LX_XID window, int *samescreenp, LX_XID *rootp, LX_XID *childp, int *rootxp, int *rootyp, int *winxp, int *winyp, unsigned int *maskp ) { PRIV_QueryPointer *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_QueryPointer"); return(0); } p = malloc(sizeof(PRIV_QueryPointer)); if (! p) { lx__nomem_fail(xc); return(0); } p->samescreenp = samescreenp; p->rootp = rootp; p->childp = childp; p->rootxp = rootxp; p->rootyp = rootyp; p->winxp = winxp; p->winyp = winyp; p->maskp = maskp; return(do_QueryPointer(xc,window,p)); } LX_OP *lx_QueryPointer_status(LX_CONN *xc, LX_XID window, LX_QUERYPOINTER_STATUS *statusp) { PRIV_QueryPointer *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_QueryPointer"); return(0); } p = malloc(sizeof(PRIV_QueryPointer)); if (! p) { lx__nomem_fail(xc); return(0); } p->samescreenp = statusp ? &statusp->samescreen : 0; p->rootp = statusp ? &statusp->root : 0; p->childp = statusp ? &statusp->child : 0; p->rootxp = statusp ? &statusp->rootx : 0; p->rootyp = statusp ? &statusp->rooty : 0; p->winxp = statusp ? &statusp->winx : 0; p->winyp = statusp ? &statusp->winy : 0; p->maskp = statusp ? &statusp->mask : 0; return(do_QueryPointer(xc,window,p)); }