Status _XkbReadGetGeometryReply( Display * dpy, xkbGetGeometryReply * rep, XkbDescPtr xkb, int * nread_rtrn) { XkbGeometryPtr geom; geom= _XkbTypedCalloc(1,XkbGeometryRec); if (!geom) return BadAlloc; if (xkb->geom) XkbFreeGeometry(xkb->geom,XkbGeomAllMask,True); xkb->geom= geom; geom->name= rep->name; geom->width_mm= rep->widthMM; geom->height_mm= rep->heightMM; if (rep->length) { XkbReadBufferRec buf; int left; if (_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4)) { Status status= Success; if (nread_rtrn) *nread_rtrn= (int)rep->length*4; if (!_XkbGetReadBufferCountedString(&buf,&geom->label_font)) status= BadLength; if (status==Success) status= _XkbReadGeomProperties(&buf,geom,rep); if (status==Success) status= _XkbReadGeomColors(&buf,geom,rep); if (status==Success) status= _XkbReadGeomShapes(&buf,geom,rep); if (status==Success) status= _XkbReadGeomSections(&buf,geom,rep); if (status==Success) status= _XkbReadGeomDoodads(&buf,geom,rep); if (status==Success) status= _XkbReadGeomKeyAliases(&buf,geom,rep); left= _XkbFreeReadBuffer(&buf); if ((status!=Success) || left || buf.error) { if (status==Success) status= BadLength; XkbFreeGeometry(geom,XkbGeomAllMask,True); xkb->geom= NULL; return status; } geom->base_color= &geom->colors[rep->baseColorNdx]; geom->label_color= &geom->colors[rep->labelColorNdx]; } else { XkbFreeGeometry(geom,XkbGeomAllMask,True); xkb->geom= NULL; return BadAlloc; } } return Success; }
void XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll) { if (xkb==NULL) return; if (freeAll) which= XkbAllComponentsMask; if (which&XkbClientMapMask) XkbFreeClientMap(xkb,XkbAllClientInfoMask,TRUE); if (which&XkbServerMapMask) XkbFreeServerMap(xkb,XkbAllServerInfoMask,TRUE); if (which&XkbCompatMapMask) XkbFreeCompatMap(xkb,XkbAllCompatMask,TRUE); if (which&XkbIndicatorMapMask) XkbFreeIndicatorMaps(xkb); if (which&XkbNamesMask) XkbFreeNames(xkb,XkbAllNamesMask,TRUE); if ((which&XkbGeometryMask) && (xkb->geom!=NULL)) { XkbFreeGeometry(xkb->geom,XkbGeomAllMask,TRUE); /* PERHAPS BONGHITS etc */ xkb->geom = NULL; } if (which&XkbControlsMask) XkbFreeControls(xkb,XkbAllControlsMask,TRUE); if (freeAll) xfree(xkb); return; }
Status XkbAllocGeometry(XkbDescPtr xkb, XkbGeometrySizesPtr sizes) { XkbGeometryPtr geom; Status rtrn; if (xkb->geom == NULL) { xkb->geom = calloc(1, sizeof(XkbGeometryRec)); if (!xkb->geom) return BadAlloc; } geom = xkb->geom; if ((sizes->which & XkbGeomPropertiesMask) && ((rtrn = _XkbAllocProps(geom, sizes->num_properties)) != Success)) { goto BAIL; } if ((sizes->which & XkbGeomColorsMask) && ((rtrn = _XkbAllocColors(geom, sizes->num_colors)) != Success)) { goto BAIL; } if ((sizes->which & XkbGeomShapesMask) && ((rtrn = _XkbAllocShapes(geom, sizes->num_shapes)) != Success)) { goto BAIL; } if ((sizes->which & XkbGeomSectionsMask) && ((rtrn = _XkbAllocSections(geom, sizes->num_sections)) != Success)) { goto BAIL; } if ((sizes->which & XkbGeomDoodadsMask) && ((rtrn = _XkbAllocDoodads(geom, sizes->num_doodads)) != Success)) { goto BAIL; } if ((sizes->which & XkbGeomKeyAliasesMask) && ((rtrn = _XkbAllocKeyAliases(geom, sizes->num_key_aliases)) != Success)) { goto BAIL; } return Success; BAIL: XkbFreeGeometry(geom, XkbGeomAllMask, TRUE); xkb->geom = NULL; return rtrn; }