xkbSwap.c revision 706f2543
1428d7b3dSmrg/************************************************************ 2428d7b3dSmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc. 3428d7b3dSmrg 4428d7b3dSmrgPermission to use, copy, modify, and distribute this 5428d7b3dSmrgsoftware and its documentation for any purpose and without 6428d7b3dSmrgfee is hereby granted, provided that the above copyright 7428d7b3dSmrgnotice appear in all copies and that both that copyright 8428d7b3dSmrgnotice and this permission notice appear in supporting 9428d7b3dSmrgdocumentation, and that the name of Silicon Graphics not be 10428d7b3dSmrgused in advertising or publicity pertaining to distribution 11428d7b3dSmrgof the software without specific prior written permission. 12428d7b3dSmrgSilicon Graphics makes no representation about the suitability 13428d7b3dSmrgof this software for any purpose. It is provided "as is" 14428d7b3dSmrgwithout any express or implied warranty. 15428d7b3dSmrg 16428d7b3dSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 17428d7b3dSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 18428d7b3dSmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 19428d7b3dSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 20428d7b3dSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21428d7b3dSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 22428d7b3dSmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 23428d7b3dSmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE. 24428d7b3dSmrg 25428d7b3dSmrg********************************************************/ 26428d7b3dSmrg 27428d7b3dSmrg#ifdef HAVE_DIX_CONFIG_H 28428d7b3dSmrg#include <dix-config.h> 29428d7b3dSmrg#endif 30428d7b3dSmrg 31428d7b3dSmrg#include "stdio.h" 32428d7b3dSmrg#include <X11/X.h> 33428d7b3dSmrg#include <X11/Xproto.h> 34428d7b3dSmrg#include "misc.h" 35428d7b3dSmrg#include "inputstr.h" 36428d7b3dSmrg#include <xkbsrv.h> 37428d7b3dSmrg#include "xkbstr.h" 38428d7b3dSmrg#include "extnsionst.h" 39428d7b3dSmrg#include "xkb.h" 40428d7b3dSmrg 41428d7b3dSmrg /* 42428d7b3dSmrg * REQUEST SWAPPING 43428d7b3dSmrg */ 44428d7b3dSmrgstatic int 45428d7b3dSmrgSProcXkbUseExtension(ClientPtr client) 46428d7b3dSmrg{ 47428d7b3dSmrgregister int n; 48428d7b3dSmrg 49428d7b3dSmrg REQUEST(xkbUseExtensionReq); 50428d7b3dSmrg 51428d7b3dSmrg swaps(&stuff->length,n); 52428d7b3dSmrg REQUEST_SIZE_MATCH(xkbUseExtensionReq); 53428d7b3dSmrg swaps(&stuff->wantedMajor,n); 54428d7b3dSmrg swaps(&stuff->wantedMinor,n); 55428d7b3dSmrg return ProcXkbUseExtension(client); 56428d7b3dSmrg} 57428d7b3dSmrg 58428d7b3dSmrgstatic int 59428d7b3dSmrgSProcXkbSelectEvents(ClientPtr client) 60428d7b3dSmrg{ 61428d7b3dSmrgregister int n; 62428d7b3dSmrg 63428d7b3dSmrg REQUEST(xkbSelectEventsReq); 64428d7b3dSmrg 65428d7b3dSmrg swaps(&stuff->length,n); 66428d7b3dSmrg REQUEST_AT_LEAST_SIZE(xkbSelectEventsReq); 67428d7b3dSmrg swaps(&stuff->deviceSpec,n); 68428d7b3dSmrg swaps(&stuff->affectWhich,n); 69428d7b3dSmrg swaps(&stuff->clear,n); 70428d7b3dSmrg swaps(&stuff->selectAll,n); 71428d7b3dSmrg swaps(&stuff->affectMap,n); 72428d7b3dSmrg swaps(&stuff->map,n); 73428d7b3dSmrg if ((stuff->affectWhich&(~XkbMapNotifyMask))!=0) { 74428d7b3dSmrg union { 75428d7b3dSmrg BOOL *b; 76428d7b3dSmrg CARD8 *c8; 77428d7b3dSmrg CARD16 *c16; 78428d7b3dSmrg CARD32 *c32; 79428d7b3dSmrg } from; 80428d7b3dSmrg register unsigned bit,ndx,maskLeft,dataLeft,size; 81428d7b3dSmrg 82428d7b3dSmrg from.c8= (CARD8 *)&stuff[1]; 83428d7b3dSmrg dataLeft= (stuff->length*4)-SIZEOF(xkbSelectEventsReq); 84428d7b3dSmrg maskLeft= (stuff->affectWhich&(~XkbMapNotifyMask)); 85428d7b3dSmrg for (ndx=0,bit=1; (maskLeft!=0); ndx++, bit<<=1) { 86428d7b3dSmrg if (((bit&maskLeft)==0)||(ndx==XkbMapNotify)) 87428d7b3dSmrg continue; 88428d7b3dSmrg maskLeft&= ~bit; 89428d7b3dSmrg if ((stuff->selectAll&bit)||(stuff->clear&bit)) 90428d7b3dSmrg continue; 91428d7b3dSmrg switch (ndx) { 92428d7b3dSmrg case XkbNewKeyboardNotify: 93428d7b3dSmrg case XkbStateNotify: 94428d7b3dSmrg case XkbNamesNotify: 95428d7b3dSmrg case XkbAccessXNotify: 96428d7b3dSmrg case XkbExtensionDeviceNotify: 97428d7b3dSmrg size= 2; 98428d7b3dSmrg break; 99428d7b3dSmrg case XkbControlsNotify: 100428d7b3dSmrg case XkbIndicatorStateNotify: 101428d7b3dSmrg case XkbIndicatorMapNotify: 102428d7b3dSmrg size= 4; 103428d7b3dSmrg break; 104428d7b3dSmrg case XkbBellNotify: 105428d7b3dSmrg case XkbActionMessage: 106428d7b3dSmrg case XkbCompatMapNotify: 107428d7b3dSmrg size= 1; 108428d7b3dSmrg break; 109428d7b3dSmrg default: 110428d7b3dSmrg client->errorValue = _XkbErrCode2(0x1,bit); 111428d7b3dSmrg return BadValue; 112428d7b3dSmrg } 113428d7b3dSmrg if (dataLeft<(size*2)) 114428d7b3dSmrg return BadLength; 115428d7b3dSmrg if (size==2) { 116428d7b3dSmrg swaps(&from.c16[0],n); 117428d7b3dSmrg swaps(&from.c16[1],n); 118428d7b3dSmrg } 119428d7b3dSmrg else if (size==4) { 120428d7b3dSmrg swapl(&from.c32[0],n); 121428d7b3dSmrg swapl(&from.c32[1],n); 122428d7b3dSmrg } 123428d7b3dSmrg else { 124428d7b3dSmrg size= 2; 125428d7b3dSmrg } 126428d7b3dSmrg from.c8+= (size*2); 127428d7b3dSmrg dataLeft-= (size*2); 128428d7b3dSmrg } 129428d7b3dSmrg if (dataLeft>2) { 130428d7b3dSmrg ErrorF("[xkb] Extra data (%d bytes) after SelectEvents\n",dataLeft); 131428d7b3dSmrg return BadLength; 132428d7b3dSmrg } 133428d7b3dSmrg } 134428d7b3dSmrg return ProcXkbSelectEvents(client); 135428d7b3dSmrg} 136428d7b3dSmrg 137428d7b3dSmrgstatic int 138428d7b3dSmrgSProcXkbBell(ClientPtr client) 139428d7b3dSmrg{ 140428d7b3dSmrgregister int n; 141 142 REQUEST(xkbBellReq); 143 144 swaps(&stuff->length,n); 145 REQUEST_SIZE_MATCH(xkbBellReq); 146 swaps(&stuff->deviceSpec,n); 147 swaps(&stuff->bellClass,n); 148 swaps(&stuff->bellID,n); 149 swapl(&stuff->name,n); 150 swapl(&stuff->window,n); 151 swaps(&stuff->pitch,n); 152 swaps(&stuff->duration,n); 153 return ProcXkbBell(client); 154} 155 156static int 157SProcXkbGetState(ClientPtr client) 158{ 159register int n; 160 161 REQUEST(xkbGetStateReq); 162 163 swaps(&stuff->length,n); 164 REQUEST_SIZE_MATCH(xkbGetStateReq); 165 swaps(&stuff->deviceSpec,n); 166 return ProcXkbGetState(client); 167} 168 169static int 170SProcXkbLatchLockState(ClientPtr client) 171{ 172register int n; 173 174 REQUEST(xkbLatchLockStateReq); 175 176 swaps(&stuff->length,n); 177 REQUEST_SIZE_MATCH(xkbLatchLockStateReq); 178 swaps(&stuff->deviceSpec,n); 179 swaps(&stuff->groupLatch,n); 180 return ProcXkbLatchLockState(client); 181} 182 183static int 184SProcXkbGetControls(ClientPtr client) 185{ 186register int n; 187 188 REQUEST(xkbGetControlsReq); 189 190 swaps(&stuff->length,n); 191 REQUEST_SIZE_MATCH(xkbGetControlsReq); 192 swaps(&stuff->deviceSpec,n); 193 return ProcXkbGetControls(client); 194} 195 196static int 197SProcXkbSetControls(ClientPtr client) 198{ 199register int n; 200 201 REQUEST(xkbSetControlsReq); 202 203 swaps(&stuff->length,n); 204 REQUEST_SIZE_MATCH(xkbSetControlsReq); 205 swaps(&stuff->deviceSpec,n); 206 swaps(&stuff->affectInternalVMods,n); 207 swaps(&stuff->internalVMods,n); 208 swaps(&stuff->affectIgnoreLockVMods,n); 209 swaps(&stuff->ignoreLockVMods,n); 210 swaps(&stuff->axOptions,n); 211 swapl(&stuff->affectEnabledCtrls,n); 212 swapl(&stuff->enabledCtrls,n); 213 swapl(&stuff->changeCtrls,n); 214 swaps(&stuff->repeatDelay,n); 215 swaps(&stuff->repeatInterval,n); 216 swaps(&stuff->slowKeysDelay,n); 217 swaps(&stuff->debounceDelay,n); 218 swaps(&stuff->mkDelay,n); 219 swaps(&stuff->mkInterval,n); 220 swaps(&stuff->mkTimeToMax,n); 221 swaps(&stuff->mkMaxSpeed,n); 222 swaps(&stuff->mkCurve,n); 223 swaps(&stuff->axTimeout,n); 224 swapl(&stuff->axtCtrlsMask,n); 225 swapl(&stuff->axtCtrlsValues,n); 226 swaps(&stuff->axtOptsMask,n); 227 swaps(&stuff->axtOptsValues,n); 228 return ProcXkbSetControls(client); 229} 230 231static int 232SProcXkbGetMap(ClientPtr client) 233{ 234register int n; 235 236 REQUEST(xkbGetMapReq); 237 238 swaps(&stuff->length,n); 239 REQUEST_SIZE_MATCH(xkbGetMapReq); 240 swaps(&stuff->deviceSpec,n); 241 swaps(&stuff->full,n); 242 swaps(&stuff->partial,n); 243 swaps(&stuff->virtualMods,n); 244 return ProcXkbGetMap(client); 245} 246 247static int 248SProcXkbSetMap(ClientPtr client) 249{ 250register int n; 251 252 REQUEST(xkbSetMapReq); 253 254 swaps(&stuff->length,n); 255 REQUEST_AT_LEAST_SIZE(xkbSetMapReq); 256 swaps(&stuff->deviceSpec,n); 257 swaps(&stuff->present,n); 258 swaps(&stuff->flags,n); 259 swaps(&stuff->totalSyms,n); 260 swaps(&stuff->totalActs,n); 261 swaps(&stuff->virtualMods,n); 262 return ProcXkbSetMap(client); 263} 264 265 266static int 267SProcXkbGetCompatMap(ClientPtr client) 268{ 269register int n; 270 271 REQUEST(xkbGetCompatMapReq); 272 273 swaps(&stuff->length,n); 274 REQUEST_SIZE_MATCH(xkbGetCompatMapReq); 275 swaps(&stuff->deviceSpec,n); 276 swaps(&stuff->firstSI,n); 277 swaps(&stuff->nSI,n); 278 return ProcXkbGetCompatMap(client); 279} 280 281static int 282SProcXkbSetCompatMap(ClientPtr client) 283{ 284register int n; 285 286 REQUEST(xkbSetCompatMapReq); 287 288 swaps(&stuff->length,n); 289 REQUEST_AT_LEAST_SIZE(xkbSetCompatMapReq); 290 swaps(&stuff->deviceSpec,n); 291 swaps(&stuff->firstSI,n); 292 swaps(&stuff->nSI,n); 293 return ProcXkbSetCompatMap(client); 294} 295 296static int 297SProcXkbGetIndicatorState(ClientPtr client) 298{ 299register int n; 300 301 REQUEST(xkbGetIndicatorStateReq); 302 303 swaps(&stuff->length,n); 304 REQUEST_SIZE_MATCH(xkbGetIndicatorStateReq); 305 swaps(&stuff->deviceSpec,n); 306 return ProcXkbGetIndicatorState(client); 307} 308 309static int 310SProcXkbGetIndicatorMap(ClientPtr client) 311{ 312register int n; 313 314 REQUEST(xkbGetIndicatorMapReq); 315 316 swaps(&stuff->length,n); 317 REQUEST_SIZE_MATCH(xkbGetIndicatorMapReq); 318 swaps(&stuff->deviceSpec,n); 319 swapl(&stuff->which,n); 320 return ProcXkbGetIndicatorMap(client); 321} 322 323static int 324SProcXkbSetIndicatorMap(ClientPtr client) 325{ 326register int n; 327 328 REQUEST(xkbSetIndicatorMapReq); 329 330 swaps(&stuff->length,n); 331 REQUEST_AT_LEAST_SIZE(xkbSetIndicatorMapReq); 332 swaps(&stuff->deviceSpec,n); 333 swapl(&stuff->which,n); 334 return ProcXkbSetIndicatorMap(client); 335} 336 337static int 338SProcXkbGetNamedIndicator(ClientPtr client) 339{ 340register int n; 341 342 REQUEST(xkbGetNamedIndicatorReq); 343 344 swaps(&stuff->length,n); 345 REQUEST_SIZE_MATCH(xkbGetNamedIndicatorReq); 346 swaps(&stuff->deviceSpec,n); 347 swaps(&stuff->ledClass,n); 348 swaps(&stuff->ledID,n); 349 swapl(&stuff->indicator,n); 350 return ProcXkbGetNamedIndicator(client); 351} 352 353static int 354SProcXkbSetNamedIndicator(ClientPtr client) 355{ 356register int n; 357 358 REQUEST(xkbSetNamedIndicatorReq); 359 360 swaps(&stuff->length,n); 361 REQUEST_SIZE_MATCH(xkbSetNamedIndicatorReq); 362 swaps(&stuff->deviceSpec,n); 363 swaps(&stuff->ledClass,n); 364 swaps(&stuff->ledID,n); 365 swapl(&stuff->indicator,n); 366 swaps(&stuff->virtualMods,n); 367 swapl(&stuff->ctrls,n); 368 return ProcXkbSetNamedIndicator(client); 369} 370 371 372static int 373SProcXkbGetNames(ClientPtr client) 374{ 375register int n; 376 377 REQUEST(xkbGetNamesReq); 378 379 swaps(&stuff->length,n); 380 REQUEST_SIZE_MATCH(xkbGetNamesReq); 381 swaps(&stuff->deviceSpec,n); 382 swapl(&stuff->which,n); 383 return ProcXkbGetNames(client); 384} 385 386static int 387SProcXkbSetNames(ClientPtr client) 388{ 389register int n; 390 391 REQUEST(xkbSetNamesReq); 392 393 swaps(&stuff->length,n); 394 REQUEST_AT_LEAST_SIZE(xkbSetNamesReq); 395 swaps(&stuff->deviceSpec,n); 396 swaps(&stuff->virtualMods,n); 397 swapl(&stuff->which,n); 398 swapl(&stuff->indicators,n); 399 swaps(&stuff->totalKTLevelNames,n); 400 return ProcXkbSetNames(client); 401} 402 403static int 404SProcXkbGetGeometry(ClientPtr client) 405{ 406register int n; 407 408 REQUEST(xkbGetGeometryReq); 409 410 swaps(&stuff->length,n); 411 REQUEST_SIZE_MATCH(xkbGetGeometryReq); 412 swaps(&stuff->deviceSpec,n); 413 swapl(&stuff->name,n); 414 return ProcXkbGetGeometry(client); 415} 416 417static int 418SProcXkbSetGeometry(ClientPtr client) 419{ 420register int n; 421 422 REQUEST(xkbSetGeometryReq); 423 424 swaps(&stuff->length,n); 425 REQUEST_AT_LEAST_SIZE(xkbSetGeometryReq); 426 swaps(&stuff->deviceSpec,n); 427 swapl(&stuff->name,n); 428 swaps(&stuff->widthMM,n); 429 swaps(&stuff->heightMM,n); 430 swaps(&stuff->nProperties,n); 431 swaps(&stuff->nColors,n); 432 swaps(&stuff->nDoodads,n); 433 swaps(&stuff->nKeyAliases,n); 434 return ProcXkbSetGeometry(client); 435} 436 437static int 438SProcXkbPerClientFlags(ClientPtr client) 439{ 440register int n; 441 442 REQUEST(xkbPerClientFlagsReq); 443 444 swaps(&stuff->length,n); 445 REQUEST_SIZE_MATCH(xkbPerClientFlagsReq); 446 swaps(&stuff->deviceSpec,n); 447 swapl(&stuff->change,n); 448 swapl(&stuff->value,n); 449 swapl(&stuff->ctrlsToChange,n); 450 swapl(&stuff->autoCtrls,n); 451 swapl(&stuff->autoCtrlValues,n); 452 return ProcXkbPerClientFlags(client); 453} 454 455static int 456SProcXkbListComponents(ClientPtr client) 457{ 458register int n; 459 460 REQUEST(xkbListComponentsReq); 461 462 swaps(&stuff->length,n); 463 REQUEST_AT_LEAST_SIZE(xkbListComponentsReq); 464 swaps(&stuff->deviceSpec,n); 465 swaps(&stuff->maxNames,n); 466 return ProcXkbListComponents(client); 467} 468 469static int 470SProcXkbGetKbdByName(ClientPtr client) 471{ 472register int n; 473 474 REQUEST(xkbGetKbdByNameReq); 475 476 swaps(&stuff->length,n); 477 REQUEST_AT_LEAST_SIZE(xkbGetKbdByNameReq); 478 swaps(&stuff->deviceSpec,n); 479 swaps(&stuff->want,n); 480 swaps(&stuff->need,n); 481 return ProcXkbGetKbdByName(client); 482} 483 484static int 485SProcXkbGetDeviceInfo(ClientPtr client) 486{ 487register int n; 488 489 REQUEST(xkbGetDeviceInfoReq); 490 491 swaps(&stuff->length,n); 492 REQUEST_SIZE_MATCH(xkbGetDeviceInfoReq); 493 swaps(&stuff->deviceSpec,n); 494 swaps(&stuff->wanted,n); 495 swaps(&stuff->ledClass,n); 496 swaps(&stuff->ledID,n); 497 return ProcXkbGetDeviceInfo(client); 498} 499 500static int 501SProcXkbSetDeviceInfo(ClientPtr client) 502{ 503register int n; 504 505 REQUEST(xkbSetDeviceInfoReq); 506 507 swaps(&stuff->length,n); 508 REQUEST_AT_LEAST_SIZE(xkbSetDeviceInfoReq); 509 swaps(&stuff->deviceSpec,n); 510 swaps(&stuff->change,n); 511 swaps(&stuff->nDeviceLedFBs,n); 512 return ProcXkbSetDeviceInfo(client); 513} 514 515static int 516SProcXkbSetDebuggingFlags(ClientPtr client) 517{ 518register int n; 519 520 REQUEST(xkbSetDebuggingFlagsReq); 521 522 swaps(&stuff->length,n); 523 REQUEST_AT_LEAST_SIZE(xkbSetDebuggingFlagsReq); 524 swapl(&stuff->affectFlags,n); 525 swapl(&stuff->flags,n); 526 swapl(&stuff->affectCtrls,n); 527 swapl(&stuff->ctrls,n); 528 swaps(&stuff->msgLength,n); 529 return ProcXkbSetDebuggingFlags(client); 530} 531 532int 533SProcXkbDispatch (ClientPtr client) 534{ 535 REQUEST(xReq); 536 switch (stuff->data) 537 { 538 case X_kbUseExtension: 539 return SProcXkbUseExtension(client); 540 case X_kbSelectEvents: 541 return SProcXkbSelectEvents(client); 542 case X_kbBell: 543 return SProcXkbBell(client); 544 case X_kbGetState: 545 return SProcXkbGetState(client); 546 case X_kbLatchLockState: 547 return SProcXkbLatchLockState(client); 548 case X_kbGetControls: 549 return SProcXkbGetControls(client); 550 case X_kbSetControls: 551 return SProcXkbSetControls(client); 552 case X_kbGetMap: 553 return SProcXkbGetMap(client); 554 case X_kbSetMap: 555 return SProcXkbSetMap(client); 556 case X_kbGetCompatMap: 557 return SProcXkbGetCompatMap(client); 558 case X_kbSetCompatMap: 559 return SProcXkbSetCompatMap(client); 560 case X_kbGetIndicatorState: 561 return SProcXkbGetIndicatorState(client); 562 case X_kbGetIndicatorMap: 563 return SProcXkbGetIndicatorMap(client); 564 case X_kbSetIndicatorMap: 565 return SProcXkbSetIndicatorMap(client); 566 case X_kbGetNamedIndicator: 567 return SProcXkbGetNamedIndicator(client); 568 case X_kbSetNamedIndicator: 569 return SProcXkbSetNamedIndicator(client); 570 case X_kbGetNames: 571 return SProcXkbGetNames(client); 572 case X_kbSetNames: 573 return SProcXkbSetNames(client); 574 case X_kbGetGeometry: 575 return SProcXkbGetGeometry(client); 576 case X_kbSetGeometry: 577 return SProcXkbSetGeometry(client); 578 case X_kbPerClientFlags: 579 return SProcXkbPerClientFlags(client); 580 case X_kbListComponents: 581 return SProcXkbListComponents(client); 582 case X_kbGetKbdByName: 583 return SProcXkbGetKbdByName(client); 584 case X_kbGetDeviceInfo: 585 return SProcXkbGetDeviceInfo(client); 586 case X_kbSetDeviceInfo: 587 return SProcXkbSetDeviceInfo(client); 588 case X_kbSetDebuggingFlags: 589 return SProcXkbSetDebuggingFlags(client); 590 default: 591 return BadRequest; 592 } 593} 594