2 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 #include "xkbcommon/xkbcommon.h"
31 #include "XKBcommonint.h"
32 #include <X11/extensions/XKB.h>
35 _XkbFreeGeomLeafElems(Bool freeAll, int first, int count,
36 unsigned short *num_inout, unsigned short *sz_inout,
37 char **elems, unsigned int elem_sz)
39 if (freeAll || !(*elems)) {
40 *num_inout = *sz_inout = 0;
48 if ((first >= (*num_inout)) || (first < 0) || (count < 1))
51 if (first + count >= (*num_inout))
52 /* truncating the array is easy */
56 int extra = ((*num_inout) - first + count) * elem_sz;
59 memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz],
62 (*num_inout) -= count;
66 typedef void (*ContentsClearFunc)(char *priv);
69 _XkbFreeGeomNonLeafElems(Bool freeAll, int first, int count,
70 unsigned short *num_inout, unsigned short *sz_inout,
71 char **elems, unsigned int elem_sz,
72 ContentsClearFunc freeFunc)
81 else if ((first >= (*num_inout)) || (first < 0) || (count < 1))
83 else if (first + count > (*num_inout))
84 count = (*num_inout) - first;
91 ptr += first * elem_sz;
92 for (i = 0; i < count; i++) {
99 *num_inout = *sz_inout = 0;
105 else if (first + count >= (*num_inout))
108 i = ((*num_inout) - first + count) * elem_sz;
110 memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz], i);
111 (*num_inout) -= count;
116 _XkbClearProperty(char *prop_in)
118 struct xkb_property * prop = (struct xkb_property *)prop_in;
131 XkbcFreeGeomProperties(struct xkb_geometry * geom, int first, int count, Bool freeAll)
133 _XkbFreeGeomNonLeafElems(freeAll, first, count,
134 &geom->num_properties, &geom->sz_properties,
135 (char **)&geom->properties,
136 sizeof(struct xkb_property),
141 XkbcFreeGeomKeyAliases(struct xkb_geometry * geom, int first, int count, Bool freeAll)
143 _XkbFreeGeomLeafElems(freeAll, first, count,
144 &geom->num_key_aliases, &geom->sz_key_aliases,
145 (char **)&geom->key_aliases,
146 sizeof(struct xkb_key_alias));
150 _XkbClearColor(char *color_in)
152 struct xkb_color * color = (struct xkb_color *)color_in;
159 XkbcFreeGeomColors(struct xkb_geometry * geom, int first, int count, Bool freeAll)
161 _XkbFreeGeomNonLeafElems(freeAll, first, count,
162 &geom->num_colors, &geom->sz_colors,
163 (char **)&geom->colors, sizeof(struct xkb_color),
168 XkbcFreeGeomPoints(struct xkb_outline * outline, int first, int count, Bool freeAll)
170 _XkbFreeGeomLeafElems(freeAll, first, count,
171 &outline->num_points, &outline->sz_points,
172 (char **)&outline->points, sizeof(struct xkb_point));
176 _XkbClearOutline(char *outline_in)
178 struct xkb_outline * outline = (struct xkb_outline *)outline_in;
181 XkbcFreeGeomPoints(outline, 0, outline->num_points, True);
185 XkbcFreeGeomOutlines(struct xkb_shape * shape, int first, int count, Bool freeAll)
187 _XkbFreeGeomNonLeafElems(freeAll, first, count,
188 &shape->num_outlines, &shape->sz_outlines,
189 (char **)&shape->outlines, sizeof(struct xkb_outline),
194 _XkbClearShape(char *shape_in)
196 struct xkb_shape * shape = (struct xkb_shape *)shape_in;
199 XkbcFreeGeomOutlines(shape, 0, shape->num_outlines, True);
203 XkbcFreeGeomShapes(struct xkb_geometry * geom, int first, int count, Bool freeAll)
205 _XkbFreeGeomNonLeafElems(freeAll, first, count,
206 &geom->num_shapes, &geom->sz_shapes,
207 (char **)&geom->shapes, sizeof(struct xkb_shape),
212 XkbcFreeGeomKeys(struct xkb_row * row, int first, int count, Bool freeAll)
214 _XkbFreeGeomLeafElems(freeAll, first, count,
215 &row->num_keys, &row->sz_keys,
216 (char **)&row->keys, sizeof(struct xkb_key));
220 _XkbClearRow(char *row_in)
222 struct xkb_row * row = (struct xkb_row *)row_in;
225 XkbcFreeGeomKeys(row, 0, row->num_keys, True);
229 XkbcFreeGeomRows(struct xkb_section * section, int first, int count, Bool freeAll)
231 _XkbFreeGeomNonLeafElems(freeAll, first, count,
232 §ion->num_rows, §ion->sz_rows,
233 (char **)§ion->rows, sizeof(struct xkb_row),
240 _XkbClearDoodad(char *doodad_in)
242 union xkb_doodad * doodad = (union xkb_doodad *)doodad_in;
244 switch (doodad->any.type) {
246 if (doodad->text.text) {
247 free(doodad->text.text);
248 doodad->text.text = NULL;
250 if (doodad->text.font) {
251 free(doodad->text.font);
252 doodad->text.font = NULL;
257 if (doodad->logo.logo_name) {
258 free(doodad->logo.logo_name);
259 doodad->logo.logo_name = NULL;
266 XkbcFreeGeomDoodads(union xkb_doodad * doodads, int nDoodads, Bool freeAll)
269 union xkb_doodad * doodad;
272 for (i = 0, doodad = doodads; i < nDoodads; i++, doodad++)
273 _XkbClearDoodad((char *)doodad);
280 _XkbClearSection(char *section_in)
282 struct xkb_section * section = (struct xkb_section *)section_in;
285 XkbcFreeGeomRows(section, 0, section->num_rows, True);
286 if (section->doodads) {
287 XkbcFreeGeomDoodads(section->doodads, section->num_doodads, True);
288 section->doodads = NULL;
293 XkbcFreeGeomSections(struct xkb_geometry * geom, int first, int count, Bool freeAll)
295 _XkbFreeGeomNonLeafElems(freeAll, first, count,
296 &geom->num_sections, &geom->sz_sections,
297 (char **)&geom->sections, sizeof(struct xkb_section),
302 XkbcFreeGeometry(struct xkb_geometry * geom, unsigned which, Bool freeMap)
308 which = XkbGeomAllMask;
310 if ((which & XkbGeomPropertiesMask) && geom->properties)
311 XkbcFreeGeomProperties(geom, 0, geom->num_properties, True);
313 if ((which & XkbGeomColorsMask) && geom->colors)
314 XkbcFreeGeomColors(geom, 0, geom->num_colors, True);
316 if ((which & XkbGeomShapesMask) && geom->shapes)
317 XkbcFreeGeomShapes(geom, 0, geom->num_shapes, True);
319 if ((which & XkbGeomSectionsMask) && geom->sections)
320 XkbcFreeGeomSections(geom, 0, geom->num_sections, True);
322 if ((which & XkbGeomDoodadsMask) && geom->doodads) {
323 XkbcFreeGeomDoodads(geom->doodads, geom->num_doodads, True);
324 geom->doodads = NULL;
325 geom->num_doodads = geom->sz_doodads = 0;
328 if ((which & XkbGeomKeyAliasesMask) && geom->key_aliases)
329 XkbcFreeGeomKeyAliases(geom, 0, geom->num_key_aliases, True);
332 if (geom->label_font) {
333 free(geom->label_font);
334 geom->label_font = NULL;
341 _XkbGeomAlloc(char **old, unsigned short *num, unsigned short *total,
342 int num_new, size_t sz_elem)
350 if ((*num) + num_new <= (*total))
353 *total = (*num) + num_new;
356 *old = (char *)realloc(*old, (*total) * sz_elem);
358 *old = (char *)calloc(*total, sz_elem);
366 bzero(&tmp[sz_elem * (*num)], num_new * sz_elem);
372 #define _XkbAllocProps(g, n) _XkbGeomAlloc((char **)&(g)->properties, \
373 &(g)->num_properties, \
374 &(g)->sz_properties, \
375 (n), sizeof(struct xkb_property))
376 #define _XkbAllocColors(g, n) _XkbGeomAlloc((char **)&(g)->colors, \
379 (n), sizeof(struct xkb_color))
380 #define _XkbAllocShapes(g, n) _XkbGeomAlloc((char **)&(g)->shapes, \
383 (n), sizeof(struct xkb_shape))
384 #define _XkbAllocSections(g, n) _XkbGeomAlloc((char **)&(g)->sections, \
385 &(g)->num_sections, \
387 (n), sizeof(struct xkb_section))
388 #define _XkbAllocDoodads(g, n) _XkbGeomAlloc((char **)&(g)->doodads, \
391 (n), sizeof(union xkb_doodad))
392 #define _XkbAllocKeyAliases(g, n) _XkbGeomAlloc((char **)&(g)->key_aliases, \
393 &(g)->num_key_aliases, \
394 &(g)->sz_key_aliases, \
395 (n), sizeof(struct xkb_key_alias))
397 #define _XkbAllocOutlines(s, n) _XkbGeomAlloc((char **)&(s)->outlines, \
398 &(s)->num_outlines, \
400 (n), sizeof(struct xkb_outline))
401 #define _XkbAllocRows(s, n) _XkbGeomAlloc((char **)&(s)->rows, \
404 (n), sizeof(struct xkb_row))
405 #define _XkbAllocPoints(o, n) _XkbGeomAlloc((char **)&(o)->points, \
408 (n), sizeof(struct xkb_point))
409 #define _XkbAllocKeys(r, n) _XkbGeomAlloc((char **)&(r)->keys, \
412 (n), sizeof(struct xkb_key))
413 #define _XkbAllocOverlays(s, n) _XkbGeomAlloc((char **)&(s)->overlays, \
414 &(s)->num_overlays, \
416 (n), sizeof(struct xkb_overlay))
417 #define _XkbAllocOverlayRows(o, n) _XkbGeomAlloc((char **)&(o)->rows, \
420 (n), sizeof(struct xkb_overlay_row))
421 #define _XkbAllocOverlayKeys(r, n) _XkbGeomAlloc((char **)&(r)->keys, \
424 (n), sizeof(struct xkb_overlay_key))
427 XkbcAllocGeomKeyAliases(struct xkb_geometry * geom, int nKeyAliases)
429 return _XkbAllocKeyAliases(geom, nKeyAliases);
433 XkbcAllocGeometry(struct xkb_desc * xkb, struct xkb_geometry_sizes * sizes)
435 struct xkb_geometry * geom;
439 xkb->geom = _XkbTypedCalloc(1, struct xkb_geometry);
445 if ((sizes->which & XkbGeomPropertiesMask) &&
446 ((rtrn = _XkbAllocProps(geom, sizes->num_properties)) != Success))
449 if ((sizes->which & XkbGeomColorsMask) &&
450 ((rtrn = _XkbAllocColors(geom, sizes->num_colors)) != Success))
453 if ((sizes->which & XkbGeomShapesMask) &&
454 ((rtrn = _XkbAllocShapes(geom, sizes->num_shapes)) != Success))
457 if ((sizes->which & XkbGeomSectionsMask) &&
458 ((rtrn = _XkbAllocSections(geom, sizes->num_sections)) != Success))
461 if ((sizes->which & XkbGeomDoodadsMask) &&
462 ((rtrn = _XkbAllocDoodads(geom, sizes->num_doodads)) != Success))
465 if ((sizes->which & XkbGeomKeyAliasesMask) &&
466 ((rtrn = _XkbAllocKeyAliases(geom, sizes->num_key_aliases)) != Success))
471 XkbcFreeGeometry(geom, XkbGeomAllMask, True);
476 struct xkb_property *
477 XkbcAddGeomProperty(struct xkb_geometry * geom,const char *name,const char *value)
480 register struct xkb_property * prop;
482 if ((!geom)||(!name)||(!value))
484 for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
485 if ((prop->name)&&(strcmp(name,prop->name)==0)) {
488 prop->value= (char *)malloc(strlen(value)+1);
490 strcpy(prop->value,value);
494 if ((geom->num_properties>=geom->sz_properties)&&
495 (_XkbAllocProps(geom,1)!=Success)) {
498 prop= &geom->properties[geom->num_properties];
499 prop->name= (char *)malloc(strlen(name)+1);
502 strcpy(prop->name,name);
503 prop->value= (char *)malloc(strlen(value)+1);
509 strcpy(prop->value,value);
510 geom->num_properties++;
515 XkbcAddGeomColor(struct xkb_geometry * geom,const char *spec,unsigned int pixel)
518 register struct xkb_color * color;
520 if ((!geom)||(!spec))
522 for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
523 if ((color->spec)&&(strcmp(color->spec,spec)==0)) {
528 if ((geom->num_colors>=geom->sz_colors)&&
529 (_XkbAllocColors(geom,1)!=Success)) {
532 color= &geom->colors[geom->num_colors];
534 color->spec= (char *)malloc(strlen(spec)+1);
537 strcpy(color->spec,spec);
543 XkbcAddGeomOutline(struct xkb_shape * shape,int sz_points)
545 struct xkb_outline * outline;
547 if ((!shape)||(sz_points<0))
549 if ((shape->num_outlines>=shape->sz_outlines)&&
550 (_XkbAllocOutlines(shape,1)!=Success)) {
553 outline= &shape->outlines[shape->num_outlines];
554 bzero(outline,sizeof(struct xkb_outline));
555 if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success))
557 shape->num_outlines++;
562 XkbcAddGeomShape(struct xkb_geometry * geom,uint32_t name,int sz_outlines)
564 struct xkb_shape * shape;
567 if ((!geom)||(!name)||(sz_outlines<0))
569 if (geom->num_shapes>0) {
570 for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) {
571 if (name==shape->name)
575 if ((geom->num_shapes>=geom->sz_shapes)&&
576 (_XkbAllocShapes(geom,1)!=Success))
578 shape= &geom->shapes[geom->num_shapes];
579 bzero(shape,sizeof(struct xkb_shape));
580 if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success))
583 shape->primary= shape->approx= NULL;
589 XkbcAddGeomKey(struct xkb_row * row)
591 struct xkb_key * key;
594 if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success))
596 key= &row->keys[row->num_keys++];
597 bzero(key,sizeof(struct xkb_key));
602 XkbcAddGeomRow(struct xkb_section * section,int sz_keys)
604 struct xkb_row * row;
606 if ((!section)||(sz_keys<0))
608 if ((section->num_rows>=section->sz_rows)&&
609 (_XkbAllocRows(section,1)!=Success))
611 row= §ion->rows[section->num_rows];
612 bzero(row,sizeof(struct xkb_row));
613 if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success))
620 XkbcAddGeomSection( struct xkb_geometry * geom,
627 struct xkb_section * section;
629 if ((!geom)||(name==None)||(sz_rows<0))
631 for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
632 if (section->name!=name)
634 if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))||
635 ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))||
636 ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success)))
640 if ((geom->num_sections>=geom->sz_sections)&&
641 (_XkbAllocSections(geom,1)!=Success))
643 section= &geom->sections[geom->num_sections];
644 if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))
646 if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
650 section->sz_rows= section->num_rows= 0;
655 geom->num_sections++;
660 XkbcAddGeomDoodad(struct xkb_geometry * geom,struct xkb_section * section,uint32_t name)
662 union xkb_doodad *old, *doodad;
663 register int i,nDoodads;
665 if ((!geom)||(name==None))
667 if ((section!=NULL)&&(section->num_doodads>0)) {
668 old= section->doodads;
669 nDoodads= section->num_doodads;
673 nDoodads= geom->num_doodads;
675 for (i=0,doodad=old;i<nDoodads;i++,doodad++) {
676 if (doodad->any.name==name)
680 if ((section->num_doodads>=geom->sz_doodads)&&
681 (_XkbAllocDoodads(section,1)!=Success)) {
684 doodad= §ion->doodads[section->num_doodads++];
687 if ((geom->num_doodads>=geom->sz_doodads)&&
688 (_XkbAllocDoodads(geom,1)!=Success))
690 doodad= &geom->doodads[geom->num_doodads++];
692 bzero(doodad,sizeof(union xkb_doodad));
693 doodad->any.name= name;
697 struct xkb_overlay_row *
698 XkbcAddGeomOverlayRow(struct xkb_overlay * overlay,int row_under,int sz_keys)
701 struct xkb_overlay_row * row;
703 if ((!overlay)||(sz_keys<0))
705 if (row_under>=overlay->section_under->num_rows)
707 for (i=0;i<overlay->num_rows;i++) {
708 if (overlay->rows[i].row_under==row_under) {
709 row= &overlay->rows[i];
710 if ((row->sz_keys<sz_keys)&&
711 (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) {
714 return &overlay->rows[i];
717 if ((overlay->num_rows>=overlay->sz_rows)&&
718 (_XkbAllocOverlayRows(overlay,1)!=Success))
720 row= &overlay->rows[overlay->num_rows];
721 bzero(row,sizeof(struct xkb_overlay_row));
722 if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success))
724 row->row_under= row_under;
730 XkbcAddGeomOverlay(struct xkb_section * section,uint32_t name,int sz_rows)
733 struct xkb_overlay * overlay;
735 if ((!section)||(name==None)||(sz_rows==0))
738 for (i=0,overlay=section->overlays;i<section->num_overlays;i++,overlay++) {
739 if (overlay->name==name) {
740 if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
745 if ((section->num_overlays>=section->sz_overlays)&&
746 (_XkbAllocOverlays(section,1)!=Success))
748 overlay= §ion->overlays[section->num_overlays];
749 if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
752 overlay->section_under= section;
753 section->num_overlays++;