#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_GetSelectionOwner PRIV_GetSelectionOwner; struct priv_GetSelectionOwner { LX_XID *ownerp; } ; static void done_GetSelectionOwner(LX_CONN *xc, const unsigned char *rep, void *pv) { PRIV_GetSelectionOwner *p; LX_XID o; p = pv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(xc,"GetSelectionOwner response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } if (p->ownerp) { o = r_card32(rep+8); if (o == 0) o = LX_WINDOW_None; *p->ownerp = o; } } while (0); free(p); } LX_OP *lx_GetSelectionOwner(LX_CONN *xc, LX_XID selection, LX_XID *ownerp) { unsigned char req[8]; PRIV_GetSelectionOwner *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_GetSelectionOwner"); return(0); } lx__nochain(xc); p = malloc(sizeof(PRIV_GetSelectionOwner)); if (! p) { lx__nomem_fail(xc); return(0); } p->ownerp = ownerp; req[0] = XP_REQ_GetSelectionOwner; req[1] = 0; w_card16(&req[2],2); w_card32(&req[4],selection); return(lx__expect_reply(xc,&req[0],-1,&done_GetSelectionOwner,p)); }