| File: | src/xkb/XKBGetMap.c |
| Location: | line 44, column 6 |
| Description: | Value stored to 'n' is never read |
| 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 | #define NEED_MAP_READERS |
| 28 | #ifdef HAVE_CONFIG_H1 |
| 29 | #include <config.h> |
| 30 | #endif |
| 31 | #include "Xlibint.h" |
| 32 | #include <X11/extensions/XKBproto.h> |
| 33 | #include "XKBlibint.h" |
| 34 | |
| 35 | static Statusint |
| 36 | _XkbReadKeyTypes(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 37 | { |
| 38 | int i,n,lastMapCount; |
| 39 | XkbKeyTypePtr type; |
| 40 | |
| 41 | if ( rep->nTypes>0 ) { |
| 42 | n = rep->firstType+rep->nTypes; |
| 43 | if (xkb->map->num_types>=n) |
| 44 | n= xkb->map->num_types; |
Value stored to 'n' is never read | |
| 45 | else if (XkbAllocClientMap(xkb,XkbKeyTypesMask(1<<0),n)!=Success0) |
| 46 | return BadAlloc11; |
| 47 | |
| 48 | type = &xkb->map->types[rep->firstType]; |
| 49 | for (i=0;i<(int)rep->nTypes;i++,type++) { |
| 50 | xkbKeyTypeWireDesc *desc; |
| 51 | register int ndx; |
| 52 | |
| 53 | ndx= i+rep->firstType; |
| 54 | if (ndx>=xkb->map->num_types) |
| 55 | xkb->map->num_types= ndx+1; |
| 56 | |
| 57 | desc= (xkbKeyTypeWireDesc *)_XkbGetReadBufferPtr(buf, |
| 58 | SIZEOF(xkbKeyTypeWireDesc)8); |
| 59 | if (desc==NULL((void*)0)) |
| 60 | return BadLength16; |
| 61 | |
| 62 | lastMapCount= type->map_count; |
| 63 | if ( desc->nMapEntries>0 ) { |
| 64 | if ((type->map==NULL((void*)0))||(desc->nMapEntries>type->map_count)) { |
| 65 | XkbKTMapEntryRec *prev_map = type->map; |
| 66 | |
| 67 | type->map= _XkbTypedRealloc(type->map,desc->nMapEntries,((type->map)?(XkbKTMapEntryRec *)realloc(((type->map)), (((desc->nMapEntries)*sizeof(XkbKTMapEntryRec)) == 0 ? 1 : ((desc->nMapEntries)*sizeof(XkbKTMapEntryRec)))):((XkbKTMapEntryRec *)calloc((((desc->nMapEntries)) == 0 ? 1 : ((desc->nMapEntries ))), (sizeof(XkbKTMapEntryRec))))) |
| 68 | XkbKTMapEntryRec)((type->map)?(XkbKTMapEntryRec *)realloc(((type->map)), (((desc->nMapEntries)*sizeof(XkbKTMapEntryRec)) == 0 ? 1 : ((desc->nMapEntries)*sizeof(XkbKTMapEntryRec)))):((XkbKTMapEntryRec *)calloc((((desc->nMapEntries)) == 0 ? 1 : ((desc->nMapEntries ))), (sizeof(XkbKTMapEntryRec))))); |
| 69 | if (type->map==NULL((void*)0)) { |
| 70 | _XkbFree(prev_map)free((prev_map)); |
| 71 | return BadAlloc11; |
| 72 | } |
| 73 | } |
| 74 | } |
| 75 | else if (type->map!=NULL((void*)0)) { |
| 76 | Xfree(type->map)free((type->map)); |
| 77 | type->map_count= 0; |
| 78 | type->map= NULL((void*)0); |
| 79 | } |
| 80 | |
| 81 | if ( desc->preserve && (desc->nMapEntries>0) ) { |
| 82 | if ((!type->preserve)|| |
| 83 | (desc->nMapEntries>lastMapCount)) { |
| 84 | XkbModsRec *prev_preserve = type->preserve; |
| 85 | |
| 86 | type->preserve= _XkbTypedRealloc(type->preserve,((type->preserve)?(XkbModsRec *)realloc(((type->preserve )), (((desc->nMapEntries)*sizeof(XkbModsRec)) == 0 ? 1 : ( (desc->nMapEntries)*sizeof(XkbModsRec)))):((XkbModsRec *)calloc ((((desc->nMapEntries)) == 0 ? 1 : ((desc->nMapEntries) )), (sizeof(XkbModsRec))))) |
| 87 | desc->nMapEntries,((type->preserve)?(XkbModsRec *)realloc(((type->preserve )), (((desc->nMapEntries)*sizeof(XkbModsRec)) == 0 ? 1 : ( (desc->nMapEntries)*sizeof(XkbModsRec)))):((XkbModsRec *)calloc ((((desc->nMapEntries)) == 0 ? 1 : ((desc->nMapEntries) )), (sizeof(XkbModsRec))))) |
| 88 | XkbModsRec)((type->preserve)?(XkbModsRec *)realloc(((type->preserve )), (((desc->nMapEntries)*sizeof(XkbModsRec)) == 0 ? 1 : ( (desc->nMapEntries)*sizeof(XkbModsRec)))):((XkbModsRec *)calloc ((((desc->nMapEntries)) == 0 ? 1 : ((desc->nMapEntries) )), (sizeof(XkbModsRec))))); |
| 89 | if (type->preserve==NULL((void*)0)) { |
| 90 | _XkbFree(prev_preserve)free((prev_preserve)); |
| 91 | return BadAlloc11; |
| 92 | } |
| 93 | } |
| 94 | } |
| 95 | else if (type->preserve!=NULL((void*)0)) { |
| 96 | Xfree(type->preserve)free((type->preserve)); |
| 97 | type->preserve= NULL((void*)0); |
| 98 | } |
| 99 | |
| 100 | type->mods.mask = desc->mask; |
| 101 | type->mods.real_mods = desc->realMods; |
| 102 | type->mods.vmods = desc->virtualMods; |
| 103 | type->num_levels = desc->numLevels; |
| 104 | type->map_count = desc->nMapEntries; |
| 105 | if (desc->nMapEntries>0) { |
| 106 | register xkbKTMapEntryWireDesc *wire; |
| 107 | register XkbKTMapEntryPtr entry; |
| 108 | register int size; |
| 109 | |
| 110 | size= type->map_count*SIZEOF(xkbKTMapEntryWireDesc)8; |
| 111 | wire= (xkbKTMapEntryWireDesc *)_XkbGetReadBufferPtr(buf,size); |
| 112 | if (wire==NULL((void*)0)) |
| 113 | return BadLength16; |
| 114 | entry= type->map; |
| 115 | for (n=0;n<type->map_count;n++,wire++,entry++) { |
| 116 | entry->active= wire->active; |
| 117 | entry->level= wire->level; |
| 118 | entry->mods.mask= wire->mask; |
| 119 | entry->mods.real_mods= wire->realMods; |
| 120 | entry->mods.vmods= wire->virtualMods; |
| 121 | } |
| 122 | |
| 123 | if (desc->preserve) { |
| 124 | register xkbModsWireDesc * pwire; |
| 125 | register XkbModsPtr preserve; |
| 126 | register int sz; |
| 127 | |
| 128 | sz= desc->nMapEntries*SIZEOF(xkbModsWireDesc)4; |
| 129 | pwire=(xkbModsWireDesc *)_XkbGetReadBufferPtr(buf,sz); |
| 130 | if (pwire==NULL((void*)0)) |
| 131 | return BadLength16; |
| 132 | preserve= type->preserve; |
| 133 | for (n=0;n<desc->nMapEntries;n++,pwire++,preserve++) { |
| 134 | preserve->mask= pwire->mask; |
| 135 | preserve->vmods= pwire->virtualMods; |
| 136 | preserve->real_mods= pwire->realMods; |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | } |
| 142 | return Success0; |
| 143 | } |
| 144 | |
| 145 | static Statusint |
| 146 | _XkbReadKeySyms(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 147 | { |
| 148 | register int i; |
| 149 | XkbClientMapPtr map; |
| 150 | |
| 151 | map= xkb->map; |
| 152 | if (map->key_sym_map==NULL((void*)0)) { |
| 153 | register int offset; |
| 154 | XkbSymMapPtr oldMap; |
| 155 | xkbSymMapWireDesc *newMap; |
| 156 | map->key_sym_map= _XkbTypedCalloc((xkb->max_key_code+1),XkbSymMapRec)((XkbSymMapRec *)calloc(((((xkb->max_key_code+1))) == 0 ? 1 : (((xkb->max_key_code+1)))), (sizeof(XkbSymMapRec)))); |
| 157 | if (map->key_sym_map==NULL((void*)0)) |
| 158 | return BadAlloc11; |
| 159 | if (map->syms==NULL((void*)0)) { |
| 160 | int sz; |
| 161 | sz= (rep->totalSyms*12)/10; |
| 162 | sz= ((sz+(unsigned)128)/128)*128; |
| 163 | map->syms = _XkbTypedCalloc(sz,KeySym)((KeySym *)calloc((((sz)) == 0 ? 1 : ((sz))), (sizeof(KeySym) ))); |
| 164 | if (map->syms==NULL((void*)0)) |
| 165 | return BadAlloc11; |
| 166 | map->size_syms = sz; |
| 167 | } |
| 168 | offset = 1; |
| 169 | oldMap = &map->key_sym_map[rep->firstKeySym]; |
| 170 | for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) { |
| 171 | newMap= (xkbSymMapWireDesc *) |
| 172 | _XkbGetReadBufferPtr(buf,SIZEOF(xkbSymMapWireDesc)8); |
| 173 | if (newMap==NULL((void*)0)) |
| 174 | return BadLength16; |
| 175 | oldMap->kt_index[0]= newMap->ktIndex[0]; |
| 176 | oldMap->kt_index[1]= newMap->ktIndex[1]; |
| 177 | oldMap->kt_index[2]= newMap->ktIndex[2]; |
| 178 | oldMap->kt_index[3]= newMap->ktIndex[3]; |
| 179 | oldMap->group_info= newMap->groupInfo; |
| 180 | oldMap->width= newMap->width; |
| 181 | oldMap->offset= offset; |
| 182 | if (offset+newMap->nSyms>=map->size_syms) { |
| 183 | register int sz; |
| 184 | KeySym *prev_syms = map->syms; |
| 185 | |
| 186 | sz= map->size_syms+128; |
| 187 | map->syms= _XkbTypedRealloc(map->syms,sz,KeySym)((map->syms)?(KeySym *)realloc(((map->syms)), (((sz)*sizeof (KeySym)) == 0 ? 1 : ((sz)*sizeof(KeySym)))):((KeySym *)calloc ((((sz)) == 0 ? 1 : ((sz))), (sizeof(KeySym))))); |
| 188 | if (map->syms==NULL((void*)0)) { |
| 189 | _XkbFree(prev_syms)free((prev_syms)); |
| 190 | map->size_syms= 0; |
| 191 | return BadAlloc11; |
| 192 | } |
| 193 | map->size_syms= sz; |
| 194 | } |
| 195 | if (newMap->nSyms>0) { |
| 196 | _XkbReadBufferCopyKeySyms(buf,(KeySym *)&map->syms[offset], |
| 197 | newMap->nSyms); |
| 198 | offset+= newMap->nSyms; |
| 199 | } |
| 200 | else { |
| 201 | map->syms[offset]= 0; |
| 202 | } |
| 203 | } |
| 204 | map->num_syms= offset; |
| 205 | } |
| 206 | else { |
| 207 | xkbSymMapWireDesc * newMap; |
| 208 | XkbSymMapPtr oldMap; |
| 209 | KeySym * newSyms; |
| 210 | int tmp; |
| 211 | |
| 212 | oldMap = &map->key_sym_map[rep->firstKeySym]; |
| 213 | for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) { |
| 214 | newMap= (xkbSymMapWireDesc *) |
| 215 | _XkbGetReadBufferPtr(buf,SIZEOF(xkbSymMapWireDesc)8); |
| 216 | if (newMap==NULL((void*)0)) |
| 217 | return BadLength16; |
| 218 | |
| 219 | if (newMap->nSyms>0) |
| 220 | tmp= newMap->nSyms; |
| 221 | else tmp= 0; |
| 222 | |
| 223 | newSyms = XkbResizeKeySyms(xkb,i+rep->firstKeySym,tmp); |
| 224 | if (newSyms==NULL((void*)0)) |
| 225 | return BadAlloc11; |
| 226 | if (newMap->nSyms>0) |
| 227 | _XkbReadBufferCopyKeySyms(buf,newSyms,newMap->nSyms); |
| 228 | else newSyms[0]= NoSymbol0L; |
| 229 | oldMap->kt_index[0] = newMap->ktIndex[0]; |
| 230 | oldMap->kt_index[1] = newMap->ktIndex[1]; |
| 231 | oldMap->kt_index[2] = newMap->ktIndex[2]; |
| 232 | oldMap->kt_index[3] = newMap->ktIndex[3]; |
| 233 | oldMap->group_info = newMap->groupInfo; |
| 234 | oldMap->width = newMap->width; |
| 235 | } |
| 236 | } |
| 237 | return Success0; |
| 238 | } |
| 239 | |
| 240 | static Statusint |
| 241 | _XkbReadKeyActions(XkbReadBufferPtr buf,XkbDescPtr info,xkbGetMapReply *rep) |
| 242 | { |
| 243 | int i; |
| 244 | CARD8 numDescBuf[248]; |
| 245 | CARD8* numDesc = NULL((void*)0); |
| 246 | register int nKeyActs; |
| 247 | Statusint ret = Success0; |
| 248 | |
| 249 | if ( (nKeyActs=rep->nKeyActs)>0 ) { |
| 250 | XkbSymMapPtr symMap; |
| 251 | |
| 252 | if (nKeyActs < sizeof numDescBuf) numDesc = numDescBuf; |
| 253 | else numDesc = Xmalloc (nKeyActs * sizeof(CARD8))malloc(((nKeyActs * sizeof(CARD8)) == 0 ? 1 : (nKeyActs * sizeof (CARD8)))); |
| 254 | |
| 255 | if (!_XkbCopyFromReadBuffer(buf, (char *)numDesc, nKeyActs)) { |
| 256 | ret = BadLength16; |
| 257 | goto done; |
| 258 | } |
| 259 | i= XkbPaddedSize(nKeyActs)((((unsigned int)(nKeyActs)+3) >> 2) << 2)-nKeyActs; |
| 260 | if ((i>0)&&(!_XkbSkipReadBufferData(buf,i))) { |
| 261 | ret = BadLength16; |
| 262 | goto done; |
| 263 | } |
| 264 | symMap = &info->map->key_sym_map[rep->firstKeyAct]; |
| 265 | for (i=0;i<(int)rep->nKeyActs;i++,symMap++) { |
| 266 | if (numDesc[i]==0) { |
| 267 | info->server->key_acts[i+rep->firstKeyAct]= 0; |
| 268 | } |
| 269 | else { |
| 270 | XkbAction *newActs; |
| 271 | /* 8/16/93 (ef) -- XXX! Verify size here (numdesc must be */ |
| 272 | /* either zero or XkbKeyNumSyms(info,key) */ |
| 273 | newActs=XkbResizeKeyActions(info,i+rep->firstKeyAct, |
| 274 | numDesc[i]); |
| 275 | if (newActs==NULL((void*)0)) { |
| 276 | ret = BadAlloc11; |
| 277 | goto done; |
| 278 | } |
| 279 | if (!_XkbCopyFromReadBuffer(buf,(char *)newActs, |
| 280 | (int)(numDesc[i]*sizeof(XkbAction)))) { |
| 281 | ret = BadLength16; |
| 282 | goto done; |
| 283 | } |
| 284 | } |
| 285 | } |
| 286 | } |
| 287 | done: |
| 288 | if (numDesc != NULL((void*)0) && numDesc != numDescBuf) Xfree (numDesc)free((numDesc)); |
| 289 | return ret; |
| 290 | } |
| 291 | |
| 292 | static Statusint |
| 293 | _XkbReadKeyBehaviors(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 294 | { |
| 295 | register int i; |
| 296 | xkbBehaviorWireDesc *wire; |
| 297 | |
| 298 | if ( rep->totalKeyBehaviors>0 ) { |
| 299 | if ( xkb->server->behaviors == NULL((void*)0) ) { |
| 300 | int size = xkb->max_key_code+1; |
| 301 | xkb->server->behaviors = _XkbTypedCalloc(size,XkbBehavior)((XkbBehavior *)calloc((((size)) == 0 ? 1 : ((size))), (sizeof (XkbBehavior)))); |
| 302 | if (xkb->server->behaviors==NULL((void*)0)) |
| 303 | return BadAlloc11; |
| 304 | } |
| 305 | else { |
| 306 | bzero(&xkb->server->behaviors[rep->firstKeyBehavior],memset(&xkb->server->behaviors[rep->firstKeyBehavior ],0,(rep->nKeyBehaviors*sizeof(XkbBehavior))) |
| 307 | (rep->nKeyBehaviors*sizeof(XkbBehavior)))memset(&xkb->server->behaviors[rep->firstKeyBehavior ],0,(rep->nKeyBehaviors*sizeof(XkbBehavior))); |
| 308 | } |
| 309 | for (i=0;i<rep->totalKeyBehaviors;i++) { |
| 310 | wire= (xkbBehaviorWireDesc *)_XkbGetReadBufferPtr(buf, |
| 311 | SIZEOF(xkbBehaviorWireDesc)4); |
| 312 | if (wire==NULL((void*)0)) |
| 313 | return BadLength16; |
| 314 | xkb->server->behaviors[wire->key].type= wire->type; |
| 315 | xkb->server->behaviors[wire->key].data= wire->data; |
| 316 | } |
| 317 | } |
| 318 | return Success0; |
| 319 | } |
| 320 | |
| 321 | static Statusint |
| 322 | _XkbReadVirtualMods(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 323 | { |
| 324 | if ( rep->virtualMods ) { |
| 325 | register int i,bit,nVMods; |
| 326 | register char *data; |
| 327 | |
| 328 | for (i=nVMods=0,bit=1;i<XkbNumVirtualMods16;i++,bit<<=1) { |
| 329 | if (rep->virtualMods&bit) |
| 330 | nVMods++; |
| 331 | } |
| 332 | data= _XkbGetReadBufferPtr(buf,XkbPaddedSize(nVMods)((((unsigned int)(nVMods)+3) >> 2) << 2)); |
| 333 | if (data==NULL((void*)0)) |
| 334 | return BadLength16; |
| 335 | for (i=0,bit=1;(i<XkbNumVirtualMods16)&&(nVMods>0);i++,bit<<=1) { |
| 336 | if (rep->virtualMods&bit) { |
| 337 | xkb->server->vmods[i]= *data++; |
| 338 | nVMods--; |
| 339 | } |
| 340 | } |
| 341 | } |
| 342 | return Success0; |
| 343 | } |
| 344 | |
| 345 | static Statusint |
| 346 | _XkbReadExplicitComponents( XkbReadBufferPtr buf, |
| 347 | XkbDescPtr xkb, |
| 348 | xkbGetMapReply * rep) |
| 349 | { |
| 350 | register int i; |
| 351 | unsigned char *wire; |
| 352 | |
| 353 | if ( rep->totalKeyExplicit>0 ) { |
| 354 | if ( xkb->server->explicit == NULL((void*)0) ) { |
| 355 | int size = xkb->max_key_code+1; |
| 356 | xkb->server->explicit = _XkbTypedCalloc(size,unsigned char)((unsigned char *)calloc((((size)) == 0 ? 1 : ((size))), (sizeof (unsigned char)))); |
| 357 | if (xkb->server->explicit==NULL((void*)0)) |
| 358 | return BadAlloc11; |
| 359 | } |
| 360 | else { |
| 361 | bzero(&xkb->server->explicit[rep->firstKeyExplicit],memset(&xkb->server->explicit[rep->firstKeyExplicit ],0,rep->nKeyExplicit) |
| 362 | rep->nKeyExplicit)memset(&xkb->server->explicit[rep->firstKeyExplicit ],0,rep->nKeyExplicit); |
| 363 | } |
| 364 | i= XkbPaddedSize(2*rep->totalKeyExplicit)((((unsigned int)(2*rep->totalKeyExplicit)+3) >> 2) << 2); |
| 365 | wire=(unsigned char *)_XkbGetReadBufferPtr(buf,i); |
| 366 | if (!wire) |
| 367 | return BadLength16; |
| 368 | for (i=0;i<rep->totalKeyExplicit;i++,wire+=2) { |
| 369 | xkb->server->explicit[wire[0]]= wire[1]; |
| 370 | } |
| 371 | } |
| 372 | return Success0; |
| 373 | } |
| 374 | |
| 375 | static Statusint |
| 376 | _XkbReadModifierMap(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 377 | { |
| 378 | register int i; |
| 379 | unsigned char *wire; |
| 380 | |
| 381 | if ( rep->totalModMapKeys>0 ) { |
| 382 | if ((xkb->map->modmap==NULL((void*)0))&& |
| 383 | (XkbAllocClientMap(xkb,XkbModifierMapMask(1<<2),0)!=Success0)) { |
| 384 | return BadAlloc11; |
| 385 | } |
| 386 | else { |
| 387 | bzero(&xkb->map->modmap[rep->firstModMapKey],rep->nModMapKeys)memset(&xkb->map->modmap[rep->firstModMapKey],0, rep->nModMapKeys); |
| 388 | } |
| 389 | i= XkbPaddedSize(2*rep->totalModMapKeys)((((unsigned int)(2*rep->totalModMapKeys)+3) >> 2) << 2); |
| 390 | wire=(unsigned char *)_XkbGetReadBufferPtr(buf,i); |
| 391 | if (!wire) |
| 392 | return BadLength16; |
| 393 | for (i=0;i<rep->totalModMapKeys;i++,wire+=2) { |
| 394 | xkb->map->modmap[wire[0]]= wire[1]; |
| 395 | } |
| 396 | } |
| 397 | return Success0; |
| 398 | } |
| 399 | |
| 400 | static Statusint |
| 401 | _XkbReadVirtualModMap(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep) |
| 402 | { |
| 403 | register int i; |
| 404 | xkbVModMapWireDesc * wire; |
| 405 | XkbServerMapPtr srv; |
| 406 | |
| 407 | if ( rep->totalVModMapKeys>0 ) { |
| 408 | if (((xkb->server==NULL((void*)0))||(xkb->server->vmodmap==NULL((void*)0)))&& |
| 409 | (XkbAllocServerMap(xkb,XkbVirtualModMapMask(1<<7),0)!=Success0)) { |
| 410 | return BadAlloc11; |
| 411 | } |
| 412 | else { |
| 413 | srv= xkb->server; |
| 414 | if (rep->nVModMapKeys > rep->firstVModMapKey) |
| 415 | bzero((char *)&srv->vmodmap[rep->firstVModMapKey],memset((char *)&srv->vmodmap[rep->firstVModMapKey], 0,(rep->nVModMapKeys - rep->firstVModMapKey) * sizeof(unsigned short)) |
| 416 | (rep->nVModMapKeys - rep->firstVModMapKey) *memset((char *)&srv->vmodmap[rep->firstVModMapKey], 0,(rep->nVModMapKeys - rep->firstVModMapKey) * sizeof(unsigned short)) |
| 417 | sizeof(unsigned short))memset((char *)&srv->vmodmap[rep->firstVModMapKey], 0,(rep->nVModMapKeys - rep->firstVModMapKey) * sizeof(unsigned short)); |
| 418 | } |
| 419 | srv= xkb->server; |
| 420 | i= rep->totalVModMapKeys*SIZEOF(xkbVModMapWireDesc)4; |
| 421 | wire=(xkbVModMapWireDesc *)_XkbGetReadBufferPtr(buf,i); |
| 422 | if (!wire) |
| 423 | return BadLength16; |
| 424 | for (i=0;i<rep->totalVModMapKeys;i++,wire++) { |
| 425 | if ((wire->key>=xkb->min_key_code)&&(wire->key<=xkb->max_key_code)) |
| 426 | srv->vmodmap[wire->key]= wire->vmods; |
| 427 | } |
| 428 | } |
| 429 | return Success0; |
| 430 | } |
| 431 | |
| 432 | static xkbGetMapReq * |
| 433 | _XkbGetGetMapReq(Display *dpy,XkbDescPtr xkb) |
| 434 | { |
| 435 | xkbGetMapReq *req; |
| 436 | |
| 437 | GetReq(kbGetMap, req)req = (xkbGetMapReq *) _XGetRequest(dpy, 8, 28); |
| 438 | req->reqType = dpy->xkb_info->codes->major_opcode; |
| 439 | req->xkbReqType = X_kbGetMap8; |
| 440 | req->deviceSpec = xkb->device_spec; |
| 441 | req->full = req->partial = 0; |
| 442 | req->firstType = req->nTypes = 0; |
| 443 | req->firstKeySym = req->nKeySyms = 0; |
| 444 | req->firstKeyAct = req->nKeyActs = 0; |
| 445 | req->firstKeyBehavior = req->nKeyBehaviors = 0; |
| 446 | req->virtualMods = 0; |
| 447 | req->firstKeyExplicit = req->nKeyExplicit = 0; |
| 448 | req->firstModMapKey = req->nModMapKeys = 0; |
| 449 | req->firstVModMapKey = req->nVModMapKeys = 0; |
| 450 | return req; |
| 451 | } |
| 452 | |
| 453 | Statusint |
| 454 | _XkbReadGetMapReply( Display * dpy, |
| 455 | xkbGetMapReply *rep, |
| 456 | XkbDescPtr xkb, |
| 457 | int * nread_rtrn) |
| 458 | { |
| 459 | int extraData; |
| 460 | unsigned mask; |
| 461 | |
| 462 | if ( xkb->device_spec == XkbUseCoreKbd0x0100 ) |
| 463 | xkb->device_spec= rep->deviceID; |
| 464 | xkb->min_key_code = rep->minKeyCode; |
| 465 | xkb->max_key_code = rep->maxKeyCode; |
| 466 | |
| 467 | if (!xkb->map) { |
| 468 | mask= rep->present&XkbAllClientInfoMask((1<<0)|(1<<1)|(1<<2)); |
| 469 | if (mask&&(XkbAllocClientMap(xkb,mask,rep->nTypes)!=Success0)) |
| 470 | return BadAlloc11; |
| 471 | } |
| 472 | if (!xkb->server) { |
| 473 | mask= rep->present&XkbAllServerInfoMask((1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<< 7)); |
| 474 | if (mask&&(XkbAllocServerMap(xkb,mask,rep->totalActs)!=Success0)) |
| 475 | return BadAlloc11; |
| 476 | } |
| 477 | extraData= (int)(rep->length*4); |
| 478 | extraData-= (SIZEOF(xkbGetMapReply)40-SIZEOF(xGenericReply)32); |
| 479 | if (rep->length) { |
| 480 | XkbReadBufferRec buf; |
| 481 | int left; |
| 482 | if (_XkbInitReadBuffer(dpy,&buf,extraData)) { |
| 483 | Statusint status= Success0; |
| 484 | if (nread_rtrn!=NULL((void*)0)) |
| 485 | *nread_rtrn= extraData; |
| 486 | if (status==Success0) |
| 487 | status= _XkbReadKeyTypes(&buf,xkb,rep); |
| 488 | if (status==Success0) |
| 489 | status= _XkbReadKeySyms(&buf,xkb,rep); |
| 490 | if (status==Success0) |
| 491 | status= _XkbReadKeyActions(&buf,xkb,rep); |
| 492 | if (status==Success0) |
| 493 | status= _XkbReadKeyBehaviors(&buf,xkb,rep); |
| 494 | if (status==Success0) |
| 495 | status= _XkbReadVirtualMods(&buf,xkb,rep); |
| 496 | if (status==Success0) |
| 497 | status= _XkbReadExplicitComponents(&buf,xkb,rep); |
| 498 | if (status==Success0) |
| 499 | status= _XkbReadModifierMap(&buf,xkb,rep); |
| 500 | if (status==Success0) |
| 501 | status= _XkbReadVirtualModMap(&buf,xkb,rep); |
| 502 | left= _XkbFreeReadBuffer(&buf); |
| 503 | if (status!=Success0) return status; |
| 504 | else if ( left || buf.error ) return BadLength16; |
| 505 | } |
| 506 | else return BadAlloc11; |
| 507 | } |
| 508 | return Success0; |
| 509 | } |
| 510 | |
| 511 | static Statusint |
| 512 | _XkbHandleGetMapReply(Display *dpy,XkbDescPtr xkb) |
| 513 | { |
| 514 | xkbGetMapReply rep; |
| 515 | |
| 516 | if (!_XReply(dpy, (xReply *)&rep, |
| 517 | ( (SIZEOF(xkbGetMapReply)40-SIZEOF(xGenericReply)32) >> 2 ), |
| 518 | xFalse0)) { |
| 519 | return BadImplementation17; |
| 520 | } |
| 521 | return _XkbReadGetMapReply(dpy,&rep,xkb,NULL((void*)0)); |
| 522 | } |
| 523 | |
| 524 | Statusint |
| 525 | XkbGetUpdatedMap(Display *dpy,unsigned which,XkbDescPtr xkb) |
| 526 | { |
| 527 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 528 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 529 | return BadAccess10; |
| 530 | if (which) { |
| 531 | register xkbGetMapReq *req; |
| 532 | Statusint status; |
| 533 | |
| 534 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 535 | |
| 536 | req = _XkbGetGetMapReq(dpy, xkb); |
| 537 | req->full = which; |
| 538 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 539 | |
| 540 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 541 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 542 | return status; |
| 543 | } |
| 544 | return Success0; |
| 545 | } |
| 546 | |
| 547 | XkbDescPtr |
| 548 | XkbGetMap(Display *dpy,unsigned which,unsigned deviceSpec) |
| 549 | { |
| 550 | XkbDescPtr xkb; |
| 551 | |
| 552 | xkb = _XkbTypedCalloc(1,XkbDescRec)((XkbDescRec *)calloc((((1)) == 0 ? 1 : ((1))), (sizeof(XkbDescRec )))); |
| 553 | if (xkb) { |
| 554 | xkb->device_spec = deviceSpec; |
| 555 | xkb->map = _XkbTypedCalloc(1,XkbClientMapRec)((XkbClientMapRec *)calloc((((1)) == 0 ? 1 : ((1))), (sizeof( XkbClientMapRec)))); |
| 556 | if ((xkb->map==NULL((void*)0))|| |
| 557 | ((which)&&(XkbGetUpdatedMap(dpy,which,xkb)!=Success0))) { |
| 558 | if (xkb->map) { |
| 559 | Xfree(xkb->map)free((xkb->map)); |
| 560 | xkb->map= NULL((void*)0); |
| 561 | } |
| 562 | Xfree(xkb)free((xkb)); |
| 563 | return NULL((void*)0); |
| 564 | } |
| 565 | xkb->dpy= dpy; |
| 566 | } |
| 567 | return xkb; |
| 568 | } |
| 569 | |
| 570 | Statusint |
| 571 | XkbGetKeyTypes(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 572 | { |
| 573 | register xkbGetMapReq *req; |
| 574 | Statusint status; |
| 575 | |
| 576 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 577 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 578 | return BadAccess10; |
| 579 | if ((num<1)||(num>XkbMaxKeyTypes255)) |
| 580 | return BadValue2; |
| 581 | |
| 582 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 583 | |
| 584 | req = _XkbGetGetMapReq(dpy, xkb); |
| 585 | req->firstType = first; |
| 586 | req->nTypes = num; |
| 587 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 588 | |
| 589 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 590 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 591 | return status; |
| 592 | } |
| 593 | |
| 594 | Statusint |
| 595 | XkbGetKeyActions(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 596 | { |
| 597 | register xkbGetMapReq *req; |
| 598 | Statusint status; |
| 599 | |
| 600 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 601 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 602 | return BadAccess10; |
| 603 | |
| 604 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 605 | return BadValue2; |
| 606 | |
| 607 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 608 | |
| 609 | req = _XkbGetGetMapReq(dpy, xkb); |
| 610 | req->firstKeyAct = first; |
| 611 | req->nKeyActs = num; |
| 612 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 613 | |
| 614 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 615 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 616 | return status; |
| 617 | } |
| 618 | |
| 619 | Statusint |
| 620 | XkbGetKeySyms(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 621 | { |
| 622 | register xkbGetMapReq *req; |
| 623 | Statusint status; |
| 624 | |
| 625 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 626 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 627 | return BadAccess10; |
| 628 | |
| 629 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 630 | return BadValue2; |
| 631 | |
| 632 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 633 | |
| 634 | req = _XkbGetGetMapReq(dpy, xkb); |
| 635 | req->firstKeySym = first; |
| 636 | req->nKeySyms = num; |
| 637 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 638 | |
| 639 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 640 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 641 | |
| 642 | return status; |
| 643 | } |
| 644 | |
| 645 | Statusint |
| 646 | XkbGetKeyBehaviors(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 647 | { |
| 648 | register xkbGetMapReq *req; |
| 649 | Statusint status; |
| 650 | |
| 651 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 652 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 653 | return BadAccess10; |
| 654 | |
| 655 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 656 | return BadValue2; |
| 657 | |
| 658 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 659 | |
| 660 | req = _XkbGetGetMapReq(dpy, xkb); |
| 661 | req->firstKeyBehavior = first; |
| 662 | req->nKeyBehaviors = num; |
| 663 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 664 | |
| 665 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 666 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 667 | return status; |
| 668 | } |
| 669 | |
| 670 | Statusint |
| 671 | XkbGetVirtualMods(Display *dpy,unsigned which,XkbDescPtr xkb) |
| 672 | { |
| 673 | register xkbGetMapReq *req; |
| 674 | Statusint status; |
| 675 | |
| 676 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 677 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 678 | return BadAccess10; |
| 679 | |
| 680 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 681 | |
| 682 | req = _XkbGetGetMapReq(dpy, xkb); |
| 683 | req->virtualMods = which; |
| 684 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 685 | |
| 686 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 687 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 688 | return status; |
| 689 | } |
| 690 | |
| 691 | Statusint |
| 692 | XkbGetKeyExplicitComponents( Display * dpy, |
| 693 | unsigned first, |
| 694 | unsigned num, |
| 695 | XkbDescPtr xkb) |
| 696 | { |
| 697 | register xkbGetMapReq *req; |
| 698 | Statusint status; |
| 699 | |
| 700 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 701 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 702 | return BadAccess10; |
| 703 | |
| 704 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 705 | return BadValue2; |
| 706 | |
| 707 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 708 | |
| 709 | req = _XkbGetGetMapReq(dpy, xkb); |
| 710 | req->firstKeyExplicit = first; |
| 711 | req->nKeyExplicit = num; |
| 712 | if ((xkb!=NULL((void*)0)) && (xkb->server!=NULL((void*)0)) && (xkb->server->explicit!=NULL((void*)0))) { |
| 713 | if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code)) |
| 714 | bzero(&xkb->server->explicit[first],num)memset(&xkb->server->explicit[first],0,num); |
| 715 | } |
| 716 | if (xkb) |
| 717 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 718 | else |
| 719 | status = BadMatch8; |
| 720 | |
| 721 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 722 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 723 | return status; |
| 724 | } |
| 725 | |
| 726 | Statusint |
| 727 | XkbGetKeyModifierMap(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 728 | { |
| 729 | register xkbGetMapReq *req; |
| 730 | Statusint status; |
| 731 | |
| 732 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 733 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 734 | return BadAccess10; |
| 735 | |
| 736 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 737 | return BadValue2; |
| 738 | |
| 739 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 740 | |
| 741 | req = _XkbGetGetMapReq(dpy, xkb); |
| 742 | req->firstModMapKey = first; |
| 743 | req->nModMapKeys = num; |
| 744 | if ((xkb!=NULL((void*)0)) && (xkb->map!=NULL((void*)0)) && (xkb->map->modmap!=NULL((void*)0))) { |
| 745 | if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code)) |
| 746 | bzero(&xkb->map->modmap[first],num)memset(&xkb->map->modmap[first],0,num); |
| 747 | } |
| 748 | if (xkb) |
| 749 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 750 | else |
| 751 | status = BadMatch8; |
| 752 | |
| 753 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 754 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 755 | return status; |
| 756 | } |
| 757 | |
| 758 | Statusint |
| 759 | XkbGetKeyVirtualModMap(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb) |
| 760 | { |
| 761 | register xkbGetMapReq *req; |
| 762 | Statusint status; |
| 763 | |
| 764 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 765 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 766 | return BadAccess10; |
| 767 | |
| 768 | if ((num<1)||(num>XkbMaxKeyCount(255 -8 +1))) |
| 769 | return BadValue2; |
| 770 | |
| 771 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 772 | |
| 773 | req = _XkbGetGetMapReq(dpy, xkb); |
| 774 | req->firstVModMapKey = first; |
| 775 | req->nVModMapKeys = num; |
| 776 | if ((xkb!=NULL((void*)0)) && (xkb->map!=NULL((void*)0)) && (xkb->map->modmap!=NULL((void*)0))) { |
| 777 | if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code)) |
| 778 | bzero(&xkb->server->vmodmap[first],num*sizeof(unsigned short))memset(&xkb->server->vmodmap[first],0,num*sizeof(unsigned short)); |
| 779 | } |
| 780 | |
| 781 | if (xkb) |
| 782 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 783 | else |
| 784 | status = BadMatch8; |
| 785 | |
| 786 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 787 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 788 | return status; |
| 789 | } |
| 790 | |
| 791 | Statusint |
| 792 | XkbGetMapChanges(Display *dpy,XkbDescPtr xkb,XkbMapChangesPtr changes) |
| 793 | { |
| 794 | xkbGetMapReq *req; |
| 795 | |
| 796 | if ((dpy->flags & XlibDisplayNoXkb(1L << 2)) || |
| 797 | (!dpy->xkb_info && !XkbUseExtension(dpy,NULL((void*)0),NULL((void*)0)))) |
| 798 | return BadAccess10; |
| 799 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); |
| 800 | if (changes->changed) { |
| 801 | Statusint status= Success0; |
| 802 | req = _XkbGetGetMapReq(dpy, xkb); |
| 803 | req->full = 0; |
| 804 | req->partial = changes->changed; |
| 805 | req->firstType = changes->first_type; |
| 806 | req->nTypes = changes->num_types; |
| 807 | req->firstKeySym = changes->first_key_sym; |
| 808 | req->nKeySyms = changes->num_key_syms; |
| 809 | req->firstKeyAct = changes->first_key_act; |
| 810 | req->nKeyActs = changes->num_key_acts; |
| 811 | req->firstKeyBehavior = changes->first_key_behavior; |
| 812 | req->nKeyBehaviors = changes->num_key_behaviors; |
| 813 | req->virtualMods = changes->vmods; |
| 814 | req->firstKeyExplicit = changes->first_key_explicit; |
| 815 | req->nKeyExplicit = changes->num_key_explicit; |
| 816 | req->firstModMapKey = changes->first_modmap_key; |
| 817 | req->nModMapKeys = changes->num_modmap_keys; |
| 818 | req->firstVModMapKey = changes->first_vmodmap_key; |
| 819 | req->nVModMapKeys = changes->num_vmodmap_keys; |
| 820 | status= _XkbHandleGetMapReply(dpy, xkb); |
| 821 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 822 | SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy); |
| 823 | return status; |
| 824 | } |
| 825 | UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); |
| 826 | return Success0; |
| 827 | } |
| 828 |