File: | src/xkb/XKBMAlloc.c |
Location: | line 343, column 5 |
Description: | Null pointer passed as an argument to a 'nonnull' parameter |
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 | } |