static char * _WriteCountedString(char *wire,char *str) { CARD16 len,*pLen; len= (str?strlen(str):0); pLen= (CARD16 *)wire; *pLen= len; if (len && str) memcpy(&wire[2],str,len); wire+= XkbPaddedSize(len+2); return wire; }
static Status _AddListComponent( XkbSrvListInfoPtr list, int what, unsigned flags, char * str, ClientPtr client) { int slen,wlen; unsigned char * wire8; unsigned short *wire16; char * tmp; if (list->nTotal>=list->maxRtrn) { list->nTotal++; return Success; } tmp= strchr(str,')'); if ((tmp==NULL)&&((tmp=strchr(str,'('))==NULL)) { slen= strlen(str); while ((slen>0) && isspace(str[slen-1])) { slen--; } } else { slen= (tmp-str+1); } wlen= (((slen+1)/2)*2)+4; /* four bytes for flags and length, pad to */ /* 2-byte boundary */ if ((list->szPool-list->nPool)<wlen) { if (wlen>1024) list->szPool+= XkbPaddedSize(wlen*2); else list->szPool+= 1024; list->pool= realloc(list->pool, list->szPool * sizeof(char)); if (!list->pool) return BadAlloc; } wire16= (unsigned short *)&list->pool[list->nPool]; wire8= (unsigned char *)&wire16[2]; wire16[0]= flags; wire16[1]= slen; memcpy(wire8,str,slen); if (client->swapped) { register int n; swaps(&wire16[0],n); swaps(&wire16[1],n); } list->nPool+= wlen; list->nFound[what]++; list->nTotal++; return Success; }
XkbComponentListPtr XkbListComponents( Display * dpy, unsigned deviceSpec, XkbComponentNamesPtr ptrns, int * max_inout) { register xkbListComponentsReq* req; xkbListComponentsReply rep; XkbInfoPtr xkbi; XkbComponentListPtr list; XkbReadBufferRec buf; int left; char * str; int extraLen,len,mapLen,codesLen,typesLen,compatLen,symsLen,geomLen; if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) || (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) || (ptrns==NULL) || (max_inout==NULL)) return NULL; xkbi= dpy->xkb_info; LockDisplay(dpy); GetReq(kbListComponents, req); req->reqType = xkbi->codes->major_opcode; req->xkbReqType = X_kbListComponents; req->deviceSpec = deviceSpec; req->maxNames = *max_inout; mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0; if (ptrns->keymap) mapLen= (int)strlen(ptrns->keymap); if (ptrns->keycodes) codesLen= (int)strlen(ptrns->keycodes); if (ptrns->types) typesLen= (int)strlen(ptrns->types); if (ptrns->compat) compatLen= (int)strlen(ptrns->compat); if (ptrns->symbols) symsLen= (int)strlen(ptrns->symbols); if (ptrns->geometry) geomLen= (int)strlen(ptrns->geometry); if (mapLen>255) mapLen= 255; if (codesLen>255) codesLen= 255; if (typesLen>255) typesLen= 255; if (compatLen>255) compatLen= 255; if (symsLen>255) symsLen= 255; if (geomLen>255) geomLen= 255; len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6; len= XkbPaddedSize(len); req->length+= len/4; BufAlloc(char *,str,len); *str++= mapLen; if (mapLen>0) { memcpy(str,ptrns->keymap,mapLen); str+= mapLen; } *str++= codesLen; if (codesLen>0) { memcpy(str,ptrns->keycodes,codesLen); str+= codesLen; } *str++= typesLen; if (typesLen>0) { memcpy(str,ptrns->types,typesLen); str+= typesLen; } *str++= compatLen; if (compatLen>0) { memcpy(str,ptrns->compat,compatLen); str+= compatLen; } *str++= symsLen; if (symsLen>0) { memcpy(str,ptrns->symbols,symsLen); str+= symsLen; } *str++= geomLen; if (geomLen>0) { memcpy(str,ptrns->geometry,geomLen); str+= geomLen; } if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) goto BAILOUT; extraLen= (int)rep.length*4; *max_inout= rep.extra; if (extraLen==0) { /* no matches, but we don't want to report a failure */ list= _XkbTypedCalloc(1,XkbComponentListRec); UnlockDisplay(dpy); SyncHandle(); return list; } if (_XkbInitReadBuffer(dpy,&buf,extraLen)) { Status status; status= Success; list= _XkbTypedCalloc(1,XkbComponentListRec); if (!list) { _XkbFreeReadBuffer(&buf); goto BAILOUT; } list->num_keymaps= rep.nKeymaps; list->num_keycodes= rep.nKeycodes; list->num_types= rep.nTypes; list->num_compat= rep.nCompatMaps; list->num_symbols= rep.nSymbols; list->num_geometry= rep.nGeometries; if ((status==Success)&&(list->num_keymaps>0)) list->keymaps= _ReadListing(&buf,list->num_keymaps,&status); if ((status==Success)&&(list->num_keycodes>0)) list->keycodes= _ReadListing(&buf,list->num_keycodes,&status); if ((status==Success)&&(list->num_types>0)) list->types= _ReadListing(&buf,list->num_types,&status); if ((status==Success)&&(list->num_compat>0)) list->compat= _ReadListing(&buf,list->num_compat,&status); if ((status==Success)&&(list->num_symbols>0)) list->symbols= _ReadListing(&buf,list->num_symbols,&status); if ((status==Success)&&(list->num_geometry>0)) list->geometry= _ReadListing(&buf,list->num_geometry,&status); left= _XkbFreeReadBuffer(&buf); if ((status!=Success)||(buf.error)||(left>2)) { XkbFreeComponentList(list); goto BAILOUT; } UnlockDisplay(dpy); SyncHandle(); return list; } BAILOUT: UnlockDisplay(dpy); SyncHandle(); return NULL; }
XkbDescPtr XkbGetKeyboardByName( Display * dpy, unsigned deviceSpec, XkbComponentNamesPtr names, unsigned want, unsigned need, Bool load) { register xkbGetKbdByNameReq * req; xkbGetKbdByNameReply rep; int len,extraLen; char * str; XkbDescPtr xkb; int mapLen,codesLen,typesLen,compatLen; int symsLen,geomLen; XkbInfoPtr xkbi; if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) || (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) ) return NULL; xkbi= dpy->xkb_info; xkb = (XkbDescRec *)_XkbCalloc(1,sizeof(XkbDescRec)); if (!xkb) return NULL; xkb->device_spec = deviceSpec; xkb->map = (XkbClientMapRec *)_XkbCalloc(1,sizeof(XkbClientMapRec)); xkb->dpy = dpy; LockDisplay(dpy); GetReq(kbGetKbdByName, req); req->reqType = xkbi->codes->major_opcode; req->xkbReqType = X_kbGetKbdByName; req->deviceSpec = xkb->device_spec; req->want= want; req->need= need; req->load= load; mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0; if (names) { if (names->keymap) mapLen= (int)strlen(names->keymap); if (names->keycodes) codesLen= (int)strlen(names->keycodes); if (names->types) typesLen= (int)strlen(names->types); if (names->compat) compatLen= (int)strlen(names->compat); if (names->symbols) symsLen= (int)strlen(names->symbols); if (names->geometry) geomLen= (int)strlen(names->geometry); if (mapLen>255) mapLen= 255; if (codesLen>255) codesLen= 255; if (typesLen>255) typesLen= 255; if (compatLen>255) compatLen= 255; if (symsLen>255) symsLen= 255; if (geomLen>255) geomLen= 255; } else mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0; len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6; len= XkbPaddedSize(len); req->length+= len/4; BufAlloc(char *,str,len); *str++= mapLen; if (mapLen>0) { memcpy(str,names->keymap,mapLen); str+= mapLen; } *str++= codesLen; if (codesLen>0) { memcpy(str,names->keycodes,codesLen); str+= codesLen; } *str++= typesLen; if (typesLen>0) { memcpy(str,names->types,typesLen); str+= typesLen; } *str++= compatLen; if (compatLen>0) { memcpy(str,names->compat,compatLen); str+= compatLen; } *str++= symsLen; if (symsLen>0) { memcpy(str,names->symbols,symsLen); str+= symsLen; } *str++= geomLen; if (geomLen>0) { memcpy(str,names->geometry,geomLen); str+= geomLen; } if ((!_XReply(dpy, (xReply *)&rep, 0, xFalse))||(!rep.reported)) goto BAILOUT; extraLen= (int)rep.length*4; xkb->device_spec= rep.deviceID; xkb->min_key_code = rep.minKeyCode; xkb->max_key_code = rep.maxKeyCode; if (rep.reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask)) { xkbGetMapReply mrep; Status status; int nread= 0; _XRead(dpy, (char *)&mrep, SIZEOF(xkbGetMapReply)); extraLen-= SIZEOF(xkbGetMapReply); status= _XkbReadGetMapReply(dpy,&mrep,xkb,&nread); extraLen-= nread; if (status!=Success) goto BAILOUT; } if (rep.reported&XkbGBN_CompatMapMask) { xkbGetCompatMapReply crep; Status status; int nread= 0; _XRead(dpy, (char *)&crep, SIZEOF(xkbGetCompatMapReply)); extraLen-= SIZEOF(xkbGetCompatMapReply); status= _XkbReadGetCompatMapReply(dpy,&crep,xkb,&nread); extraLen-= nread; if (status!=Success) goto BAILOUT; } if (rep.reported&XkbGBN_IndicatorMapMask) { xkbGetIndicatorMapReply irep; Status status; int nread= 0; _XRead(dpy, (char *)&irep, SIZEOF(xkbGetIndicatorMapReply)); extraLen-= SIZEOF(xkbGetIndicatorMapReply); status= _XkbReadGetIndicatorMapReply(dpy,&irep,xkb,&nread); extraLen-= nread; if (status!=Success) goto BAILOUT; } if (rep.reported&(XkbGBN_KeyNamesMask|XkbGBN_OtherNamesMask)) { xkbGetNamesReply nrep; Status status; int nread= 0; _XRead(dpy, (char *)&nrep, SIZEOF(xkbGetNamesReply)); extraLen-= SIZEOF(xkbGetNamesReply); status= _XkbReadGetNamesReply(dpy,&nrep,xkb,&nread); extraLen-= nread; if (status!=Success) goto BAILOUT; } if (rep.reported&XkbGBN_GeometryMask) { xkbGetGeometryReply grep; Status status; int nread= 0; _XRead(dpy, (char *)&grep, SIZEOF(xkbGetGeometryReply)); extraLen-= SIZEOF(xkbGetGeometryReply); status= _XkbReadGetGeometryReply(dpy,&grep,xkb,&nread); extraLen-= nread; if (status!=Success) goto BAILOUT; } UnlockDisplay(dpy); SyncHandle(); return xkb; BAILOUT: if (xkb!=NULL) XkbFreeKeyboard(xkb,XkbAllComponentsMask,xTrue); UnlockDisplay(dpy); SyncHandle(); return NULL; }