#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_OP *op, const unsigned char *rep) { PRIV_GetKeyboardMapping *p; int kpk; int i; LX_KEYSYM *v; p = op->reqpriv; do <"ret"> { kpk = rep[1]; if (r_card32(rep+4) != kpk*p->count) { lx__protoerr(op->conn,"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(op->conn); 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); op->reqpriv = 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); } 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)); }