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 <X11/extensions/XKBproto.h>
38 #include <X11/keysym.h>
39 #include "XKBlibint.h"
45 #include <X11/Xproto.h>
48 #include <X11/keysym.h>
49 #define XKBSRV_NEED_FILE_FUNCS
50 #include <X11/extensions/XKBsrv.h>
52 #endif /* XKB_IN_SERVER */
54 /***====================================================================***/
57 XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes)
62 if ((xkb==NULL)||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes)))
64 if ((which&XkbKeySymsMask)&&
65 ((!XkbIsLegalKeycode(xkb->min_key_code))||
66 (!XkbIsLegalKeycode(xkb->max_key_code))||
67 (xkb->max_key_code<xkb->min_key_code))) {
69 fprintf(stderr,"bad keycode (%d,%d) in XkbAllocClientMap\n",
70 xkb->min_key_code,xkb->max_key_code);
76 map= _XkbTypedCalloc(1,XkbClientMapRec);
83 if ((which&XkbKeyTypesMask)&&(nTotalTypes>0)) {
84 if (map->types==NULL) {
85 map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec);
89 map->size_types= nTotalTypes;
91 else if (map->size_types<nTotalTypes) {
92 XkbKeyTypeRec *prev_types = map->types;
94 map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
95 if (map->types==NULL) {
97 map->num_types= map->size_types= 0;
100 map->size_types= nTotalTypes;
101 bzero(&map->types[map->num_types],
102 ((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)));
105 if (which&XkbKeySymsMask) {
106 int nKeys= XkbNumKeys(xkb);
107 if (map->syms==NULL) {
108 map->size_syms= (nKeys*15)/10;
109 map->syms= _XkbTypedCalloc(map->size_syms,KeySym);
115 map->syms[0]= NoSymbol;
117 if (map->key_sym_map==NULL) {
118 i= xkb->max_key_code+1;
119 map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec);
120 if (map->key_sym_map==NULL)
124 if (which&XkbModifierMapMask) {
125 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
126 (!XkbIsLegalKeycode(xkb->max_key_code))||
127 (xkb->max_key_code<xkb->min_key_code))
129 if (map->modmap==NULL) {
130 i= xkb->max_key_code+1;
131 map->modmap= _XkbTypedCalloc(i,unsigned char);
132 if (map->modmap==NULL)
140 XkbAllocServerMap(XkbDescPtr xkb,unsigned which,unsigned nNewActions)
147 if (xkb->server==NULL) {
148 map= _XkbTypedCalloc(1,XkbServerMapRec);
151 for (i=0;i<XkbNumVirtualMods;i++) {
152 map->vmods[i]= XkbNoModifierMask;
156 else map= xkb->server;
157 if (which&XkbExplicitComponentsMask) {
158 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
159 (!XkbIsLegalKeycode(xkb->max_key_code))||
160 (xkb->max_key_code<xkb->min_key_code))
162 if (map->explicit==NULL) {
163 i= xkb->max_key_code+1;
164 map->explicit= _XkbTypedCalloc(i,unsigned char);
165 if (map->explicit==NULL)
169 if (which&XkbKeyActionsMask) {
170 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
171 (!XkbIsLegalKeycode(xkb->max_key_code))||
172 (xkb->max_key_code<xkb->min_key_code))
176 if (map->acts==NULL) {
177 map->acts= _XkbTypedCalloc((nNewActions+1),XkbAction);
181 map->size_acts= nNewActions+1;
183 else if ((map->size_acts-map->num_acts)<nNewActions) {
185 XkbAction *prev_acts = map->acts;
186 need= map->num_acts+nNewActions;
187 map->acts= _XkbTypedRealloc(map->acts,need,XkbAction);
188 if (map->acts==NULL) {
190 map->num_acts= map->size_acts= 0;
193 map->size_acts= need;
194 bzero(&map->acts[map->num_acts],
195 ((map->size_acts-map->num_acts)*sizeof(XkbAction)));
197 if (map->key_acts==NULL) {
198 i= xkb->max_key_code+1;
199 map->key_acts= _XkbTypedCalloc(i,unsigned short);
200 if (map->key_acts==NULL)
204 if (which&XkbKeyBehaviorsMask) {
205 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
206 (!XkbIsLegalKeycode(xkb->max_key_code))||
207 (xkb->max_key_code<xkb->min_key_code))
209 if (map->behaviors==NULL) {
210 i= xkb->max_key_code+1;
211 map->behaviors= _XkbTypedCalloc(i,XkbBehavior);
212 if (map->behaviors==NULL)
216 if (which&XkbVirtualModMapMask) {
217 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
218 (!XkbIsLegalKeycode(xkb->max_key_code))||
219 (xkb->max_key_code<xkb->min_key_code))
221 if (map->vmodmap==NULL) {
222 i= xkb->max_key_code+1;
223 map->vmodmap= _XkbTypedCalloc(i,unsigned short);
224 if (map->vmodmap==NULL)
231 /***====================================================================***/
234 XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into)
236 if ((!from)||(!into))
242 if (into->preserve) {
243 _XkbFree(into->preserve);
244 into->preserve= NULL;
246 if (into->level_names) {
247 _XkbFree(into->level_names);
248 into->level_names= NULL;
251 if ((from->map)&&(into->map_count>0)) {
252 into->map= _XkbTypedCalloc(into->map_count,XkbKTMapEntryRec);
255 memcpy(into->map,from->map,into->map_count*sizeof(XkbKTMapEntryRec));
257 if ((from->preserve)&&(into->map_count>0)) {
258 into->preserve= _XkbTypedCalloc(into->map_count,XkbModsRec);
261 memcpy(into->preserve,from->preserve,
262 into->map_count*sizeof(XkbModsRec));
264 if ((from->level_names)&&(into->num_levels>0)) {
265 into->level_names= _XkbTypedCalloc(into->num_levels,Atom);
266 if (!into->level_names)
268 memcpy(into->level_names,from->level_names,
269 into->num_levels*sizeof(Atom));
275 XkbCopyKeyTypes(XkbKeyTypePtr from,XkbKeyTypePtr into,int num_types)
279 if ((!from)||(!into)||(num_types<0))
281 for (i=0;i<num_types;i++) {
282 if ((rtrn= XkbCopyKeyType(from++,into++))!=Success)
289 XkbAddKeyType( XkbDescPtr xkb,
300 if ((!xkb)||(num_lvls<1))
303 if ((map)&&(map->types)) {
304 for (i=0;i<map->num_types;i++) {
305 if (map->types[i].name==name) {
307 status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
308 return (status==Success?&map->types[i]:NULL);
312 if ((!map)||(!map->types)||(!map->num_types<XkbNumRequiredTypes)) {
313 tmp= XkbNumRequiredTypes+1;
314 if (XkbAllocClientMap(xkb,XkbKeyTypesMask,tmp)!=Success)
319 if (map->num_types<=XkbKeypadIndex)
321 if (map->num_types<=XkbAlphabeticIndex)
322 tmp|= XkbAlphabeticMask;
323 if (map->num_types<=XkbTwoLevelIndex)
324 tmp|= XkbTwoLevelMask;
325 if (map->num_types<=XkbOneLevelIndex)
326 tmp|= XkbOneLevelMask;
327 if (XkbInitCanonicalKeyTypes(xkb,tmp,XkbNoModifier)==Success) {
328 for (i=0;i<map->num_types;i++) {
330 if (map->types[i].name!=name)
332 status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
333 return (status==Success?&map->types[i]:NULL);
337 if ((map->num_types<=map->size_types)&&
338 (XkbAllocClientMap(xkb,XkbKeyTypesMask,map->num_types+1)!=Success)) {
341 type= &map->types[map->num_types];
343 bzero((char *)type,sizeof(XkbKeyTypeRec));
344 type->num_levels= num_lvls;
345 type->map_count= map_count;
348 type->map= _XkbTypedCalloc(map_count,XkbKTMapEntryRec);
354 type->preserve= _XkbTypedCalloc(map_count,XkbModsRec);
355 if (!type->preserve) {
366 XkbResizeKeyType( XkbDescPtr xkb,
373 KeyCode matchingKeys[XkbMaxKeyCount],nMatchingKeys;
375 if ((type_ndx<0)||(type_ndx>=xkb->map->num_types)||(map_count<0)||
379 case XkbOneLevelIndex:
383 case XkbTwoLevelIndex:
384 case XkbAlphabeticIndex:
390 type= &xkb->map->types[type_ndx];
395 if (type->preserve!=NULL)
396 _XkbFree(type->preserve);
397 type->preserve= NULL;
401 XkbKTMapEntryRec *prev_map = type->map;
403 if ((map_count>type->map_count)||(type->map==NULL))
404 type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec);
411 XkbModsRec *prev_preserve = type->preserve;
413 if ((map_count>type->map_count)||(type->preserve==NULL)) {
414 type->preserve= _XkbTypedRealloc(type->preserve,map_count,
417 if (!type->preserve) {
419 _XkbFree(prev_preserve);
423 else if (type->preserve!=NULL) {
424 _XkbFree(type->preserve);
425 type->preserve= NULL;
427 type->map_count= map_count;
430 if ((new_num_lvls>type->num_levels)||(type->level_names==NULL)) {
431 Atom * prev_level_names = type->level_names;
433 type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom);
434 if (!type->level_names) {
435 if (prev_level_names)
436 _XkbFree(prev_level_names);
442 * If the width of the type changed, we might have to resize the symbol
443 * maps for any keys that use the type for one or more groups. This is
444 * expensive, so we'll try to cull out any keys that are obviously okay:
446 * - keys that have a group width <= the old width are okay (because
447 * they could not possibly have been associated with the old type)
448 * If the key type increased in size:
449 * - keys that already have a group width >= to the new width are okay
450 * + keys that have a group width >= the old width but < the new width
451 * might have to be enlarged.
452 * If the key type decreased in size:
453 * - keys that have a group width > the old width don't have to be
454 * resized (because they must have some other wider type associated
456 * + keys that have a group width == the old width might have to be
458 * The possibilities marked with '+' require us to examine the key types
459 * associated with each group for the key.
461 bzero(matchingKeys,XkbMaxKeyCount*sizeof(KeyCode));
463 if (new_num_lvls>type->num_levels) {
466 int width,match,nResize;
467 register int i,g,nSyms;
470 for (nTotal=1,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
471 width= XkbKeyGroupsWidth(xkb,i);
472 if (width<type->num_levels)
474 for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
475 if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
476 matchingKeys[nMatchingKeys++]= i;
480 if ((!match)||(width>=new_num_lvls))
481 nTotal+= XkbKeyNumSyms(xkb,i);
483 nTotal+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
489 xkb->map->size_syms= (nTotal*12)/10;
490 newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
495 for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
496 if (matchingKeys[nextMatch]==i) {
499 width= XkbKeyGroupsWidth(xkb,i);
500 pOld= XkbKeySymsPtr(xkb,i);
501 for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) {
502 memcpy(&newSyms[nSyms+(new_num_lvls*g)],&pOld[width*g],
503 width*sizeof(KeySym));
505 xkb->map->key_sym_map[i].offset= nSyms;
506 nSyms+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
509 memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),
510 XkbKeyNumSyms(xkb,i)*sizeof(KeySym));
511 xkb->map->key_sym_map[i].offset= nSyms;
512 nSyms+= XkbKeyNumSyms(xkb,i);
515 type->num_levels= new_num_lvls;
516 _XkbFree(xkb->map->syms);
517 xkb->map->syms= newSyms;
518 xkb->map->num_syms= nSyms;
522 else if (new_num_lvls<type->num_levels) {
525 for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
526 width= XkbKeyGroupsWidth(xkb,i);
527 if (width<type->num_levels)
529 for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
530 if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
531 matchingKeys[nMatchingKeys++]= i;
537 if (nMatchingKeys>0) {
540 if (new_num_lvls>type->num_levels)
541 firstClear= type->num_levels;
542 else firstClear= new_num_lvls;
543 for (i=0;i<nMatchingKeys;i++) {
547 key= matchingKeys[i];
548 width= XkbKeyGroupsWidth(xkb,key);
549 nClear= width-firstClear;
550 pSyms= XkbKeySymsPtr(xkb,key);
551 for (g=XkbKeyNumGroups(xkb,key)-1;g>=0;g--) {
552 if (XkbKeyKeyTypeIndex(xkb,key,g)==type_ndx) {
554 bzero(&pSyms[g*width+firstClear],nClear*sizeof(KeySym));
559 type->num_levels= new_num_lvls;
564 XkbResizeKeySyms(XkbDescPtr xkb,int key,int needed)
566 register int i,nSyms,nKeySyms;
571 xkb->map->key_sym_map[key].offset= 0;
572 return xkb->map->syms;
574 nOldSyms= XkbKeyNumSyms(xkb,key);
575 if (nOldSyms>=(unsigned)needed) {
576 return XkbKeySymsPtr(xkb,key);
578 if (xkb->map->size_syms-xkb->map->num_syms>=(unsigned)needed) {
580 memcpy(&xkb->map->syms[xkb->map->num_syms],XkbKeySymsPtr(xkb,key),
581 nOldSyms*sizeof(KeySym));
583 if ((needed-nOldSyms)>0) {
584 bzero(&xkb->map->syms[xkb->map->num_syms+XkbKeyNumSyms(xkb,key)],
585 (needed-nOldSyms)*sizeof(KeySym));
587 xkb->map->key_sym_map[key].offset = xkb->map->num_syms;
588 xkb->map->num_syms+= needed;
589 return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
591 xkb->map->size_syms+= (needed>32?needed:32);
592 newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
595 newSyms[0]= NoSymbol;
597 for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
600 nCopy= nKeySyms= XkbKeyNumSyms(xkb,i);
601 if ((nKeySyms==0)&&(i!=key))
606 memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),nCopy*sizeof(KeySym));
608 bzero(&newSyms[nSyms+nCopy],(nKeySyms-nCopy)*sizeof(KeySym));
609 xkb->map->key_sym_map[i].offset = nSyms;
612 _XkbFree(xkb->map->syms);
613 xkb->map->syms = newSyms;
614 xkb->map->num_syms = nSyms;
615 return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
619 _ExtendRange( unsigned int old_flags,
623 unsigned char * old_num)
625 if ((old_flags&flag)==0) {
631 int last= (*old_min)+(*old_num)-1;
632 if (newKC<*old_min) {
634 *old_num= (last-newKC)+1;
636 else if (newKC>last) {
637 *old_num= (newKC-(*old_min))+1;
644 XkbChangeKeycodeRange( XkbDescPtr xkb,
647 XkbChangesPtr changes)
651 if ((!xkb)||(minKC<XkbMinLegalKeyCode)||(maxKC>XkbMaxLegalKeyCode))
655 if (minKC<xkb->min_key_code) {
657 changes->map.min_key_code= minKC;
658 tmp= xkb->min_key_code-minKC;
660 if (xkb->map->key_sym_map) {
661 bzero((char *)&xkb->map->key_sym_map[minKC],
662 tmp*sizeof(XkbSymMapRec));
664 changes->map.changed= _ExtendRange(changes->map.changed,
665 XkbKeySymsMask,minKC,
666 &changes->map.first_key_sym,
667 &changes->map.num_key_syms);
670 if (xkb->map->modmap) {
671 bzero((char *)&xkb->map->modmap[minKC],tmp);
673 changes->map.changed= _ExtendRange(changes->map.changed,
674 XkbModifierMapMask,minKC,
675 &changes->map.first_modmap_key,
676 &changes->map.num_modmap_keys);
681 if (xkb->server->behaviors) {
682 bzero((char *)&xkb->server->behaviors[minKC],
683 tmp*sizeof(XkbBehavior));
685 changes->map.changed= _ExtendRange(changes->map.changed,
686 XkbKeyBehaviorsMask,minKC,
687 &changes->map.first_key_behavior,
688 &changes->map.num_key_behaviors);
691 if (xkb->server->key_acts) {
692 bzero((char *)&xkb->server->key_acts[minKC],
693 tmp*sizeof(unsigned short));
695 changes->map.changed= _ExtendRange(changes->map.changed,
696 XkbKeyActionsMask,minKC,
697 &changes->map.first_key_act,
698 &changes->map.num_key_acts);
701 if (xkb->server->vmodmap) {
702 bzero((char *)&xkb->server->vmodmap[minKC],
703 tmp*sizeof(unsigned short));
705 changes->map.changed= _ExtendRange(changes->map.changed,
706 XkbVirtualModMapMask,minKC,
707 &changes->map.first_modmap_key,
708 &changes->map.num_vmodmap_keys);
712 if ((xkb->names)&&(xkb->names->keys)) {
713 bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec));
715 changes->names.changed= _ExtendRange(changes->names.changed,
716 XkbKeyNamesMask,minKC,
717 &changes->names.first_key,
718 &changes->names.num_keys);
721 xkb->min_key_code= minKC;
723 if (maxKC>xkb->max_key_code) {
725 changes->map.max_key_code= maxKC;
726 tmp= maxKC-xkb->max_key_code;
728 if (xkb->map->key_sym_map) {
729 XkbSymMapRec *prev_key_sym_map = xkb->map->key_sym_map;
731 xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,
732 (maxKC+1),XkbSymMapRec);
733 if (!xkb->map->key_sym_map) {
734 _XkbFree(prev_key_sym_map);
737 bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],
738 tmp*sizeof(XkbSymMapRec));
740 changes->map.changed= _ExtendRange(changes->map.changed,
741 XkbKeySymsMask,maxKC,
742 &changes->map.first_key_sym,
743 &changes->map.num_key_syms);
746 if (xkb->map->modmap) {
747 unsigned char *prev_modmap = xkb->map->modmap;
749 xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,
750 (maxKC+1),unsigned char);
751 if (!xkb->map->modmap) {
752 _XkbFree(prev_modmap);
755 bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp);
757 changes->map.changed= _ExtendRange(changes->map.changed,
758 XkbModifierMapMask,maxKC,
759 &changes->map.first_modmap_key,
760 &changes->map.num_modmap_keys);
765 if (xkb->server->behaviors) {
766 XkbBehavior *prev_behaviors = xkb->server->behaviors;
768 xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,
769 (maxKC+1),XkbBehavior);
770 if (!xkb->server->behaviors) {
771 _XkbFree(prev_behaviors);
774 bzero((char *)&xkb->server->behaviors[xkb->max_key_code],
775 tmp*sizeof(XkbBehavior));
777 changes->map.changed= _ExtendRange(changes->map.changed,
778 XkbKeyBehaviorsMask,maxKC,
779 &changes->map.first_key_behavior,
780 &changes->map.num_key_behaviors);
783 if (xkb->server->key_acts) {
784 unsigned short *prev_key_acts = xkb->server->key_acts;
786 xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,
787 (maxKC+1),unsigned short);
788 if (!xkb->server->key_acts) {
789 _XkbFree(prev_key_acts);
792 bzero((char *)&xkb->server->key_acts[xkb->max_key_code],
793 tmp*sizeof(unsigned short));
795 changes->map.changed= _ExtendRange(changes->map.changed,
796 XkbKeyActionsMask,maxKC,
797 &changes->map.first_key_act,
798 &changes->map.num_key_acts);
801 if (xkb->server->vmodmap) {
802 unsigned short *prev_vmodmap = xkb->server->vmodmap;
804 xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,
805 (maxKC+1),unsigned short);
806 if (!xkb->server->vmodmap) {
807 _XkbFree(prev_vmodmap);
810 bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],
811 tmp*sizeof(unsigned short));
813 changes->map.changed= _ExtendRange(changes->map.changed,
814 XkbVirtualModMapMask,maxKC,
815 &changes->map.first_modmap_key,
816 &changes->map.num_vmodmap_keys);
820 if ((xkb->names)&&(xkb->names->keys)) {
821 XkbKeyNameRec *prev_keys = xkb->names->keys;
823 xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,
824 (maxKC+1),XkbKeyNameRec);
825 if (!xkb->names->keys) {
829 bzero((char *)&xkb->names->keys[xkb->max_key_code],
830 tmp*sizeof(XkbKeyNameRec));
832 changes->names.changed= _ExtendRange(changes->names.changed,
833 XkbKeyNamesMask,maxKC,
834 &changes->names.first_key,
835 &changes->names.num_keys);
838 xkb->max_key_code= maxKC;
844 XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed)
846 register int i,nActs;
850 xkb->server->key_acts[key]= 0;
853 if (XkbKeyHasActions(xkb,key)&&(XkbKeyNumSyms(xkb,key)>=(unsigned)needed))
854 return XkbKeyActionsPtr(xkb,key);
855 if (xkb->server->size_acts-xkb->server->num_acts>=(unsigned)needed) {
856 xkb->server->key_acts[key]= xkb->server->num_acts;
857 xkb->server->num_acts+= needed;
858 return &xkb->server->acts[xkb->server->key_acts[key]];
860 xkb->server->size_acts= xkb->server->num_acts+needed+8;
861 newActs = _XkbTypedCalloc(xkb->server->size_acts,XkbAction);
864 newActs[0].type = XkbSA_NoAction;
866 for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
869 if ((xkb->server->key_acts[i]==0)&&(i!=key))
872 nCopy= nKeyActs= XkbKeyNumActions(xkb,i);
880 memcpy(&newActs[nActs],XkbKeyActionsPtr(xkb,i),
881 nCopy*sizeof(XkbAction));
883 bzero(&newActs[nActs+nCopy],(nKeyActs-nCopy)*sizeof(XkbAction));
884 xkb->server->key_acts[i]= nActs;
887 _XkbFree(xkb->server->acts);
888 xkb->server->acts = newActs;
889 xkb->server->num_acts= nActs;
890 return &xkb->server->acts[xkb->server->key_acts[key]];
894 XkbFreeClientMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
898 if ((xkb==NULL)||(xkb->map==NULL))
901 what= XkbAllClientInfoMask;
903 if (what&XkbKeyTypesMask) {
904 if (map->types!=NULL) {
905 if (map->num_types>0) {
908 for (i=0,type=map->types;i<map->num_types;i++,type++) {
909 if (type->map!=NULL) {
913 if (type->preserve!=NULL) {
914 _XkbFree(type->preserve);
915 type->preserve= NULL;
918 if (type->level_names!=NULL) {
919 _XkbFree(type->level_names);
920 type->level_names= NULL;
924 _XkbFree(map->types);
925 map->num_types= map->size_types= 0;
929 if (what&XkbKeySymsMask) {
930 if (map->key_sym_map!=NULL) {
931 _XkbFree(map->key_sym_map);
932 map->key_sym_map= NULL;
934 if (map->syms!=NULL) {
936 map->size_syms= map->num_syms= 0;
940 if ((what&XkbModifierMapMask)&&(map->modmap!=NULL)) {
941 _XkbFree(map->modmap);
952 XkbFreeServerMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
956 if ((xkb==NULL)||(xkb->server==NULL))
959 what= XkbAllServerInfoMask;
961 if ((what&XkbExplicitComponentsMask)&&(map->explicit!=NULL)) {
962 _XkbFree(map->explicit);
965 if (what&XkbKeyActionsMask) {
966 if (map->key_acts!=NULL) {
967 _XkbFree(map->key_acts);
970 if (map->acts!=NULL) {
972 map->num_acts= map->size_acts= 0;
976 if ((what&XkbKeyBehaviorsMask)&&(map->behaviors!=NULL)) {
977 _XkbFree(map->behaviors);
978 map->behaviors= NULL;
980 if ((what&XkbVirtualModMapMask)&&(map->vmodmap!=NULL)) {
981 _XkbFree(map->vmodmap);
986 _XkbFree(xkb->server);