static Status _XkbGeomAlloc( XPointer * old, unsigned short * num, unsigned short * total, int num_new, size_t sz_elem) { if (num_new<1) return Success; if ((*old)==NULL) *num= *total= 0; if ((*num)+num_new<=(*total)) return Success; *total= (*num)+num_new; if ((*old)!=NULL) (*old)= (XPointer)_XkbRealloc((*old),(*total)*sz_elem); else (*old)= (XPointer)_XkbCalloc((*total),sz_elem); if ((*old)==NULL) { *total= *num= 0; return BadAlloc; } if (*num>0) { char *tmp= (char *)(*old); bzero(&tmp[sz_elem*(*num)],(num_new*sz_elem)); } return Success; }
static Status XkbInitNames(XkbSrvInfoPtr xkbi,SrvXkmInfo *file) { XkbDescPtr xkb; XkbNamesPtr names; Status rtrn; Atom unknown; xkb= xkbi->desc; if ((rtrn=XkbAllocNames(xkb,XkbAllNamesMask,0,0))!=Success) return rtrn; unknown= CREATE_ATOM("unknown"); names = xkb->names; if (names->keycodes==None) names->keycodes= unknown; if (names->geometry==None) names->geometry= unknown; if (names->phys_symbols==None) names->phys_symbols= unknown; if (names->symbols==None) names->symbols= unknown; if (names->types==None) names->types= unknown; if (names->compat==None) names->compat= unknown; if ((file->xkbinfo.defined&XkmVirtualModsMask)==0) { if (names->vmods[vmod_NumLock]==None) names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock"); if (names->vmods[vmod_Alt]==None) names->vmods[vmod_Alt]= CREATE_ATOM("Alt"); if (names->vmods[vmod_AltGr]==None) names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch"); } if (((file->xkbinfo.defined&XkmIndicatorsMask)==0)|| ((file->xkbinfo.defined&XkmGeometryMask)==0)) { initIndicatorNames(NULL,xkb); if (names->indicators[LED_CAPS-1]==None) names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock"); if (names->indicators[LED_NUM-1]==None) names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock"); if (names->indicators[LED_SCROLL-1]==None) names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock"); #ifdef LED_COMPOSE if (names->indicators[LED_COMPOSE-1]==None) names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose"); #endif } #ifdef DEBUG_RADIO_GROUPS if (names->num_rg<1) { names->radio_groups= (Atom *)_XkbCalloc(RG_COUNT, sizeof(Atom)); if (names->radio_groups) { names->num_rg = RG_COUNT; names->radio_groups[RG_BOGUS_FUNCTION_GROUP]= CREATE_ATOM("BOGUS"); } } #endif if (xkb->geom!=NULL) names->geometry= xkb->geom->name; else names->geometry= unknown; return Success; }
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; }