#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_GetInputFocus PRIV_GetInputFocus; struct priv_GetInputFocus { LX_XID *focusp; LX_XID *revertp; } ; static void done_GetInputFocus(LX_OP *op, const unsigned char *rep) { PRIV_GetInputFocus *p; LX_XID f; LX_XID r; switch (rep[1]) { case 0: r = LX_FOCUS_None; break; case 1: r = LX_FOCUS_PointerRoot; break; case 2: r = LX_FOCUS_Parent; break; default: lx__protoerr(op->conn,"invalid revert-to %d in GetInputFocus reply",rep[1]); return; break; } f = r_card32(rep+8); switch (f) { case 0: f = LX_FOCUS_None; break; case 1: f = LX_FOCUS_PointerRoot; break; } p = op->reqpriv; if (p->focusp) *p->focusp = f; if (p->revertp) *p->revertp = r; op->reqpriv = 0; free(p); } LX_OP *lx_GetInputFocus(LX_CONN *xc, LX_XID *focusp, LX_XID *revertp) { unsigned char req[4]; PRIV_GetInputFocus *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_GetInputFocus"); return(0); } p = malloc(sizeof(PRIV_GetInputFocus)); if (! p) { lx__nomem_fail(xc); return(0); } p->focusp = focusp; p->revertp = revertp; req[0] = XP_REQ_GetInputFocus; req[1] = 0; w_card16(&req[2],1); return(lx__expect_reply(xc,&req[0],4,&done_GetInputFocus,p,0)); }