// Copyright status: this file is in the public domain. #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_CONN *xc, const unsigned char *rep, void *pv) { PRIV_GetInputFocus *p; LX_XID f; LX_XID r; p = pv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(xc,"GetInputFocus response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } 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(xc,"invalid revert-to %d in GetInputFocus reply",rep[1]); break <"ret">; } f = r_card32(rep+8); switch (f) { case 0: f = LX_FOCUS_None; break; case 1: f = LX_FOCUS_PointerRoot; break; } if (p->focusp) *p->focusp = f; if (p->revertp) *p->revertp = r; } while (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); } lx__nochain(xc); 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; // unused w_card16(&req[2],1); return(lx__expect_reply(xc,&req[0],-1,&done_GetInputFocus,p)); }