static Status XkbInitCompatStructs(XkbDescPtr xkb) { register int i; XkbCompatMapPtr compat; if (xkb->defined & XkmCompatMapMask) return TRUE; if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success) return BadAlloc; compat = xkb->compat; if (compat->sym_interpret) { compat->num_si = num_dfltSI; memcpy((char *)compat->sym_interpret,(char *)dfltSI,sizeof(dfltSI)); } for (i=0;i<XkbNumKbdGroups;i++) { compat->groups[i]= compatMap.groups[i]; if (compat->groups[i].vmods!=0) { unsigned mask; mask= XkbMaskForVMask(xkb,compat->groups[i].vmods); compat->groups[i].mask= compat->groups[i].real_mods|mask; } else compat->groups[i].mask= compat->groups[i].real_mods; } return Success; }
Status _XkbReadGetCompatMapReply( Display * dpy, xkbGetCompatMapReply * rep, XkbDescPtr xkb, int * nread_rtrn) { register int i; XkbReadBufferRec buf; if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4)) return BadAlloc; if (nread_rtrn) *nread_rtrn= (int)rep->length*4; i= rep->firstSI+rep->nSI; if ((!xkb->compat)&& (XkbAllocCompatMap(xkb,XkbAllCompatMask,i)!=Success)) return BadAlloc; if (rep->nSI!=0) { XkbSymInterpretRec *syms; xkbSymInterpretWireDesc *wire; wire= (xkbSymInterpretWireDesc *)_XkbGetReadBufferPtr(&buf, rep->nSI*SIZEOF(xkbSymInterpretWireDesc)); if (wire==NULL) goto BAILOUT; syms= &xkb->compat->sym_interpret[rep->firstSI]; for (i=0;i<rep->nSI;i++,syms++,wire++) { syms->sym= wire->sym; syms->mods= wire->mods; syms->match= wire->match; syms->virtual_mod= wire->virtualMod; syms->flags= wire->flags; syms->act= *((XkbAnyAction *)&wire->act); } xkb->compat->num_si+= rep->nSI; } if (rep->groups&XkbAllGroupsMask) { register unsigned bit,nGroups; xkbModsWireDesc * wire; for (i=0,nGroups=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { if (rep->groups&bit) nGroups++; } wire= (xkbModsWireDesc *)_XkbGetReadBufferPtr(&buf, nGroups*SIZEOF(xkbModsWireDesc)); if (wire==NULL) goto BAILOUT; for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { if ((rep->groups&bit)==0) continue; xkb->compat->groups[i].mask= wire->mask; xkb->compat->groups[i].real_mods= wire->realMods; xkb->compat->groups[i].vmods= wire->virtualMods; wire++; } } i= _XkbFreeReadBuffer(&buf); if (i) fprintf(stderr,"CompatMapReply! Bad length (%d extra bytes)\n",i); if (i || buf.error) return BadLength; return Success; BAILOUT: _XkbFreeReadBuffer(&buf); return BadLength; }