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