#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_GrabPointer PRIV_GrabPointer; struct priv_GrabPointer { LX_XID *statusp; } ; static void done_GrabPointer(LX_OP *op, const unsigned char *rep, void *pv) { PRIV_GrabPointer *p; LX_GRABSTATUS gs; p = pv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"GrabPointer response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } if (p->statusp) { gs = lx__proto_to_grabstatus(rep[1]); if (gs == LX__map_error) { lx__protoerr(op->conn,"GrabPointer response has invalid status value %d",rep[1]); break <"ret">; } *p->statusp = gs; } } while (0); free(p); } LX_OP *lx_GrabPointer( LX_CONN *xc, LX_XID grabwin, int ownerevents, unsigned int eventmask, LX_GRABMODE ptrmode, LX_GRABMODE kbdmode, LX_XID confine, LX_XID cursor, LX_TIME time, LX_XID *statusp ) { unsigned char req[24]; PRIV_GrabPointer *p; int proto_pmode; int proto_kmode; if ((xc->flags & XCF_FAIL) || (eventmask & EVM_POINTEREVENT_MBZ)) { lx__bad_call(xc,"lx_GrabPointer"); return(0); } lx__nochain(xc); proto_pmode = lx__grabmode_to_proto(ptrmode); proto_kmode = lx__grabmode_to_proto(kbdmode); if ((proto_pmode < 0) || (proto_kmode < 0)) { lx__bad_call(xc,"lx_GrabPointer"); return(0); } if (confine == LX_WINDOW_None) confine = 0; if (cursor == LX_CURSOR_None) cursor = 0; p = malloc(sizeof(PRIV_GrabPointer)); if (! p) { lx__nomem_fail(xc); return(0); } p->statusp = statusp; req[0] = XP_REQ_GrabPointer; req[1] = lx__boolean_to_proto(ownerevents); w_card16(&req[2],6); w_card32(&req[4],grabwin); w_card16(&req[8],eventmask); req[10] = proto_pmode; req[11] = proto_kmode; w_card32(&req[12],confine); w_card32(&req[16],cursor); w_card32(&req[20],time); return(lx__expect_reply(xc,&req[0],-1,&done_GrabPointer,p)); }