#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_GetKeyboardMapping PRIV_GetKeyboardMapping; struct priv_GetKeyboardMapping { int count; int *kperkp; LX_KEYSYM **symsp; } ; static void done_GetKeyboardMapping(LX_CONN *xc, const unsigned char *rep, void *pv) { PRIV_GetKeyboardMapping *p; int kpk; int i; LX_KEYSYM *v; p = pv; do <"ret"> { kpk = rep[1]; if (r_card32(rep+4) != kpk*p->count) { lx__protoerr(xc,"GetKeyboardMapping response length wrong (%u, expecting %d)",r_card32(rep+4),kpk*p->count); break <"ret">; } if (p->symsp) { v = malloc(kpk*p->count*sizeof(LX_KEYSYM)); if (! v) { lx__nomem_fail(xc); break <"ret">; } for (i=(kpk*p->count)-1;i>=0;i--) v[i] = r_card32(rep+32+(i*4)); *p->symsp = v; } if (p->kperkp) *p->kperkp = kpk; } while (0); free(p); } LX_OP *lx_GetKeyboardMapping(LX_CONN *xc, int min, int count, int *kperkp, LX_KEYSYM **symsp) { unsigned char req[8]; PRIV_GetKeyboardMapping *p; if ((xc->flags & XCF_FAIL) || (count < 0) || (count > 255) || (min < 0) || (min > 255)) { lx__bad_call(xc,"lx_GetKeyboardMapping"); return(0); } lx__nochain(xc); p = malloc(sizeof(PRIV_GetKeyboardMapping)); if (! p) { lx__nomem_fail(xc); return(0); } p->count = count; p->kperkp = kperkp; p->symsp = symsp; req[0] = XP_REQ_GetKeyboardMapping; req[1] = 0; w_card16(&req[2],2); req[4] = min; req[5] = count; return(lx__expect_reply(xc,&req[0],-1,&done_GetKeyboardMapping,p)); }