1 /************************************************************
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.
25 ********************************************************/
27 #ifdef HAVE_DIX_CONFIG_H
28 #include <dix-config.h>
29 #elif defined(HAVE_CONFIG_H)
37 #include "XKBlibint.h"
38 #include <X11/extensions/XKBgeom.h>
39 #include <X11/extensions/XKBproto.h>
45 #include <X11/Xproto.h>
48 #include <X11/extensions/XKBsrv.h>
49 #include <X11/extensions/XKBgeom.h>
51 #endif /* XKB_IN_SERVER */
54 #define Size_t unsigned int
59 /***====================================================================***/
62 _XkbFreeGeomLeafElems( Bool freeAll,
65 unsigned short * num_inout,
66 unsigned short * sz_inout,
70 if ((freeAll)||(*elems==NULL)) {
71 *num_inout= *sz_inout= 0;
79 if ((first>=(*num_inout))||(first<0)||(count<1))
82 if (first+count>=(*num_inout)) {
83 /* truncating the array is easy */
90 extra= ((*num_inout)-(first+count))*elem_sz;
92 memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],extra);
98 typedef void (*ContentsClearFunc)(
103 _XkbFreeGeomNonLeafElems( Bool freeAll,
106 unsigned short * num_inout,
107 unsigned short * sz_inout,
109 unsigned int elem_sz,
110 ContentsClearFunc freeFunc)
119 else if ((first>=(*num_inout))||(first<0)||(count<1))
121 else if (first+count>(*num_inout))
122 count= (*num_inout)-first;
129 for (i=0;i<count;i++) {
135 (*num_inout)= (*sz_inout)= 0;
141 else if (first+count>=(*num_inout))
144 i= ((*num_inout)-(first+count))*elem_sz;
146 memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],i);
147 (*num_inout)-= count;
152 /***====================================================================***/
155 _XkbClearProperty(char *prop_in)
157 XkbPropertyPtr prop= (XkbPropertyPtr)prop_in;
160 _XkbFree(prop->name);
164 _XkbFree(prop->value);
171 XkbFreeGeomProperties( XkbGeometryPtr geom,
176 _XkbFreeGeomNonLeafElems(freeAll,first,count,
177 &geom->num_properties,&geom->sz_properties,
178 (char **)&geom->properties,
179 sizeof(XkbPropertyRec),_XkbClearProperty);
183 /***====================================================================***/
186 XkbFreeGeomKeyAliases( XkbGeometryPtr geom,
191 _XkbFreeGeomLeafElems(freeAll,first,count,
192 &geom->num_key_aliases,&geom->sz_key_aliases,
193 (char **)&geom->key_aliases,
194 sizeof(XkbKeyAliasRec));
198 /***====================================================================***/
201 _XkbClearColor(char *color_in)
203 XkbColorPtr color= (XkbColorPtr)color_in;
206 _XkbFree(color->spec);
211 XkbFreeGeomColors(XkbGeometryPtr geom,int first,int count,Bool freeAll)
213 _XkbFreeGeomNonLeafElems(freeAll,first,count,
214 &geom->num_colors,&geom->sz_colors,
215 (char **)&geom->colors,
216 sizeof(XkbColorRec),_XkbClearColor);
220 /***====================================================================***/
223 XkbFreeGeomPoints(XkbOutlinePtr outline,int first,int count,Bool freeAll)
225 _XkbFreeGeomLeafElems(freeAll,first,count,
226 &outline->num_points,&outline->sz_points,
227 (char **)&outline->points,
228 sizeof(XkbPointRec));
232 /***====================================================================***/
235 _XkbClearOutline(char *outline_in)
237 XkbOutlinePtr outline= (XkbOutlinePtr)outline_in;
239 if (outline->points!=NULL)
240 XkbFreeGeomPoints(outline,0,outline->num_points,True);
245 XkbFreeGeomOutlines(XkbShapePtr shape,int first,int count,Bool freeAll)
247 _XkbFreeGeomNonLeafElems(freeAll,first,count,
248 &shape->num_outlines,&shape->sz_outlines,
249 (char **)&shape->outlines,
250 sizeof(XkbOutlineRec),_XkbClearOutline);
255 /***====================================================================***/
258 _XkbClearShape(char *shape_in)
260 XkbShapePtr shape= (XkbShapePtr)shape_in;
263 XkbFreeGeomOutlines(shape,0,shape->num_outlines,True);
268 XkbFreeGeomShapes(XkbGeometryPtr geom,int first,int count,Bool freeAll)
270 _XkbFreeGeomNonLeafElems(freeAll,first,count,
271 &geom->num_shapes,&geom->sz_shapes,
272 (char **)&geom->shapes,
273 sizeof(XkbShapeRec),_XkbClearShape);
277 /***====================================================================***/
280 XkbFreeGeomOverlayKeys(XkbOverlayRowPtr row,int first,int count,Bool freeAll)
282 _XkbFreeGeomLeafElems(freeAll,first,count,
283 &row->num_keys,&row->sz_keys,
285 sizeof(XkbOverlayKeyRec));
289 /***====================================================================***/
292 _XkbClearOverlayRow(char *row_in)
294 XkbOverlayRowPtr row= (XkbOverlayRowPtr)row_in;
297 XkbFreeGeomOverlayKeys(row,0,row->num_keys,True);
302 XkbFreeGeomOverlayRows(XkbOverlayPtr overlay,int first,int count,Bool freeAll)
304 _XkbFreeGeomNonLeafElems(freeAll,first,count,
305 &overlay->num_rows,&overlay->sz_rows,
306 (char **)&overlay->rows,
307 sizeof(XkbOverlayRowRec),_XkbClearOverlayRow);
311 /***====================================================================***/
314 _XkbClearOverlay(char *overlay_in)
316 XkbOverlayPtr overlay= (XkbOverlayPtr)overlay_in;
318 if (overlay->rows!=NULL)
319 XkbFreeGeomOverlayRows(overlay,0,overlay->num_rows,True);
324 XkbFreeGeomOverlays(XkbSectionPtr section,int first,int count,Bool freeAll)
326 _XkbFreeGeomNonLeafElems(freeAll,first,count,
327 §ion->num_overlays,§ion->sz_overlays,
328 (char **)§ion->overlays,
329 sizeof(XkbOverlayRec),_XkbClearOverlay);
333 /***====================================================================***/
336 XkbFreeGeomKeys(XkbRowPtr row,int first,int count,Bool freeAll)
338 _XkbFreeGeomLeafElems(freeAll,first,count,
339 &row->num_keys,&row->sz_keys,
345 /***====================================================================***/
348 _XkbClearRow(char *row_in)
350 XkbRowPtr row= (XkbRowPtr)row_in;
353 XkbFreeGeomKeys(row,0,row->num_keys,True);
358 XkbFreeGeomRows(XkbSectionPtr section,int first,int count,Bool freeAll)
360 _XkbFreeGeomNonLeafElems(freeAll,first,count,
361 §ion->num_rows,§ion->sz_rows,
362 (char **)§ion->rows,
363 sizeof(XkbRowRec),_XkbClearRow);
366 /***====================================================================***/
369 _XkbClearSection(char *section_in)
371 XkbSectionPtr section= (XkbSectionPtr)section_in;
373 if (section->rows!=NULL)
374 XkbFreeGeomRows(section,0,section->num_rows,True);
375 if (section->doodads!=NULL) {
376 XkbFreeGeomDoodads(section->doodads,section->num_doodads,True);
377 section->doodads= NULL;
383 XkbFreeGeomSections(XkbGeometryPtr geom,int first,int count,Bool freeAll)
385 _XkbFreeGeomNonLeafElems(freeAll,first,count,
386 &geom->num_sections,&geom->sz_sections,
387 (char **)&geom->sections,
388 sizeof(XkbSectionRec),_XkbClearSection);
392 /***====================================================================***/
395 _XkbClearDoodad(char *doodad_in)
397 XkbDoodadPtr doodad= (XkbDoodadPtr)doodad_in;
399 switch (doodad->any.type) {
402 if (doodad->text.text!=NULL) {
403 _XkbFree(doodad->text.text);
404 doodad->text.text= NULL;
406 if (doodad->text.font!=NULL) {
407 _XkbFree(doodad->text.font);
408 doodad->text.font= NULL;
414 if (doodad->logo.logo_name!=NULL) {
415 _XkbFree(doodad->logo.logo_name);
416 doodad->logo.logo_name= NULL;
425 XkbFreeGeomDoodads(XkbDoodadPtr doodads,int nDoodads,Bool freeAll)
428 register XkbDoodadPtr doodad;
431 for (i=0,doodad= doodads;i<nDoodads;i++,doodad++) {
432 _XkbClearDoodad((char *)doodad);
441 XkbFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
446 which= XkbGeomAllMask;
447 if ((which&XkbGeomPropertiesMask)&&(geom->properties!=NULL))
448 XkbFreeGeomProperties(geom,0,geom->num_properties,True);
449 if ((which&XkbGeomColorsMask)&&(geom->colors!=NULL))
450 XkbFreeGeomColors(geom,0,geom->num_colors,True);
451 if ((which&XkbGeomShapesMask)&&(geom->shapes!=NULL))
452 XkbFreeGeomShapes(geom,0,geom->num_shapes,True);
453 if ((which&XkbGeomSectionsMask)&&(geom->sections!=NULL))
454 XkbFreeGeomSections(geom,0,geom->num_sections,True);
455 if ((which&XkbGeomDoodadsMask)&&(geom->doodads!= NULL)) {
456 XkbFreeGeomDoodads(geom->doodads,geom->num_doodads,True);
458 geom->num_doodads= geom->sz_doodads= 0;
460 if ((which&XkbGeomKeyAliasesMask)&&(geom->key_aliases!=NULL))
461 XkbFreeGeomKeyAliases(geom,0,geom->num_key_aliases,True);
463 if (geom->label_font!=NULL) {
464 _XkbFree(geom->label_font);
465 geom->label_font= NULL;
472 /***====================================================================***/
475 _XkbGeomAlloc( XPointer * old,
476 unsigned short * num,
477 unsigned short * total,
486 if ((*num)+num_new<=(*total))
489 *total= (*num)+num_new;
491 (*old)= (XPointer)_XkbRealloc((*old),(*total)*sz_elem);
492 else (*old)= (XPointer)_XkbCalloc((*total),sz_elem);
499 char *tmp= (char *)(*old);
500 bzero(&tmp[sz_elem*(*num)],(num_new*sz_elem));
505 #define _XkbAllocProps(g,n) _XkbGeomAlloc((XPointer *)&(g)->properties,\
506 &(g)->num_properties,&(g)->sz_properties,\
507 (n),sizeof(XkbPropertyRec))
508 #define _XkbAllocColors(g,n) _XkbGeomAlloc((XPointer *)&(g)->colors,\
509 &(g)->num_colors,&(g)->sz_colors,\
510 (n),sizeof(XkbColorRec))
511 #define _XkbAllocShapes(g,n) _XkbGeomAlloc((XPointer *)&(g)->shapes,\
512 &(g)->num_shapes,&(g)->sz_shapes,\
513 (n),sizeof(XkbShapeRec))
514 #define _XkbAllocSections(g,n) _XkbGeomAlloc((XPointer *)&(g)->sections,\
515 &(g)->num_sections,&(g)->sz_sections,\
516 (n),sizeof(XkbSectionRec))
517 #define _XkbAllocDoodads(g,n) _XkbGeomAlloc((XPointer *)&(g)->doodads,\
518 &(g)->num_doodads,&(g)->sz_doodads,\
519 (n),sizeof(XkbDoodadRec))
520 #define _XkbAllocKeyAliases(g,n) _XkbGeomAlloc((XPointer *)&(g)->key_aliases,\
521 &(g)->num_key_aliases,&(g)->sz_key_aliases,\
522 (n),sizeof(XkbKeyAliasRec))
524 #define _XkbAllocOutlines(s,n) _XkbGeomAlloc((XPointer *)&(s)->outlines,\
525 &(s)->num_outlines,&(s)->sz_outlines,\
526 (n),sizeof(XkbOutlineRec))
527 #define _XkbAllocRows(s,n) _XkbGeomAlloc((XPointer *)&(s)->rows,\
528 &(s)->num_rows,&(s)->sz_rows,\
529 (n),sizeof(XkbRowRec))
530 #define _XkbAllocPoints(o,n) _XkbGeomAlloc((XPointer *)&(o)->points,\
531 &(o)->num_points,&(o)->sz_points,\
532 (n),sizeof(XkbPointRec))
533 #define _XkbAllocKeys(r,n) _XkbGeomAlloc((XPointer *)&(r)->keys,\
534 &(r)->num_keys,&(r)->sz_keys,\
535 (n),sizeof(XkbKeyRec))
536 #define _XkbAllocOverlays(s,n) _XkbGeomAlloc((XPointer *)&(s)->overlays,\
537 &(s)->num_overlays,&(s)->sz_overlays,\
538 (n),sizeof(XkbOverlayRec))
539 #define _XkbAllocOverlayRows(o,n) _XkbGeomAlloc((XPointer *)&(o)->rows,\
540 &(o)->num_rows,&(o)->sz_rows,\
541 (n),sizeof(XkbOverlayRowRec))
542 #define _XkbAllocOverlayKeys(r,n) _XkbGeomAlloc((XPointer *)&(r)->keys,\
543 &(r)->num_keys,&(r)->sz_keys,\
544 (n),sizeof(XkbOverlayKeyRec))
547 XkbAllocGeomProps(XkbGeometryPtr geom,int nProps)
549 return _XkbAllocProps(geom,nProps);
553 XkbAllocGeomColors(XkbGeometryPtr geom,int nColors)
555 return _XkbAllocColors(geom,nColors);
559 XkbAllocGeomKeyAliases(XkbGeometryPtr geom,int nKeyAliases)
561 return _XkbAllocKeyAliases(geom,nKeyAliases);
565 XkbAllocGeomShapes(XkbGeometryPtr geom,int nShapes)
567 return _XkbAllocShapes(geom,nShapes);
571 XkbAllocGeomSections(XkbGeometryPtr geom,int nSections)
573 return _XkbAllocSections(geom,nSections);
577 XkbAllocGeomOverlays(XkbSectionPtr section,int nOverlays)
579 return _XkbAllocOverlays(section,nOverlays);
583 XkbAllocGeomOverlayRows(XkbOverlayPtr overlay,int nRows)
585 return _XkbAllocOverlayRows(overlay,nRows);
589 XkbAllocGeomOverlayKeys(XkbOverlayRowPtr row,int nKeys)
591 return _XkbAllocOverlayKeys(row,nKeys);
595 XkbAllocGeomDoodads(XkbGeometryPtr geom,int nDoodads)
597 return _XkbAllocDoodads(geom,nDoodads);
601 XkbAllocGeomSectionDoodads(XkbSectionPtr section,int nDoodads)
603 return _XkbAllocDoodads(section,nDoodads);
607 XkbAllocGeomOutlines(XkbShapePtr shape,int nOL)
609 return _XkbAllocOutlines(shape,nOL);
613 XkbAllocGeomRows(XkbSectionPtr section,int nRows)
615 return _XkbAllocRows(section,nRows);
619 XkbAllocGeomPoints(XkbOutlinePtr ol,int nPts)
621 return _XkbAllocPoints(ol,nPts);
625 XkbAllocGeomKeys(XkbRowPtr row,int nKeys)
627 return _XkbAllocKeys(row,nKeys);
631 XkbAllocGeometry(XkbDescPtr xkb,XkbGeometrySizesPtr sizes)
636 if (xkb->geom==NULL) {
637 xkb->geom= _XkbTypedCalloc(1,XkbGeometryRec);
642 if ((sizes->which&XkbGeomPropertiesMask)&&
643 ((rtrn=_XkbAllocProps(geom,sizes->num_properties))!=Success)) {
646 if ((sizes->which&XkbGeomColorsMask)&&
647 ((rtrn=_XkbAllocColors(geom,sizes->num_colors))!=Success)) {
650 if ((sizes->which&XkbGeomShapesMask)&&
651 ((rtrn=_XkbAllocShapes(geom,sizes->num_shapes))!=Success)) {
654 if ((sizes->which&XkbGeomSectionsMask)&&
655 ((rtrn=_XkbAllocSections(geom,sizes->num_sections))!=Success)) {
658 if ((sizes->which&XkbGeomDoodadsMask)&&
659 ((rtrn=_XkbAllocDoodads(geom,sizes->num_doodads))!=Success)) {
662 if ((sizes->which&XkbGeomKeyAliasesMask)&&
663 ((rtrn=_XkbAllocKeyAliases(geom,sizes->num_key_aliases))!=Success)) {
668 XkbFreeGeometry(geom,XkbGeomAllMask,True);
673 /***====================================================================***/
676 XkbAddGeomProperty(XkbGeometryPtr geom,char *name,char *value)
679 register XkbPropertyPtr prop;
681 if ((!geom)||(!name)||(!value))
683 for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
684 if ((prop->name)&&(strcmp(name,prop->name)==0)) {
686 _XkbFree(prop->value);
687 prop->value= strdup(value);
691 if ((geom->num_properties>=geom->sz_properties)&&
692 (_XkbAllocProps(geom,1)!=Success)) {
695 prop= &geom->properties[geom->num_properties];
696 prop->name= strdup(name);
699 prop->value= strdup(value);
701 _XkbFree(prop->name);
705 geom->num_properties++;
710 XkbAddGeomKeyAlias(XkbGeometryPtr geom,char *aliasStr,char *realStr)
713 register XkbKeyAliasPtr alias;
715 if ((!geom)||(!aliasStr)||(!realStr)||(!aliasStr[0])||(!realStr[0]))
717 for (i=0,alias=geom->key_aliases;i<geom->num_key_aliases;i++,alias++) {
718 if (strncmp(alias->alias,aliasStr,XkbKeyNameLength)==0) {
719 bzero(alias->real,XkbKeyNameLength);
720 strncpy(alias->real,realStr,XkbKeyNameLength);
724 if ((geom->num_key_aliases>=geom->sz_key_aliases)&&
725 (_XkbAllocKeyAliases(geom,1)!=Success)) {
728 alias= &geom->key_aliases[geom->num_key_aliases];
729 bzero(alias,sizeof(XkbKeyAliasRec));
730 strncpy(alias->alias,aliasStr,XkbKeyNameLength);
731 strncpy(alias->real,realStr,XkbKeyNameLength);
732 geom->num_key_aliases++;
737 XkbAddGeomColor(XkbGeometryPtr geom,char *spec,unsigned int pixel)
740 register XkbColorPtr color;
742 if ((!geom)||(!spec))
744 for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
745 if ((color->spec)&&(strcmp(color->spec,spec)==0)) {
750 if ((geom->num_colors>=geom->sz_colors)&&
751 (_XkbAllocColors(geom,1)!=Success)) {
754 color= &geom->colors[geom->num_colors];
756 color->spec= strdup(spec);
764 XkbAddGeomOutline(XkbShapePtr shape,int sz_points)
766 XkbOutlinePtr outline;
768 if ((!shape)||(sz_points<0))
770 if ((shape->num_outlines>=shape->sz_outlines)&&
771 (_XkbAllocOutlines(shape,1)!=Success)) {
774 outline= &shape->outlines[shape->num_outlines];
775 bzero(outline,sizeof(XkbOutlineRec));
776 if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success))
778 shape->num_outlines++;
783 XkbAddGeomShape(XkbGeometryPtr geom,Atom name,int sz_outlines)
788 if ((!geom)||(!name)||(sz_outlines<0))
790 if (geom->num_shapes>0) {
791 for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) {
792 if (name==shape->name)
796 if ((geom->num_shapes>=geom->sz_shapes)&&
797 (_XkbAllocShapes(geom,1)!=Success))
799 shape= &geom->shapes[geom->num_shapes];
800 bzero(shape,sizeof(XkbShapeRec));
801 if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success))
804 shape->primary= shape->approx= NULL;
810 XkbAddGeomKey(XkbRowPtr row)
815 if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success))
817 key= &row->keys[row->num_keys++];
818 bzero(key,sizeof(XkbKeyRec));
823 XkbAddGeomRow(XkbSectionPtr section,int sz_keys)
827 if ((!section)||(sz_keys<0))
829 if ((section->num_rows>=section->sz_rows)&&
830 (_XkbAllocRows(section,1)!=Success))
832 row= §ion->rows[section->num_rows];
833 bzero(row,sizeof(XkbRowRec));
834 if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success))
841 XkbAddGeomSection( XkbGeometryPtr geom,
848 XkbSectionPtr section;
850 if ((!geom)||(name==None)||(sz_rows<0))
852 for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
853 if (section->name!=name)
855 if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))||
856 ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))||
857 ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success)))
861 if ((geom->num_sections>=geom->sz_sections)&&
862 (_XkbAllocSections(geom,1)!=Success))
864 section= &geom->sections[geom->num_sections];
865 if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))
867 if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
869 _XkbFree(section->rows);
871 section->sz_rows= section->num_rows= 0;
876 geom->num_sections++;
881 XkbAddGeomDoodad(XkbGeometryPtr geom,XkbSectionPtr section,Atom name)
883 XkbDoodadPtr old,doodad;
884 register int i,nDoodads;
886 if ((!geom)||(name==None))
888 if ((section!=NULL)&&(section->num_doodads>0)) {
889 old= section->doodads;
890 nDoodads= section->num_doodads;
894 nDoodads= geom->num_doodads;
896 for (i=0,doodad=old;i<nDoodads;i++,doodad++) {
897 if (doodad->any.name==name)
901 if ((section->num_doodads>=geom->sz_doodads)&&
902 (_XkbAllocDoodads(section,1)!=Success)) {
905 doodad= §ion->doodads[section->num_doodads++];
908 if ((geom->num_doodads>=geom->sz_doodads)&&
909 (_XkbAllocDoodads(geom,1)!=Success))
911 doodad= &geom->doodads[geom->num_doodads++];
913 bzero(doodad,sizeof(XkbDoodadRec));
914 doodad->any.name= name;
919 XkbAddGeomOverlayKey( XkbOverlayPtr overlay,
920 XkbOverlayRowPtr row,
925 XkbOverlayKeyPtr key;
926 XkbSectionPtr section;
930 if ((!overlay)||(!row)||(!over)||(!under))
932 section= overlay->section_under;
933 if (row->row_under>=section->num_rows)
935 row_under= §ion->rows[row->row_under];
936 for (i=0,found=False;i<row_under->num_keys;i++) {
937 if (strncmp(under,row_under->keys[i].name.name,XkbKeyNameLength)==0) {
944 if ((row->num_keys>=row->sz_keys)&&(_XkbAllocOverlayKeys(row,1)!=Success))
946 key= &row->keys[row->num_keys];
947 strncpy(key->under.name,under,XkbKeyNameLength);
948 strncpy(key->over.name,over,XkbKeyNameLength);
954 XkbAddGeomOverlayRow(XkbOverlayPtr overlay,int row_under,int sz_keys)
957 XkbOverlayRowPtr row;
959 if ((!overlay)||(sz_keys<0))
961 if (row_under>=overlay->section_under->num_rows)
963 for (i=0;i<overlay->num_rows;i++) {
964 if (overlay->rows[i].row_under==row_under) {
965 row= &overlay->rows[i];
966 if ((row->sz_keys<sz_keys)&&
967 (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) {
970 return &overlay->rows[i];
973 if ((overlay->num_rows>=overlay->sz_rows)&&
974 (_XkbAllocOverlayRows(overlay,1)!=Success))
976 row= &overlay->rows[overlay->num_rows];
977 bzero(row,sizeof(XkbOverlayRowRec));
978 if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success))
980 row->row_under= row_under;
986 XkbAddGeomOverlay(XkbSectionPtr section,Atom name,int sz_rows)
989 XkbOverlayPtr overlay;
991 if ((!section)||(name==None)||(sz_rows==0))
994 for (i=0,overlay=section->overlays;i<section->num_overlays;i++,overlay++) {
995 if (overlay->name==name) {
996 if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
1001 if ((section->num_overlays>=section->sz_overlays)&&
1002 (_XkbAllocOverlays(section,1)!=Success))
1004 overlay= §ion->overlays[section->num_overlays];
1005 if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
1007 overlay->name= name;
1008 overlay->section_under= section;
1009 section->num_overlays++;