#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_GetModifierMapping PRIV_GetModifierMapping; struct priv_GetModifierMapping { int *nump; LX_KEYCODE *keycodesp; } ; static void done_GetModifierMapping(LX_OP *op, const unsigned char *rep, void *pv) { PRIV_GetModifierMapping *p; int n; int i; p = pv; do <"ret"> { n = rep[1]; if (r_card32(rep+4) != 2*n) { lx__protoerr(op->conn,"GetModifierMapping response length wrong (%u, expecting %d)",r_card32(rep+4),2*n); break <"ret">; } if (p->nump) *p->nump = n; if (p->keycodesp) { for (i=0,n*=8;n>0;i++,n--) { p->keycodesp[i] = rep[32+i]; } } } while (0); free(p); } LX_OP *lx_GetModifierMapping(LX_CONN *xc, int *nump, LX_KEYCODE *keycodesp) { unsigned char req[4]; PRIV_GetModifierMapping *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_GetModifierMapping"); return(0); } lx__nochain(xc); p = malloc(sizeof(PRIV_GetModifierMapping)); if (! p) { lx__nomem_fail(xc); return(0); } p->nump = nump; p->keycodesp = keycodesp; req[0] = XP_REQ_GetModifierMapping; req[1] = 0; w_card16(&req[2],1); return(lx__expect_reply(xc,&req[0],-1,&done_GetModifierMapping,p)); }