File: | src/xkb/XKBMAlloc.c |
Location: | line 330, column 7 |
Description: | Dereference of null pointer |
1 | /************************************************************ | ||
2 | Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. | ||
3 | |||
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. | ||
15 | |||
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. | ||
24 | |||
25 | ********************************************************/ | ||
26 | |||
27 | #ifdef HAVE_DIX_CONFIG_H | ||
28 | #include <dix-config.h> | ||
29 | #elif defined(HAVE_CONFIG_H1) | ||
30 | #include <config.h> | ||
31 | #endif | ||
32 | |||
33 | #ifndef XKB_IN_SERVER | ||
34 | |||
35 | #include <stdio.h> | ||
36 | #include "Xlibint.h" | ||
37 | #include <X11/extensions/XKBproto.h> | ||
38 | #include <X11/keysym.h> | ||
39 | #include "XKBlibint.h" | ||
40 | |||
41 | #else | ||
42 | |||
43 | #include <stdio.h> | ||
44 | #include <X11/X.h> | ||
45 | #include <X11/Xproto.h> | ||
46 | #include "misc.h" | ||
47 | #include "inputstr.h" | ||
48 | #include <X11/keysym.h> | ||
49 | #define XKBSRV_NEED_FILE_FUNCS | ||
50 | #include <X11/extensions/XKBsrv.h> | ||
51 | |||
52 | #endif /* XKB_IN_SERVER */ | ||
53 | |||
54 | /***====================================================================***/ | ||
55 | |||
56 | Statusint | ||
57 | XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes) | ||
58 | { | ||
59 | register int i; | ||
60 | XkbClientMapPtr map; | ||
61 | |||
62 | if ((xkb==NULL((void*)0))||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes(3 +1)))) | ||
63 | return BadValue2; | ||
64 | if ((which&XkbKeySymsMask(1<<1))&& | ||
65 | ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
66 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
67 | (xkb->max_key_code<xkb->min_key_code))) { | ||
68 | #ifdef DEBUG | ||
69 | fprintf(stderrstderr,"bad keycode (%d,%d) in XkbAllocClientMap\n", | ||
70 | xkb->min_key_code,xkb->max_key_code); | ||
71 | #endif | ||
72 | return BadValue2; | ||
73 | } | ||
74 | |||
75 | if (xkb->map==NULL((void*)0)) { | ||
76 | map= _XkbTypedCalloc(1,XkbClientMapRec)((XkbClientMapRec *)calloc((((1)) == 0 ? 1 : ((1))), (sizeof( XkbClientMapRec)))); | ||
77 | if (map==NULL((void*)0)) | ||
78 | return BadAlloc11; | ||
79 | xkb->map= map; | ||
80 | } | ||
81 | else map= xkb->map; | ||
82 | |||
83 | if ((which&XkbKeyTypesMask(1<<0))&&(nTotalTypes>0)) { | ||
84 | if (map->types==NULL((void*)0)) { | ||
85 | map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec)((XkbKeyTypeRec *)calloc((((nTotalTypes)) == 0 ? 1 : ((nTotalTypes ))), (sizeof(XkbKeyTypeRec)))); | ||
86 | if (map->types==NULL((void*)0)) | ||
87 | return BadAlloc11; | ||
88 | map->num_types= 0; | ||
89 | map->size_types= nTotalTypes; | ||
90 | } | ||
91 | else if (map->size_types<nTotalTypes) { | ||
92 | XkbKeyTypeRec *prev_types = map->types; | ||
93 | |||
94 | map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec)((map->types)?(XkbKeyTypeRec *)realloc(((map->types)), ( ((nTotalTypes)*sizeof(XkbKeyTypeRec)) == 0 ? 1 : ((nTotalTypes )*sizeof(XkbKeyTypeRec)))):((XkbKeyTypeRec *)calloc((((nTotalTypes )) == 0 ? 1 : ((nTotalTypes))), (sizeof(XkbKeyTypeRec))))); | ||
95 | if (map->types==NULL((void*)0)) { | ||
96 | _XkbFree(prev_types)free((prev_types)); | ||
97 | map->num_types= map->size_types= 0; | ||
98 | return BadAlloc11; | ||
99 | } | ||
100 | map->size_types= nTotalTypes; | ||
101 | bzero(&map->types[map->num_types],memset(&map->types[map->num_types],0,((map->size_types -map->num_types)*sizeof(XkbKeyTypeRec))) | ||
102 | ((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)))memset(&map->types[map->num_types],0,((map->size_types -map->num_types)*sizeof(XkbKeyTypeRec))); | ||
103 | } | ||
104 | } | ||
105 | if (which&XkbKeySymsMask(1<<1)) { | ||
106 | int nKeys= XkbNumKeys(xkb)((xkb)->max_key_code-(xkb)->min_key_code+1); | ||
107 | if (map->syms==NULL((void*)0)) { | ||
108 | map->size_syms= (nKeys*15)/10; | ||
109 | map->syms= _XkbTypedCalloc(map->size_syms,KeySym)((KeySym *)calloc((((map->size_syms)) == 0 ? 1 : ((map-> size_syms))), (sizeof(KeySym)))); | ||
110 | if (!map->syms) { | ||
111 | map->size_syms= 0; | ||
112 | return BadAlloc11; | ||
113 | } | ||
114 | map->num_syms= 1; | ||
115 | map->syms[0]= NoSymbol0L; | ||
116 | } | ||
117 | if (map->key_sym_map==NULL((void*)0)) { | ||
118 | i= xkb->max_key_code+1; | ||
119 | map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec)((XkbSymMapRec *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(XkbSymMapRec )))); | ||
120 | if (map->key_sym_map==NULL((void*)0)) | ||
121 | return BadAlloc11; | ||
122 | } | ||
123 | } | ||
124 | if (which&XkbModifierMapMask(1<<2)) { | ||
125 | if ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
126 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
127 | (xkb->max_key_code<xkb->min_key_code)) | ||
128 | return BadMatch8; | ||
129 | if (map->modmap==NULL((void*)0)) { | ||
130 | i= xkb->max_key_code+1; | ||
131 | map->modmap= _XkbTypedCalloc(i,unsigned char)((unsigned char *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(unsigned char)))); | ||
132 | if (map->modmap==NULL((void*)0)) | ||
133 | return BadAlloc11; | ||
134 | } | ||
135 | } | ||
136 | return Success0; | ||
137 | } | ||
138 | |||
139 | Statusint | ||
140 | XkbAllocServerMap(XkbDescPtr xkb,unsigned which,unsigned nNewActions) | ||
141 | { | ||
142 | register int i; | ||
143 | XkbServerMapPtr map; | ||
144 | |||
145 | if (xkb==NULL((void*)0)) | ||
146 | return BadMatch8; | ||
147 | if (xkb->server==NULL((void*)0)) { | ||
148 | map= _XkbTypedCalloc(1,XkbServerMapRec)((XkbServerMapRec *)calloc((((1)) == 0 ? 1 : ((1))), (sizeof( XkbServerMapRec)))); | ||
149 | if (map==NULL((void*)0)) | ||
150 | return BadAlloc11; | ||
151 | for (i=0;i<XkbNumVirtualMods16;i++) { | ||
152 | map->vmods[i]= XkbNoModifierMask0; | ||
153 | } | ||
154 | xkb->server= map; | ||
155 | } | ||
156 | else map= xkb->server; | ||
157 | if (which&XkbExplicitComponentsMask(1<<3)) { | ||
158 | if ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
159 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
160 | (xkb->max_key_code<xkb->min_key_code)) | ||
161 | return BadMatch8; | ||
162 | if (map->explicit==NULL((void*)0)) { | ||
163 | i= xkb->max_key_code+1; | ||
164 | map->explicit= _XkbTypedCalloc(i,unsigned char)((unsigned char *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(unsigned char)))); | ||
165 | if (map->explicit==NULL((void*)0)) | ||
166 | return BadAlloc11; | ||
167 | } | ||
168 | } | ||
169 | if (which&XkbKeyActionsMask(1<<4)) { | ||
170 | if ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
171 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
172 | (xkb->max_key_code<xkb->min_key_code)) | ||
173 | return BadMatch8; | ||
174 | if (nNewActions<1) | ||
175 | nNewActions= 1; | ||
176 | if (map->acts==NULL((void*)0)) { | ||
177 | map->acts= _XkbTypedCalloc((nNewActions+1),XkbAction)((XkbAction *)calloc(((((nNewActions+1))) == 0 ? 1 : (((nNewActions +1)))), (sizeof(XkbAction)))); | ||
178 | if (map->acts==NULL((void*)0)) | ||
179 | return BadAlloc11; | ||
180 | map->num_acts= 1; | ||
181 | map->size_acts= nNewActions+1; | ||
182 | } | ||
183 | else if ((map->size_acts-map->num_acts)<nNewActions) { | ||
184 | unsigned need; | ||
185 | XkbAction *prev_acts = map->acts; | ||
186 | need= map->num_acts+nNewActions; | ||
187 | map->acts= _XkbTypedRealloc(map->acts,need,XkbAction)((map->acts)?(XkbAction *)realloc(((map->acts)), (((need )*sizeof(XkbAction)) == 0 ? 1 : ((need)*sizeof(XkbAction)))): ((XkbAction *)calloc((((need)) == 0 ? 1 : ((need))), (sizeof( XkbAction))))); | ||
188 | if (map->acts==NULL((void*)0)) { | ||
189 | _XkbFree(prev_acts)free((prev_acts)); | ||
190 | map->num_acts= map->size_acts= 0; | ||
191 | return BadAlloc11; | ||
192 | } | ||
193 | map->size_acts= need; | ||
194 | bzero(&map->acts[map->num_acts],memset(&map->acts[map->num_acts],0,((map->size_acts -map->num_acts)*sizeof(XkbAction))) | ||
195 | ((map->size_acts-map->num_acts)*sizeof(XkbAction)))memset(&map->acts[map->num_acts],0,((map->size_acts -map->num_acts)*sizeof(XkbAction))); | ||
196 | } | ||
197 | if (map->key_acts==NULL((void*)0)) { | ||
198 | i= xkb->max_key_code+1; | ||
199 | map->key_acts= _XkbTypedCalloc(i,unsigned short)((unsigned short *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(unsigned short)))); | ||
200 | if (map->key_acts==NULL((void*)0)) | ||
201 | return BadAlloc11; | ||
202 | } | ||
203 | } | ||
204 | if (which&XkbKeyBehaviorsMask(1<<5)) { | ||
205 | if ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
206 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
207 | (xkb->max_key_code<xkb->min_key_code)) | ||
208 | return BadMatch8; | ||
209 | if (map->behaviors==NULL((void*)0)) { | ||
210 | i= xkb->max_key_code+1; | ||
211 | map->behaviors= _XkbTypedCalloc(i,XkbBehavior)((XkbBehavior *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(XkbBehavior )))); | ||
212 | if (map->behaviors==NULL((void*)0)) | ||
213 | return BadAlloc11; | ||
214 | } | ||
215 | } | ||
216 | if (which&XkbVirtualModMapMask(1<<7)) { | ||
217 | if ((!XkbIsLegalKeycode(xkb->min_key_code)((xkb->min_key_code)>=8))|| | ||
218 | (!XkbIsLegalKeycode(xkb->max_key_code)((xkb->max_key_code)>=8))|| | ||
219 | (xkb->max_key_code<xkb->min_key_code)) | ||
220 | return BadMatch8; | ||
221 | if (map->vmodmap==NULL((void*)0)) { | ||
222 | i= xkb->max_key_code+1; | ||
223 | map->vmodmap= _XkbTypedCalloc(i,unsigned short)((unsigned short *)calloc((((i)) == 0 ? 1 : ((i))), (sizeof(unsigned short)))); | ||
224 | if (map->vmodmap==NULL((void*)0)) | ||
225 | return BadAlloc11; | ||
226 | } | ||
227 | } | ||
228 | return Success0; | ||
229 | } | ||
230 | |||
231 | /***====================================================================***/ | ||
232 | |||
233 | Statusint | ||
234 | XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into) | ||
235 | { | ||
236 | if ((!from)||(!into)) | ||
237 | return BadMatch8; | ||
238 | if (into->map) { | ||
239 | _XkbFree(into->map)free((into->map)); | ||
240 | into->map= NULL((void*)0); | ||
241 | } | ||
242 | if (into->preserve) { | ||
243 | _XkbFree(into->preserve)free((into->preserve)); | ||
244 | into->preserve= NULL((void*)0); | ||
245 | } | ||
246 | if (into->level_names) { | ||
247 | _XkbFree(into->level_names)free((into->level_names)); | ||
248 | into->level_names= NULL((void*)0); | ||
249 | } | ||
250 | *into= *from; | ||
251 | if ((from->map)&&(into->map_count>0)) { | ||
252 | into->map= _XkbTypedCalloc(into->map_count,XkbKTMapEntryRec)((XkbKTMapEntryRec *)calloc((((into->map_count)) == 0 ? 1 : ((into->map_count))), (sizeof(XkbKTMapEntryRec)))); | ||
253 | if (!into->map) | ||
254 | return BadAlloc11; | ||
255 | memcpy(into->map,from->map,into->map_count*sizeof(XkbKTMapEntryRec)); | ||
256 | } | ||
257 | if ((from->preserve)&&(into->map_count>0)) { | ||
258 | into->preserve= _XkbTypedCalloc(into->map_count,XkbModsRec)((XkbModsRec *)calloc((((into->map_count)) == 0 ? 1 : ((into ->map_count))), (sizeof(XkbModsRec)))); | ||
259 | if (!into->preserve) | ||
260 | return BadAlloc11; | ||
261 | memcpy(into->preserve,from->preserve, | ||
262 | into->map_count*sizeof(XkbModsRec)); | ||
263 | } | ||
264 | if ((from->level_names)&&(into->num_levels>0)) { | ||
265 | into->level_names= _XkbTypedCalloc(into->num_levels,Atom)((Atom *)calloc((((into->num_levels)) == 0 ? 1 : ((into-> num_levels))), (sizeof(Atom)))); | ||
266 | if (!into->level_names) | ||
267 | return BadAlloc11; | ||
268 | memcpy(into->level_names,from->level_names, | ||
269 | into->num_levels*sizeof(Atom)); | ||
270 | } | ||
271 | return Success0; | ||
272 | } | ||
273 | |||
274 | Statusint | ||
275 | XkbCopyKeyTypes(XkbKeyTypePtr from,XkbKeyTypePtr into,int num_types) | ||
276 | { | ||
277 | register int i,rtrn; | ||
278 | |||
279 | if ((!from)||(!into)||(num_types<0)) | ||
280 | return BadMatch8; | ||
281 | for (i=0;i<num_types;i++) { | ||
282 | if ((rtrn= XkbCopyKeyType(from++,into++))!=Success0) | ||
283 | return rtrn; | ||
284 | } | ||
285 | return Success0; | ||
286 | } | ||
287 | |||
288 | XkbKeyTypePtr | ||
289 | XkbAddKeyType( XkbDescPtr xkb, | ||
290 | Atom name, | ||
291 | int map_count, | ||
292 | Boolint want_preserve, | ||
293 | int num_lvls) | ||
294 | { | ||
295 | register int i; | ||
296 | unsigned tmp; | ||
297 | XkbKeyTypePtr type; | ||
298 | XkbClientMapPtr map; | ||
299 | |||
300 | if ((!xkb)||(num_lvls<1)) | ||
| |||
| |||
| |||
301 | return NULL((void*)0); | ||
302 | map= xkb->map; | ||
303 | if ((map)&&(map->types)) { | ||
| |||
304 | for (i=0;i<map->num_types;i++) { | ||
305 | if (map->types[i].name==name) { | ||
306 | Statusint status; | ||
307 | status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls); | ||
308 | return (status==Success0?&map->types[i]:NULL((void*)0)); | ||
309 | } | ||
310 | } | ||
311 | } | ||
312 | if ((!map)||(!map->types)||(!map->num_types<XkbNumRequiredTypes(3 +1))) { | ||
| |||
313 | tmp= XkbNumRequiredTypes(3 +1)+1; | ||
314 | if (XkbAllocClientMap(xkb,XkbKeyTypesMask(1<<0),tmp)!=Success0) | ||
| |||
315 | return NULL((void*)0); | ||
316 | if (!map) | ||
| |||
317 | map = xkb->map; | ||
318 | tmp= 0; | ||
319 | if (map->num_types<=XkbKeypadIndex3) | ||
| |||
320 | tmp|= XkbKeypadMask(1<<3); | ||
321 | if (map->num_types<=XkbAlphabeticIndex2) | ||
| |||
322 | tmp|= XkbAlphabeticMask(1<<2); | ||
323 | if (map->num_types<=XkbTwoLevelIndex1) | ||
| |||
324 | tmp|= XkbTwoLevelMask(1<<1); | ||
325 | if (map->num_types<=XkbOneLevelIndex0) | ||
| |||
326 | tmp|= XkbOneLevelMask(1<<0); | ||
327 | if (XkbInitCanonicalKeyTypes(xkb,tmp,XkbNoModifier0xff)==Success0) { | ||
| |||
328 | for (i=0;i<map->num_types;i++) { | ||
| |||
329 | Statusint status; | ||
330 | if (map->types[i].name!=name) | ||
| |||
331 | continue; | ||
332 | status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls); | ||
333 | return (status==Success0?&map->types[i]:NULL((void*)0)); | ||
334 | } | ||
335 | } | ||
336 | } | ||
337 | if ((map->num_types<=map->size_types)&& | ||
338 | (XkbAllocClientMap(xkb,XkbKeyTypesMask(1<<0),map->num_types+1)!=Success0)) { | ||
339 | return NULL((void*)0); | ||
340 | } | ||
341 | type= &map->types[map->num_types]; | ||
342 | map->num_types++; | ||
343 | bzero((char *)type,sizeof(XkbKeyTypeRec))memset((char *)type,0,sizeof(XkbKeyTypeRec)); | ||
344 | type->num_levels= num_lvls; | ||
345 | type->map_count= map_count; | ||
346 | type->name= name; | ||
347 | if (map_count>0) { | ||
348 | type->map= _XkbTypedCalloc(map_count,XkbKTMapEntryRec)((XkbKTMapEntryRec *)calloc((((map_count)) == 0 ? 1 : ((map_count ))), (sizeof(XkbKTMapEntryRec)))); | ||
349 | if (!type->map) { | ||
350 | map->num_types--; | ||
351 | return NULL((void*)0); | ||
352 | } | ||
353 | if (want_preserve) { | ||
354 | type->preserve= _XkbTypedCalloc(map_count,XkbModsRec)((XkbModsRec *)calloc((((map_count)) == 0 ? 1 : ((map_count)) ), (sizeof(XkbModsRec)))); | ||
355 | if (!type->preserve) { | ||
356 | _XkbFree(type->map)free((type->map)); | ||
357 | map->num_types--; | ||
358 | return NULL((void*)0); | ||
359 | } | ||
360 | } | ||
361 | } | ||
362 | return type; | ||
363 | } | ||
364 | |||
365 | Statusint | ||
366 | XkbResizeKeyType( XkbDescPtr xkb, | ||
367 | int type_ndx, | ||
368 | int map_count, | ||
369 | Boolint want_preserve, | ||
370 | int new_num_lvls) | ||
371 | { | ||
372 | XkbKeyTypePtr type; | ||
373 | KeyCode matchingKeys[XkbMaxKeyCount(255 -8 +1)],nMatchingKeys; | ||
374 | |||
375 | if ((type_ndx<0)||(type_ndx>=xkb->map->num_types)||(map_count<0)|| | ||
376 | (new_num_lvls<1)) | ||
377 | return BadValue2; | ||
378 | switch (type_ndx) { | ||
379 | case XkbOneLevelIndex0: | ||
380 | if (new_num_lvls!=1) | ||
381 | return BadMatch8; | ||
382 | break; | ||
383 | case XkbTwoLevelIndex1: | ||
384 | case XkbAlphabeticIndex2: | ||
385 | case XkbKeypadIndex3: | ||
386 | if (new_num_lvls!=2) | ||
387 | return BadMatch8; | ||
388 | break; | ||
389 | } | ||
390 | type= &xkb->map->types[type_ndx]; | ||
391 | if (map_count==0) { | ||
392 | if (type->map!=NULL((void*)0)) | ||
393 | _XkbFree(type->map)free((type->map)); | ||
394 | type->map= NULL((void*)0); | ||
395 | if (type->preserve!=NULL((void*)0)) | ||
396 | _XkbFree(type->preserve)free((type->preserve)); | ||
397 | type->preserve= NULL((void*)0); | ||
398 | type->map_count= 0; | ||
399 | } | ||
400 | else { | ||
401 | XkbKTMapEntryRec *prev_map = type->map; | ||
402 | |||
403 | if ((map_count>type->map_count)||(type->map==NULL((void*)0))) | ||
404 | type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec)((type->map)?(XkbKTMapEntryRec *)realloc(((type->map)), (((map_count)*sizeof(XkbKTMapEntryRec)) == 0 ? 1 : ((map_count )*sizeof(XkbKTMapEntryRec)))):((XkbKTMapEntryRec *)calloc(((( map_count)) == 0 ? 1 : ((map_count))), (sizeof(XkbKTMapEntryRec ))))); | ||
405 | if (!type->map) { | ||
406 | if (prev_map) | ||
407 | _XkbFree(prev_map)free((prev_map)); | ||
408 | return BadAlloc11; | ||
409 | } | ||
410 | if (want_preserve) { | ||
411 | XkbModsRec *prev_preserve = type->preserve; | ||
412 | |||
413 | if ((map_count>type->map_count)||(type->preserve==NULL((void*)0))) { | ||
414 | type->preserve= _XkbTypedRealloc(type->preserve,map_count,((type->preserve)?(XkbModsRec *)realloc(((type->preserve )), (((map_count)*sizeof(XkbModsRec)) == 0 ? 1 : ((map_count) *sizeof(XkbModsRec)))):((XkbModsRec *)calloc((((map_count)) == 0 ? 1 : ((map_count))), (sizeof(XkbModsRec))))) | ||
415 | XkbModsRec)((type->preserve)?(XkbModsRec *)realloc(((type->preserve )), (((map_count)*sizeof(XkbModsRec)) == 0 ? 1 : ((map_count) *sizeof(XkbModsRec)))):((XkbModsRec *)calloc((((map_count)) == 0 ? 1 : ((map_count))), (sizeof(XkbModsRec))))); | ||
416 | } | ||
417 | if (!type->preserve) { | ||
418 | if (prev_preserve) | ||
419 | _XkbFree(prev_preserve)free((prev_preserve)); | ||
420 | return BadAlloc11; | ||
421 | } | ||
422 | } | ||
423 | else if (type->preserve!=NULL((void*)0)) { | ||
424 | _XkbFree(type->preserve)free((type->preserve)); | ||
425 | type->preserve= NULL((void*)0); | ||
426 | } | ||
427 | type->map_count= map_count; | ||
428 | } | ||
429 | |||
430 | if ((new_num_lvls>type->num_levels)||(type->level_names==NULL((void*)0))) { | ||
431 | Atom * prev_level_names = type->level_names; | ||
432 | |||
433 | type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom)((type->level_names)?(Atom *)realloc(((type->level_names )), (((new_num_lvls)*sizeof(Atom)) == 0 ? 1 : ((new_num_lvls) *sizeof(Atom)))):((Atom *)calloc((((new_num_lvls)) == 0 ? 1 : ((new_num_lvls))), (sizeof(Atom))))); | ||
434 | if (!type->level_names) { | ||
435 | if (prev_level_names) | ||
436 | _XkbFree(prev_level_names)free((prev_level_names)); | ||
437 | return BadAlloc11; | ||
438 | } | ||
439 | } | ||
440 | /* | ||
441 | * Here's the theory: | ||
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: | ||
445 | * In any case: | ||
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 | ||
455 | * with some group). | ||
456 | * + keys that have a group width == the old width might have to be | ||
457 | * shrunk. | ||
458 | * The possibilities marked with '+' require us to examine the key types | ||
459 | * associated with each group for the key. | ||
460 | */ | ||
461 | bzero(matchingKeys,XkbMaxKeyCount*sizeof(KeyCode))memset(matchingKeys,0,(255 -8 +1)*sizeof(KeyCode)); | ||
462 | nMatchingKeys= 0; | ||
463 | if (new_num_lvls>type->num_levels) { | ||
464 | int nTotal; | ||
465 | KeySym * newSyms; | ||
466 | int width,match,nResize; | ||
467 | register int i,g,nSyms; | ||
468 | |||
469 | nResize= 0; | ||
470 | for (nTotal=1,i=xkb->min_key_code;i<=xkb->max_key_code;i++) { | ||
471 | width= XkbKeyGroupsWidth(xkb,i)((((xkb)->map)->key_sym_map[i].width)); | ||
472 | if (width<type->num_levels) | ||
473 | continue; | ||
474 | for (match=0,g=XkbKeyNumGroups(xkb,i)((((((xkb)->map)->key_sym_map[(i)].group_info)&0x0f )))-1;(g>=0)&&(!match);g--) { | ||
475 | if (XkbKeyKeyTypeIndex(xkb,i,g)((((xkb)->map)->key_sym_map[i].kt_index[g&0x3]))==type_ndx) { | ||
476 | matchingKeys[nMatchingKeys++]= i; | ||
477 | match= 1; | ||
478 | } | ||
479 | } | ||
480 | if ((!match)||(width>=new_num_lvls)) | ||
481 | nTotal+= XkbKeyNumSyms(xkb,i)(((((xkb)->map)->key_sym_map[(i)].width)*(((((xkb)-> map)->key_sym_map[(i)].group_info)&0x0f)))); | ||
482 | else { | ||
483 | nTotal+= XkbKeyNumGroups(xkb,i)((((((xkb)->map)->key_sym_map[(i)].group_info)&0x0f )))*new_num_lvls; | ||
484 | nResize++; | ||
485 | } | ||
486 | } | ||
487 | if (nResize>0) { | ||
488 | int nextMatch; | ||
489 | xkb->map->size_syms= (nTotal*12)/10; | ||
490 | newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym)((KeySym *)calloc((((xkb->map->size_syms)) == 0 ? 1 : ( (xkb->map->size_syms))), (sizeof(KeySym)))); | ||
491 | if (newSyms==NULL((void*)0)) | ||
492 | return BadAlloc11; | ||
493 | nextMatch= 0; | ||
494 | nSyms= 1; | ||
495 | for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { | ||
496 | if (matchingKeys[nextMatch]==i) { | ||
497 | KeySym *pOld; | ||
498 | nextMatch++; | ||
499 | width= XkbKeyGroupsWidth(xkb,i)((((xkb)->map)->key_sym_map[i].width)); | ||
500 | pOld= XkbKeySymsPtr(xkb,i)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(i)].offset)])); | ||
501 | for (g=XkbKeyNumGroups(xkb,i)((((((xkb)->map)->key_sym_map[(i)].group_info)&0x0f )))-1;g>=0;g--) { | ||
502 | memcpy(&newSyms[nSyms+(new_num_lvls*g)],&pOld[width*g], | ||
503 | width*sizeof(KeySym)); | ||
504 | } | ||
505 | xkb->map->key_sym_map[i].offset= nSyms; | ||
506 | nSyms+= XkbKeyNumGroups(xkb,i)((((((xkb)->map)->key_sym_map[(i)].group_info)&0x0f )))*new_num_lvls; | ||
507 | } | ||
508 | else { | ||
509 | memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(i)].offset)])), | ||
510 | XkbKeyNumSyms(xkb,i)(((((xkb)->map)->key_sym_map[(i)].width)*(((((xkb)-> map)->key_sym_map[(i)].group_info)&0x0f))))*sizeof(KeySym)); | ||
511 | xkb->map->key_sym_map[i].offset= nSyms; | ||
512 | nSyms+= XkbKeyNumSyms(xkb,i)(((((xkb)->map)->key_sym_map[(i)].width)*(((((xkb)-> map)->key_sym_map[(i)].group_info)&0x0f)))); | ||
513 | } | ||
514 | } | ||
515 | type->num_levels= new_num_lvls; | ||
516 | _XkbFree(xkb->map->syms)free((xkb->map->syms)); | ||
517 | xkb->map->syms= newSyms; | ||
518 | xkb->map->num_syms= nSyms; | ||
519 | return Success0; | ||
520 | } | ||
521 | } | ||
522 | else if (new_num_lvls<type->num_levels) { | ||
523 | int width,match; | ||
524 | register int g,i; | ||
525 | for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { | ||
526 | width= XkbKeyGroupsWidth(xkb,i)((((xkb)->map)->key_sym_map[i].width)); | ||
527 | if (width<type->num_levels) | ||
528 | continue; | ||
529 | for (match=0,g=XkbKeyNumGroups(xkb,i)((((((xkb)->map)->key_sym_map[(i)].group_info)&0x0f )))-1;(g>=0)&&(!match);g--) { | ||
530 | if (XkbKeyKeyTypeIndex(xkb,i,g)((((xkb)->map)->key_sym_map[i].kt_index[g&0x3]))==type_ndx) { | ||
531 | matchingKeys[nMatchingKeys++]= i; | ||
532 | match= 1; | ||
533 | } | ||
534 | } | ||
535 | } | ||
536 | } | ||
537 | if (nMatchingKeys>0) { | ||
538 | int key,firstClear; | ||
539 | register int i,g; | ||
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++) { | ||
544 | KeySym * pSyms; | ||
545 | int width,nClear; | ||
546 | |||
547 | key= matchingKeys[i]; | ||
548 | width= XkbKeyGroupsWidth(xkb,key)((((xkb)->map)->key_sym_map[key].width)); | ||
549 | nClear= width-firstClear; | ||
550 | pSyms= XkbKeySymsPtr(xkb,key)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(key)].offset)])); | ||
551 | for (g=XkbKeyNumGroups(xkb,key)((((((xkb)->map)->key_sym_map[(key)].group_info)&0x0f )))-1;g>=0;g--) { | ||
552 | if (XkbKeyKeyTypeIndex(xkb,key,g)((((xkb)->map)->key_sym_map[key].kt_index[g&0x3]))==type_ndx) { | ||
553 | if (nClear>0) | ||
554 | bzero(&pSyms[g*width+firstClear],nClear*sizeof(KeySym))memset(&pSyms[g*width+firstClear],0,nClear*sizeof(KeySym) ); | ||
555 | } | ||
556 | } | ||
557 | } | ||
558 | } | ||
559 | type->num_levels= new_num_lvls; | ||
560 | return Success0; | ||
561 | } | ||
562 | |||
563 | KeySym * | ||
564 | XkbResizeKeySyms(XkbDescPtr xkb,int key,int needed) | ||
565 | { | ||
566 | register int i,nSyms,nKeySyms; | ||
567 | unsigned nOldSyms; | ||
568 | KeySym *newSyms; | ||
569 | |||
570 | if (needed==0) { | ||
571 | xkb->map->key_sym_map[key].offset= 0; | ||
572 | return xkb->map->syms; | ||
573 | } | ||
574 | nOldSyms= XkbKeyNumSyms(xkb,key)(((((xkb)->map)->key_sym_map[(key)].width)*(((((xkb)-> map)->key_sym_map[(key)].group_info)&0x0f)))); | ||
575 | if (nOldSyms>=(unsigned)needed) { | ||
576 | return XkbKeySymsPtr(xkb,key)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(key)].offset)])); | ||
577 | } | ||
578 | if (xkb->map->size_syms-xkb->map->num_syms>=(unsigned)needed) { | ||
579 | if (nOldSyms>0) { | ||
580 | memcpy(&xkb->map->syms[xkb->map->num_syms],XkbKeySymsPtr(xkb,key)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(key)].offset)])), | ||
581 | nOldSyms*sizeof(KeySym)); | ||
582 | } | ||
583 | if ((needed-nOldSyms)>0) { | ||
584 | bzero(&xkb->map->syms[xkb->map->num_syms+XkbKeyNumSyms(xkb,key)],memset(&xkb->map->syms[xkb->map->num_syms+((( ((xkb)->map)->key_sym_map[(key)].width)*(((((xkb)->map )->key_sym_map[(key)].group_info)&0x0f))))],0,(needed- nOldSyms)*sizeof(KeySym)) | ||
585 | (needed-nOldSyms)*sizeof(KeySym))memset(&xkb->map->syms[xkb->map->num_syms+((( ((xkb)->map)->key_sym_map[(key)].width)*(((((xkb)->map )->key_sym_map[(key)].group_info)&0x0f))))],0,(needed- nOldSyms)*sizeof(KeySym)); | ||
586 | } | ||
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]; | ||
590 | } | ||
591 | xkb->map->size_syms+= (needed>32?needed:32); | ||
592 | newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym)((KeySym *)calloc((((xkb->map->size_syms)) == 0 ? 1 : ( (xkb->map->size_syms))), (sizeof(KeySym)))); | ||
593 | if (newSyms==NULL((void*)0)) | ||
594 | return NULL((void*)0); | ||
595 | newSyms[0]= NoSymbol0L; | ||
596 | nSyms = 1; | ||
597 | for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) { | ||
598 | int nCopy; | ||
599 | |||
600 | nCopy= nKeySyms= XkbKeyNumSyms(xkb,i)(((((xkb)->map)->key_sym_map[(i)].width)*(((((xkb)-> map)->key_sym_map[(i)].group_info)&0x0f)))); | ||
601 | if ((nKeySyms==0)&&(i!=key)) | ||
602 | continue; | ||
603 | if (i==key) | ||
604 | nKeySyms= needed; | ||
605 | if (nCopy!=0) | ||
606 | memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(i)].offset)])),nCopy*sizeof(KeySym)); | ||
607 | if (nKeySyms>nCopy) | ||
608 | bzero(&newSyms[nSyms+nCopy],(nKeySyms-nCopy)*sizeof(KeySym))memset(&newSyms[nSyms+nCopy],0,(nKeySyms-nCopy)*sizeof(KeySym )); | ||
609 | xkb->map->key_sym_map[i].offset = nSyms; | ||
610 | nSyms+= nKeySyms; | ||
611 | } | ||
612 | _XkbFree(xkb->map->syms)free((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]; | ||
616 | } | ||
617 | |||
618 | static unsigned | ||
619 | _ExtendRange( unsigned int old_flags, | ||
620 | unsigned int flag, | ||
621 | KeyCode newKC, | ||
622 | KeyCode * old_min, | ||
623 | unsigned char * old_num) | ||
624 | { | ||
625 | if ((old_flags&flag)==0) { | ||
626 | old_flags|= flag; | ||
627 | *old_min= newKC; | ||
628 | *old_num= 1; | ||
629 | } | ||
630 | else { | ||
631 | int last= (*old_min)+(*old_num)-1; | ||
632 | if (newKC<*old_min) { | ||
633 | *old_min= newKC; | ||
634 | *old_num= (last-newKC)+1; | ||
635 | } | ||
636 | else if (newKC>last) { | ||
637 | *old_num= (newKC-(*old_min))+1; | ||
638 | } | ||
639 | } | ||
640 | return old_flags; | ||
641 | } | ||
642 | |||
643 | Statusint | ||
644 | XkbChangeKeycodeRange( XkbDescPtr xkb, | ||
645 | int minKC, | ||
646 | int maxKC, | ||
647 | XkbChangesPtr changes) | ||
648 | { | ||
649 | int tmp; | ||
650 | |||
651 | if ((!xkb)||(minKC<XkbMinLegalKeyCode8)||(maxKC>XkbMaxLegalKeyCode255)) | ||
652 | return BadValue2; | ||
653 | if (minKC>maxKC) | ||
654 | return BadMatch8; | ||
655 | if (minKC<xkb->min_key_code) { | ||
656 | if (changes) | ||
657 | changes->map.min_key_code= minKC; | ||
658 | tmp= xkb->min_key_code-minKC; | ||
659 | if (xkb->map) { | ||
660 | if (xkb->map->key_sym_map) { | ||
661 | bzero((char *)&xkb->map->key_sym_map[minKC],memset((char *)&xkb->map->key_sym_map[minKC],0,tmp* sizeof(XkbSymMapRec)) | ||
662 | tmp*sizeof(XkbSymMapRec))memset((char *)&xkb->map->key_sym_map[minKC],0,tmp* sizeof(XkbSymMapRec)); | ||
663 | if (changes) { | ||
664 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
665 | XkbKeySymsMask(1<<1),minKC, | ||
666 | &changes->map.first_key_sym, | ||
667 | &changes->map.num_key_syms); | ||
668 | } | ||
669 | } | ||
670 | if (xkb->map->modmap) { | ||
671 | bzero((char *)&xkb->map->modmap[minKC],tmp)memset((char *)&xkb->map->modmap[minKC],0,tmp); | ||
672 | if (changes) { | ||
673 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
674 | XkbModifierMapMask(1<<2),minKC, | ||
675 | &changes->map.first_modmap_key, | ||
676 | &changes->map.num_modmap_keys); | ||
677 | } | ||
678 | } | ||
679 | } | ||
680 | if (xkb->server) { | ||
681 | if (xkb->server->behaviors) { | ||
682 | bzero((char *)&xkb->server->behaviors[minKC],memset((char *)&xkb->server->behaviors[minKC],0,tmp *sizeof(XkbBehavior)) | ||
683 | tmp*sizeof(XkbBehavior))memset((char *)&xkb->server->behaviors[minKC],0,tmp *sizeof(XkbBehavior)); | ||
684 | if (changes) { | ||
685 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
686 | XkbKeyBehaviorsMask(1<<5),minKC, | ||
687 | &changes->map.first_key_behavior, | ||
688 | &changes->map.num_key_behaviors); | ||
689 | } | ||
690 | } | ||
691 | if (xkb->server->key_acts) { | ||
692 | bzero((char *)&xkb->server->key_acts[minKC],memset((char *)&xkb->server->key_acts[minKC],0,tmp* sizeof(unsigned short)) | ||
693 | tmp*sizeof(unsigned short))memset((char *)&xkb->server->key_acts[minKC],0,tmp* sizeof(unsigned short)); | ||
694 | if (changes) { | ||
695 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
696 | XkbKeyActionsMask(1<<4),minKC, | ||
697 | &changes->map.first_key_act, | ||
698 | &changes->map.num_key_acts); | ||
699 | } | ||
700 | } | ||
701 | if (xkb->server->vmodmap) { | ||
702 | bzero((char *)&xkb->server->vmodmap[minKC],memset((char *)&xkb->server->vmodmap[minKC],0,tmp*sizeof (unsigned short)) | ||
703 | tmp*sizeof(unsigned short))memset((char *)&xkb->server->vmodmap[minKC],0,tmp*sizeof (unsigned short)); | ||
704 | if (changes) { | ||
705 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
706 | XkbVirtualModMapMask(1<<7),minKC, | ||
707 | &changes->map.first_modmap_key, | ||
708 | &changes->map.num_vmodmap_keys); | ||
709 | } | ||
710 | } | ||
711 | } | ||
712 | if ((xkb->names)&&(xkb->names->keys)) { | ||
713 | bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec))memset((char *)&xkb->names->keys[minKC],0,tmp*sizeof (XkbKeyNameRec)); | ||
714 | if (changes) { | ||
715 | changes->names.changed= _ExtendRange(changes->names.changed, | ||
716 | XkbKeyNamesMask(1<<9),minKC, | ||
717 | &changes->names.first_key, | ||
718 | &changes->names.num_keys); | ||
719 | } | ||
720 | } | ||
721 | xkb->min_key_code= minKC; | ||
722 | } | ||
723 | if (maxKC>xkb->max_key_code) { | ||
724 | if (changes) | ||
725 | changes->map.max_key_code= maxKC; | ||
726 | tmp= maxKC-xkb->max_key_code; | ||
727 | if (xkb->map) { | ||
728 | if (xkb->map->key_sym_map) { | ||
729 | XkbSymMapRec *prev_key_sym_map = xkb->map->key_sym_map; | ||
730 | |||
731 | xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,((xkb->map->key_sym_map)?(XkbSymMapRec *)realloc(((xkb-> map->key_sym_map)), ((((maxKC+1))*sizeof(XkbSymMapRec)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbSymMapRec)))):((XkbSymMapRec * )calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbSymMapRec ))))) | ||
732 | (maxKC+1),XkbSymMapRec)((xkb->map->key_sym_map)?(XkbSymMapRec *)realloc(((xkb-> map->key_sym_map)), ((((maxKC+1))*sizeof(XkbSymMapRec)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbSymMapRec)))):((XkbSymMapRec * )calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbSymMapRec ))))); | ||
733 | if (!xkb->map->key_sym_map) { | ||
734 | _XkbFree(prev_key_sym_map)free((prev_key_sym_map)); | ||
735 | return BadAlloc11; | ||
736 | } | ||
737 | bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],memset((char *)&xkb->map->key_sym_map[xkb->max_key_code ],0,tmp*sizeof(XkbSymMapRec)) | ||
738 | tmp*sizeof(XkbSymMapRec))memset((char *)&xkb->map->key_sym_map[xkb->max_key_code ],0,tmp*sizeof(XkbSymMapRec)); | ||
739 | if (changes) { | ||
740 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
741 | XkbKeySymsMask(1<<1),maxKC, | ||
742 | &changes->map.first_key_sym, | ||
743 | &changes->map.num_key_syms); | ||
744 | } | ||
745 | } | ||
746 | if (xkb->map->modmap) { | ||
747 | unsigned char *prev_modmap = xkb->map->modmap; | ||
748 | |||
749 | xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,((xkb->map->modmap)?(unsigned char *)realloc(((xkb-> map->modmap)), ((((maxKC+1))*sizeof(unsigned char)) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned char)))):((unsigned char *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(unsigned char))))) | ||
750 | (maxKC+1),unsigned char)((xkb->map->modmap)?(unsigned char *)realloc(((xkb-> map->modmap)), ((((maxKC+1))*sizeof(unsigned char)) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned char)))):((unsigned char *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(unsigned char))))); | ||
751 | if (!xkb->map->modmap) { | ||
752 | _XkbFree(prev_modmap)free((prev_modmap)); | ||
753 | return BadAlloc11; | ||
754 | } | ||
755 | bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp)memset((char *)&xkb->map->modmap[xkb->max_key_code ],0,tmp); | ||
756 | if (changes) { | ||
757 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
758 | XkbModifierMapMask(1<<2),maxKC, | ||
759 | &changes->map.first_modmap_key, | ||
760 | &changes->map.num_modmap_keys); | ||
761 | } | ||
762 | } | ||
763 | } | ||
764 | if (xkb->server) { | ||
765 | if (xkb->server->behaviors) { | ||
766 | XkbBehavior *prev_behaviors = xkb->server->behaviors; | ||
767 | |||
768 | xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,((xkb->server->behaviors)?(XkbBehavior *)realloc(((xkb-> server->behaviors)), ((((maxKC+1))*sizeof(XkbBehavior)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbBehavior)))):((XkbBehavior *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbBehavior ))))) | ||
769 | (maxKC+1),XkbBehavior)((xkb->server->behaviors)?(XkbBehavior *)realloc(((xkb-> server->behaviors)), ((((maxKC+1))*sizeof(XkbBehavior)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbBehavior)))):((XkbBehavior *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbBehavior ))))); | ||
770 | if (!xkb->server->behaviors) { | ||
771 | _XkbFree(prev_behaviors)free((prev_behaviors)); | ||
772 | return BadAlloc11; | ||
773 | } | ||
774 | bzero((char *)&xkb->server->behaviors[xkb->max_key_code],memset((char *)&xkb->server->behaviors[xkb->max_key_code ],0,tmp*sizeof(XkbBehavior)) | ||
775 | tmp*sizeof(XkbBehavior))memset((char *)&xkb->server->behaviors[xkb->max_key_code ],0,tmp*sizeof(XkbBehavior)); | ||
776 | if (changes) { | ||
777 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
778 | XkbKeyBehaviorsMask(1<<5),maxKC, | ||
779 | &changes->map.first_key_behavior, | ||
780 | &changes->map.num_key_behaviors); | ||
781 | } | ||
782 | } | ||
783 | if (xkb->server->key_acts) { | ||
784 | unsigned short *prev_key_acts = xkb->server->key_acts; | ||
785 | |||
786 | xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,((xkb->server->key_acts)?(unsigned short *)realloc(((xkb ->server->key_acts)), ((((maxKC+1))*sizeof(unsigned short )) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned short)))):((unsigned short *)calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof (unsigned short))))) | ||
787 | (maxKC+1),unsigned short)((xkb->server->key_acts)?(unsigned short *)realloc(((xkb ->server->key_acts)), ((((maxKC+1))*sizeof(unsigned short )) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned short)))):((unsigned short *)calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof (unsigned short))))); | ||
788 | if (!xkb->server->key_acts) { | ||
789 | _XkbFree(prev_key_acts)free((prev_key_acts)); | ||
790 | return BadAlloc11; | ||
791 | } | ||
792 | bzero((char *)&xkb->server->key_acts[xkb->max_key_code],memset((char *)&xkb->server->key_acts[xkb->max_key_code ],0,tmp*sizeof(unsigned short)) | ||
793 | tmp*sizeof(unsigned short))memset((char *)&xkb->server->key_acts[xkb->max_key_code ],0,tmp*sizeof(unsigned short)); | ||
794 | if (changes) { | ||
795 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
796 | XkbKeyActionsMask(1<<4),maxKC, | ||
797 | &changes->map.first_key_act, | ||
798 | &changes->map.num_key_acts); | ||
799 | } | ||
800 | } | ||
801 | if (xkb->server->vmodmap) { | ||
802 | unsigned short *prev_vmodmap = xkb->server->vmodmap; | ||
803 | |||
804 | xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,((xkb->server->vmodmap)?(unsigned short *)realloc(((xkb ->server->vmodmap)), ((((maxKC+1))*sizeof(unsigned short )) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned short)))):((unsigned short *)calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof (unsigned short))))) | ||
805 | (maxKC+1),unsigned short)((xkb->server->vmodmap)?(unsigned short *)realloc(((xkb ->server->vmodmap)), ((((maxKC+1))*sizeof(unsigned short )) == 0 ? 1 : (((maxKC+1))*sizeof(unsigned short)))):((unsigned short *)calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof (unsigned short))))); | ||
806 | if (!xkb->server->vmodmap) { | ||
807 | _XkbFree(prev_vmodmap)free((prev_vmodmap)); | ||
808 | return BadAlloc11; | ||
809 | } | ||
810 | bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],memset((char *)&xkb->server->vmodmap[xkb->max_key_code ],0,tmp*sizeof(unsigned short)) | ||
811 | tmp*sizeof(unsigned short))memset((char *)&xkb->server->vmodmap[xkb->max_key_code ],0,tmp*sizeof(unsigned short)); | ||
812 | if (changes) { | ||
813 | changes->map.changed= _ExtendRange(changes->map.changed, | ||
814 | XkbVirtualModMapMask(1<<7),maxKC, | ||
815 | &changes->map.first_modmap_key, | ||
816 | &changes->map.num_vmodmap_keys); | ||
817 | } | ||
818 | } | ||
819 | } | ||
820 | if ((xkb->names)&&(xkb->names->keys)) { | ||
821 | XkbKeyNameRec *prev_keys = xkb->names->keys; | ||
822 | |||
823 | xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,((xkb->names->keys)?(XkbKeyNameRec *)realloc(((xkb-> names->keys)), ((((maxKC+1))*sizeof(XkbKeyNameRec)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbKeyNameRec)))):((XkbKeyNameRec *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbKeyNameRec ))))) | ||
824 | (maxKC+1),XkbKeyNameRec)((xkb->names->keys)?(XkbKeyNameRec *)realloc(((xkb-> names->keys)), ((((maxKC+1))*sizeof(XkbKeyNameRec)) == 0 ? 1 : (((maxKC+1))*sizeof(XkbKeyNameRec)))):((XkbKeyNameRec *) calloc(((((maxKC+1))) == 0 ? 1 : (((maxKC+1)))), (sizeof(XkbKeyNameRec ))))); | ||
825 | if (!xkb->names->keys) { | ||
826 | _XkbFree(prev_keys)free((prev_keys)); | ||
827 | return BadAlloc11; | ||
828 | } | ||
829 | bzero((char *)&xkb->names->keys[xkb->max_key_code],memset((char *)&xkb->names->keys[xkb->max_key_code ],0,tmp*sizeof(XkbKeyNameRec)) | ||
830 | tmp*sizeof(XkbKeyNameRec))memset((char *)&xkb->names->keys[xkb->max_key_code ],0,tmp*sizeof(XkbKeyNameRec)); | ||
831 | if (changes) { | ||
832 | changes->names.changed= _ExtendRange(changes->names.changed, | ||
833 | XkbKeyNamesMask(1<<9),maxKC, | ||
834 | &changes->names.first_key, | ||
835 | &changes->names.num_keys); | ||
836 | } | ||
837 | } | ||
838 | xkb->max_key_code= maxKC; | ||
839 | } | ||
840 | return Success0; | ||
841 | } | ||
842 | |||
843 | XkbAction * | ||
844 | XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed) | ||
845 | { | ||
846 | register int i,nActs; | ||
847 | XkbAction *newActs; | ||
848 | |||
849 | if (needed==0) { | ||
850 | xkb->server->key_acts[key]= 0; | ||
851 | return NULL((void*)0); | ||
852 | } | ||
853 | if (XkbKeyHasActions(xkb,key)((xkb)->server->key_acts[key]!=0)&&(XkbKeyNumSyms(xkb,key)(((((xkb)->map)->key_sym_map[(key)].width)*(((((xkb)-> map)->key_sym_map[(key)].group_info)&0x0f))))>=(unsigned)needed)) | ||
854 | return XkbKeyActionsPtr(xkb,key)((&((xkb)->server)->acts[((xkb)->server)->key_acts [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]]; | ||
859 | } | ||
860 | xkb->server->size_acts= xkb->server->num_acts+needed+8; | ||
861 | newActs = _XkbTypedCalloc(xkb->server->size_acts,XkbAction)((XkbAction *)calloc((((xkb->server->size_acts)) == 0 ? 1 : ((xkb->server->size_acts))), (sizeof(XkbAction)))); | ||
862 | if (newActs==NULL((void*)0)) | ||
863 | return NULL((void*)0); | ||
864 | newActs[0].type = XkbSA_NoAction0x00; | ||
865 | nActs = 1; | ||
866 | for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) { | ||
867 | int nKeyActs,nCopy; | ||
868 | |||
869 | if ((xkb->server->key_acts[i]==0)&&(i!=key)) | ||
870 | continue; | ||
871 | |||
872 | nCopy= nKeyActs= XkbKeyNumActions(xkb,i)(((xkb)->server->key_acts[i]!=0)?(((((xkb)->map)-> key_sym_map[(i)].width)*(((((xkb)->map)->key_sym_map[(i )].group_info)&0x0f)))):1); | ||
873 | if (i==key) { | ||
874 | nKeyActs= needed; | ||
875 | if (needed<nCopy) | ||
876 | nCopy= needed; | ||
877 | } | ||
878 | |||
879 | if (nCopy>0) | ||
880 | memcpy(&newActs[nActs],XkbKeyActionsPtr(xkb,i)((&((xkb)->server)->acts[((xkb)->server)->key_acts [i]])), | ||
881 | nCopy*sizeof(XkbAction)); | ||
882 | if (nCopy<nKeyActs) | ||
883 | bzero(&newActs[nActs+nCopy],(nKeyActs-nCopy)*sizeof(XkbAction))memset(&newActs[nActs+nCopy],0,(nKeyActs-nCopy)*sizeof(XkbAction )); | ||
884 | xkb->server->key_acts[i]= nActs; | ||
885 | nActs+= nKeyActs; | ||
886 | } | ||
887 | _XkbFree(xkb->server->acts)free((xkb->server->acts)); | ||
888 | xkb->server->acts = newActs; | ||
889 | xkb->server->num_acts= nActs; | ||
890 | return &xkb->server->acts[xkb->server->key_acts[key]]; | ||
891 | } | ||
892 | |||
893 | void | ||
894 | XkbFreeClientMap(XkbDescPtr xkb,unsigned what,Boolint freeMap) | ||
895 | { | ||
896 | XkbClientMapPtr map; | ||
897 | |||
898 | if ((xkb==NULL((void*)0))||(xkb->map==NULL((void*)0))) | ||
899 | return; | ||
900 | if (freeMap) | ||
901 | what= XkbAllClientInfoMask((1<<0)|(1<<1)|(1<<2)); | ||
902 | map= xkb->map; | ||
903 | if (what&XkbKeyTypesMask(1<<0)) { | ||
904 | if (map->types!=NULL((void*)0)) { | ||
905 | if (map->num_types>0) { | ||
906 | register int i; | ||
907 | XkbKeyTypePtr type; | ||
908 | for (i=0,type=map->types;i<map->num_types;i++,type++) { | ||
909 | if (type->map!=NULL((void*)0)) { | ||
910 | _XkbFree(type->map)free((type->map)); | ||
911 | type->map= NULL((void*)0); | ||
912 | } | ||
913 | if (type->preserve!=NULL((void*)0)) { | ||
914 | _XkbFree(type->preserve)free((type->preserve)); | ||
915 | type->preserve= NULL((void*)0); | ||
916 | } | ||
917 | type->map_count= 0; | ||
918 | if (type->level_names!=NULL((void*)0)) { | ||
919 | _XkbFree(type->level_names)free((type->level_names)); | ||
920 | type->level_names= NULL((void*)0); | ||
921 | } | ||
922 | } | ||
923 | } | ||
924 | _XkbFree(map->types)free((map->types)); | ||
925 | map->num_types= map->size_types= 0; | ||
926 | map->types= NULL((void*)0); | ||
927 | } | ||
928 | } | ||
929 | if (what&XkbKeySymsMask(1<<1)) { | ||
930 | if (map->key_sym_map!=NULL((void*)0)) { | ||
931 | _XkbFree(map->key_sym_map)free((map->key_sym_map)); | ||
932 | map->key_sym_map= NULL((void*)0); | ||
933 | } | ||
934 | if (map->syms!=NULL((void*)0)) { | ||
935 | _XkbFree(map->syms)free((map->syms)); | ||
936 | map->size_syms= map->num_syms= 0; | ||
937 | map->syms= NULL((void*)0); | ||
938 | } | ||
939 | } | ||
940 | if ((what&XkbModifierMapMask(1<<2))&&(map->modmap!=NULL((void*)0))) { | ||
941 | _XkbFree(map->modmap)free((map->modmap)); | ||
942 | map->modmap= NULL((void*)0); | ||
943 | } | ||
944 | if (freeMap) { | ||
945 | _XkbFree(xkb->map)free((xkb->map)); | ||
946 | xkb->map= NULL((void*)0); | ||
947 | } | ||
948 | return; | ||
949 | } | ||
950 | |||
951 | void | ||
952 | XkbFreeServerMap(XkbDescPtr xkb,unsigned what,Boolint freeMap) | ||
953 | { | ||
954 | XkbServerMapPtr map; | ||
955 | |||
956 | if ((xkb==NULL((void*)0))||(xkb->server==NULL((void*)0))) | ||
957 | return; | ||
958 | if (freeMap) | ||
959 | what= XkbAllServerInfoMask((1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<< 7)); | ||
960 | map= xkb->server; | ||
961 | if ((what&XkbExplicitComponentsMask(1<<3))&&(map->explicit!=NULL((void*)0))) { | ||
962 | _XkbFree(map->explicit)free((map->explicit)); | ||
963 | map->explicit= NULL((void*)0); | ||
964 | } | ||
965 | if (what&XkbKeyActionsMask(1<<4)) { | ||
966 | if (map->key_acts!=NULL((void*)0)) { | ||
967 | _XkbFree(map->key_acts)free((map->key_acts)); | ||
968 | map->key_acts= NULL((void*)0); | ||
969 | } | ||
970 | if (map->acts!=NULL((void*)0)) { | ||
971 | _XkbFree(map->acts)free((map->acts)); | ||
972 | map->num_acts= map->size_acts= 0; | ||
973 | map->acts= NULL((void*)0); | ||
974 | } | ||
975 | } | ||
976 | if ((what&XkbKeyBehaviorsMask(1<<5))&&(map->behaviors!=NULL((void*)0))) { | ||
977 | _XkbFree(map->behaviors)free((map->behaviors)); | ||
978 | map->behaviors= NULL((void*)0); | ||
979 | } | ||
980 | if ((what&XkbVirtualModMapMask(1<<7))&&(map->vmodmap!=NULL((void*)0))) { | ||
981 | _XkbFree(map->vmodmap)free((map->vmodmap)); | ||
982 | map->vmodmap= NULL((void*)0); | ||
983 | } | ||
984 | |||
985 | if (freeMap) { | ||
986 | _XkbFree(xkb->server)free((xkb->server)); | ||
987 | xkb->server= NULL((void*)0); | ||
988 | } | ||
989 | return; | ||
990 | } |