#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_TranslateCoordinates PRIV_TranslateCoordinates; struct priv_TranslateCoordinates { int *samescreenp; int *dxp; int *dyp; LX_XID *childp; } ; static void done_TranslateCoordinates(LX_OP *op, const unsigned char *rep) { PRIV_TranslateCoordinates *p; int v; LX_XID child; p = op->reqpriv; if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"TranslateCoordinates response length wrong (%u, expecting 0)",r_card32(rep+4)); return; } switch (rep[1]) { case 0: case 1: v = rep[1]; break; default: lx__protoerr(op->conn,"TranslateCoordinates response has invalid same-screen value %d",rep[1]); return; break; } if (p->samescreenp) *p->samescreenp = v; if (p->dxp) *p->dxp = r_int16(rep+12); if (p->dyp) *p->dyp = r_int16(rep+14); if (p->childp) { child = r_card32(rep+8); if (child == 0) child = LX_WINDOW_None; *p->childp = child; } op->reqpriv = 0; free(p); } LX_OP *lx_TranslateCoordinates(LX_CONN *xc, LX_XID src, LX_XID dst, int sx, int sy, int *samescreenp, int *dxp, int *dyp, LX_XID *childp) { unsigned char req[16]; PRIV_TranslateCoordinates *p; if ((xc->flags & XCF_FAIL) || (sx < -32768) || (sx > 32767) || (sy < -32768) || (sy > 32767)) { lx__bad_call(xc,"lx_TranslateCoordinates"); return(0); } p = malloc(sizeof(PRIV_TranslateCoordinates)); if (! p) { lx__nomem_fail(xc); return(0); } p->samescreenp = samescreenp; p->dxp = dxp; p->dyp = dyp; p->childp = childp; req[0] = XP_REQ_TranslateCoordinates; req[1] = 0; w_card16(&req[2],4); w_card32(&req[4],src); w_card32(&req[8],dst); w_int16(&req[12],sx); w_int16(&req[14],sy); return(lx__expect_reply(xc,&req[0],-1,&done_TranslateCoordinates,p)); }