1 /************************************************************
3 Copyright (c) 1987 X Consortium
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the name of the X Consortium shall not be
23 used in advertising or otherwise to promote the sale, use or other dealings
24 in this Software without prior written authorization from the X Consortium.
27 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
31 Permission to use, copy, modify, and distribute this software and its
32 documentation for any purpose and without fee is hereby granted,
33 provided that the above copyright notice appear in all copies and that
34 both that copyright notice and this permission notice appear in
35 supporting documentation, and that the name of Digital not be
36 used in advertising or publicity pertaining to distribution of the
37 software without specific, written prior permission.
39 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
40 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
41 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
42 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
43 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
44 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
47 ********************************************************/
50 /* $XFree86: xc/programs/Xserver/dix/devices.c,v 3.11 1996/12/24 02:23:43 dawes Exp $ */
51 /* $XConsortium: devices.c /main/54 1996/09/25 00:45:00 dpw $ */
59 #include "windowstr.h"
61 #include "scrnintstr.h"
62 #include "cursorstr.h"
63 #include "dixstruct.h"
70 #define _SECURITY_SERVER
71 #include "extensions/security.h"
76 #include "dixevents.h"
79 _AddInputDevice(deviceProc, autoStart)
80 DeviceProc deviceProc;
83 register DeviceIntPtr dev;
85 if (inputInfo.numDevices >= MAX_DEVICES)
86 return (DeviceIntPtr)NULL;
87 dev = (DeviceIntPtr) xalloc(sizeof(DeviceIntRec));
89 return (DeviceIntPtr)NULL;
90 dev->name = (char *)NULL;
92 dev->id = inputInfo.numDevices;
93 inputInfo.numDevices++;
94 dev->public.on = FALSE;
95 dev->public.processInputProc = (ProcessInputProc)NoopDDA;
96 dev->public.realInputProc = (ProcessInputProc)NoopDDA;
97 dev->public.enqueueInputProc = EnqueueEvent;
98 dev->deviceProc = deviceProc;
99 dev->startup = autoStart;
100 dev->sync.frozen = FALSE;
101 dev->sync.other = NullGrab;
102 dev->sync.state = NOT_GRABBED;
103 dev->sync.event = (xEvent *) NULL;
104 dev->sync.evcount = 0;
105 dev->grab = NullGrab;
106 dev->grabTime = currentTime;
107 dev->fromPassiveGrab = FALSE;
108 dev->key = (KeyClassPtr)NULL;
109 dev->valuator = (ValuatorClassPtr)NULL;
110 dev->button = (ButtonClassPtr)NULL;
111 dev->focus = (FocusClassPtr)NULL;
112 dev->proximity = (ProximityClassPtr)NULL;
113 dev->kbdfeed = (KbdFeedbackPtr)NULL;
114 dev->ptrfeed = (PtrFeedbackPtr)NULL;
115 dev->intfeed = (IntegerFeedbackPtr)NULL;
116 dev->stringfeed = (StringFeedbackPtr)NULL;
117 dev->bell = (BellFeedbackPtr)NULL;
118 dev->leds = (LedFeedbackPtr)NULL;
119 dev->next = inputInfo.off_devices;
121 dev->xkb_interest= NULL;
123 inputInfo.off_devices = dev;
129 register DeviceIntPtr dev;
131 register DeviceIntPtr *prev;
133 for (prev = &inputInfo.off_devices;
134 *prev && (*prev != dev);
135 prev = &(*prev)->next)
137 if ((*prev != dev) || !dev->inited ||
138 ((*dev->deviceProc)(dev, DEVICE_ON) != Success))
141 dev->next = inputInfo.devices;
142 inputInfo.devices = dev;
148 register DeviceIntPtr dev;
150 register DeviceIntPtr *prev;
152 for (prev = &inputInfo.devices;
153 *prev && (*prev != dev);
154 prev = &(*prev)->next)
158 (void)(*dev->deviceProc)(dev, DEVICE_OFF);
160 dev->next = inputInfo.off_devices;
161 inputInfo.off_devices = dev;
166 InitAndStartDevices()
168 register DeviceIntPtr dev, next;
170 for (dev = inputInfo.off_devices; dev; dev = dev->next)
171 dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success);
172 for (dev = inputInfo.off_devices; dev; dev = next)
175 if (dev->inited && dev->startup)
176 (void)EnableDevice(dev);
178 for (dev = inputInfo.devices;
179 dev && (dev != inputInfo.keyboard);
182 if (!dev || (dev != inputInfo.keyboard))
183 return BadImplementation;
184 for (dev = inputInfo.devices;
185 dev && (dev != inputInfo.pointer);
188 if (!dev || (dev != inputInfo.pointer))
189 return BadImplementation;
194 #if NeedFunctionPrototypes
195 CloseDevice(register DeviceIntPtr dev)
198 register DeviceIntPtr dev;
201 KbdFeedbackPtr k, knext;
202 PtrFeedbackPtr p, pnext;
203 IntegerFeedbackPtr i, inext;
204 StringFeedbackPtr s, snext;
205 BellFeedbackPtr b, bnext;
206 LedFeedbackPtr l, lnext;
209 (void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
214 if (dev->key->xkbInfo)
215 XkbFreeInfo(dev->key->xkbInfo);
217 xfree(dev->key->curKeySyms.map);
218 xfree(dev->key->modifierKeyMap);
221 xfree(dev->valuator);
223 if ((dev->button)&&(dev->button->xkb_acts))
224 xfree(dev->button->xkb_acts);
229 xfree(dev->focus->trace);
232 xfree(dev->proximity);
233 for (k=dev->kbdfeed; k; k=knext)
238 XkbFreeSrvLedInfo(k->xkb_sli);
242 for (p=dev->ptrfeed; p; p=pnext)
247 for (i=dev->intfeed; i; i=inext)
252 for (s=dev->stringfeed; s; s=snext)
255 xfree(s->ctrl.symbols_supported);
256 xfree(s->ctrl.symbols_displayed);
259 for (b=dev->bell; b; b=bnext)
264 for (l=dev->leds; l; l=lnext)
269 XkbFreeSrvLedInfo(l->xkb_sli);
274 while (dev->xkb_interest) {
275 XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
278 xfree(dev->sync.event);
285 register DeviceIntPtr dev, next;
287 for (dev = inputInfo.devices; dev; dev = next)
292 for (dev = inputInfo.off_devices; dev; dev = next)
297 inputInfo.keyboard = NULL;
298 inputInfo.pointer = NULL;
303 register DeviceIntPtr dev;
305 register DeviceIntPtr prev,tmp,next;
308 for (tmp= inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
313 inputInfo.devices = next;
316 inputInfo.numDevices--;
317 if (inputInfo.keyboard == tmp)
318 inputInfo.keyboard = NULL;
319 else if (inputInfo.pointer == tmp)
320 inputInfo.pointer = NULL;
326 for (tmp= inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
331 inputInfo.off_devices = next;
334 inputInfo.numDevices--;
335 if (inputInfo.keyboard == tmp)
336 inputInfo.keyboard = NULL;
337 else if (inputInfo.pointer == tmp)
338 inputInfo.pointer = NULL;
342 ErrorF("Internal Error! Attempt to remove a non-existent device\n");
349 return inputInfo.pointer->valuator->numMotionEvents;
353 _RegisterPointerDevice(device)
356 inputInfo.pointer = device;
358 if (noXkbExtension) {
359 device->public.processInputProc = CoreProcessPointerEvent;
360 device->public.realInputProc = CoreProcessPointerEvent;
362 device->public.processInputProc = ProcessPointerEvent;
363 device->public.realInputProc = ProcessPointerEvent;
366 device->public.processInputProc = ProcessPointerEvent;
367 device->public.realInputProc = ProcessPointerEvent;
369 device->ActivateGrab = ActivatePointerGrab;
370 device->DeactivateGrab = DeactivatePointerGrab;
374 device->name = (char *)xalloc(strlen(p) + 1);
375 strcpy(device->name, p);
380 _RegisterKeyboardDevice(device)
383 inputInfo.keyboard = device;
385 if (noXkbExtension) {
386 device->public.processInputProc = CoreProcessKeyboardEvent;
387 device->public.realInputProc = CoreProcessKeyboardEvent;
389 device->public.processInputProc = ProcessKeyboardEvent;
390 device->public.realInputProc = ProcessKeyboardEvent;
393 device->public.processInputProc = ProcessKeyboardEvent;
394 device->public.realInputProc = ProcessKeyboardEvent;
396 device->ActivateGrab = ActivateKeyboardGrab;
397 device->DeactivateGrab = DeactivateKeyboardGrab;
400 char *k = "keyboard";
401 device->name = (char *)xalloc(strlen(k) + 1);
402 strcpy(device->name, k);
407 LookupKeyboardDevice()
409 return inputInfo.keyboard ? &inputInfo.keyboard->public : NULL;
413 LookupPointerDevice()
415 return inputInfo.pointer ? &inputInfo.pointer->public : NULL;
424 for (dev=inputInfo.devices; dev; dev=dev->next) {
425 if (dev->id == (CARD8)id)
426 return (DevicePtr)dev;
428 for (dev=inputInfo.off_devices; dev; dev=dev->next) {
429 if (dev->id == (CARD8)id)
430 return (DevicePtr)dev;
436 QueryMinMaxKeyCodes(minCode, maxCode)
437 KeyCode *minCode, *maxCode;
439 if (inputInfo.keyboard) {
440 *minCode = inputInfo.keyboard->key->curKeySyms.minKeyCode;
441 *maxCode = inputInfo.keyboard->key->curKeySyms.maxKeyCode;
446 SetKeySymsMap(dst, src)
447 register KeySymsPtr dst, src;
450 int rowDif = src->minKeyCode - dst->minKeyCode;
451 /* if keysym map size changes, grow map first */
453 if (src->mapWidth < dst->mapWidth)
455 for (i = src->minKeyCode; i <= src->maxKeyCode; i++)
457 #define SI(r, c) (((r-src->minKeyCode)*src->mapWidth) + (c))
458 #define DI(r, c) (((r - dst->minKeyCode)*dst->mapWidth) + (c))
459 for (j = 0; j < src->mapWidth; j++)
460 dst->map[DI(i, j)] = src->map[SI(i, j)];
461 for (j = src->mapWidth; j < dst->mapWidth; j++)
462 dst->map[DI(i, j)] = NoSymbol;
468 else if (src->mapWidth > dst->mapWidth)
471 int bytes = sizeof(KeySym) * src->mapWidth *
472 (dst->maxKeyCode - dst->minKeyCode + 1);
473 map = (KeySym *)xalloc(bytes);
476 bzero((char *)map, bytes);
479 for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
480 memmove((char *)&map[i*src->mapWidth],
481 (char *)&dst->map[i*dst->mapWidth],
482 dst->mapWidth * sizeof(KeySym));
485 dst->mapWidth = src->mapWidth;
488 memmove((char *)&dst->map[rowDif * dst->mapWidth],
490 (int)(src->maxKeyCode - src->minKeyCode + 1) *
491 dst->mapWidth * sizeof(KeySym));
496 #if NeedFunctionPrototypes
497 InitModMap(register KeyClassPtr keyc)
500 register KeyClassPtr keyc;
504 CARD8 keysPerModifier[8];
507 keyc->maxKeysPerModifier = 0;
508 for (i = 0; i < 8; i++)
509 keysPerModifier[i] = 0;
510 for (i = 8; i < MAP_LENGTH; i++)
512 for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
514 if (mask & keyc->modifierMap[i])
516 if (++keysPerModifier[j] > keyc->maxKeysPerModifier)
517 keyc->maxKeysPerModifier = keysPerModifier[j];
521 keyc->modifierKeyMap = (KeyCode *)xalloc(8*keyc->maxKeysPerModifier);
522 if (!keyc->modifierKeyMap && keyc->maxKeysPerModifier)
524 bzero((char *)keyc->modifierKeyMap, 8*(int)keyc->maxKeysPerModifier);
525 for (i = 0; i < 8; i++)
526 keysPerModifier[i] = 0;
527 for (i = 8; i < MAP_LENGTH; i++)
529 for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
531 if (mask & keyc->modifierMap[i])
533 keyc->modifierKeyMap[(j*keyc->maxKeysPerModifier) +
534 keysPerModifier[j]] = i;
535 keysPerModifier[j]++;
543 InitKeyClassDeviceStruct(dev, pKeySyms, pModifiers)
549 register KeyClassPtr keyc;
551 keyc = (KeyClassPtr)xalloc(sizeof(KeyClassRec));
554 keyc->curKeySyms.map = (KeySym *)NULL;
555 keyc->curKeySyms.mapWidth = 0;
556 keyc->curKeySyms.minKeyCode = pKeySyms->minKeyCode;
557 keyc->curKeySyms.maxKeyCode = pKeySyms->maxKeyCode;
558 keyc->modifierKeyMap = (KeyCode *)NULL;
560 keyc->prev_state = 0;
562 memmove((char *)keyc->modifierMap, (char *)pModifiers, MAP_LENGTH);
564 bzero((char *)keyc->modifierMap, MAP_LENGTH);
565 bzero((char *)keyc->down, DOWN_LENGTH);
566 for (i = 0; i < 8; i++)
567 keyc->modifierKeyCount[i] = 0;
568 if (!SetKeySymsMap(&keyc->curKeySyms, pKeySyms) || !InitModMap(keyc))
570 xfree(keyc->curKeySyms.map);
571 xfree(keyc->modifierKeyMap);
577 dev->key->xkbInfo= NULL;
578 if (!noXkbExtension) XkbInitDevice(dev);
584 InitButtonClassDeviceStruct(dev, numButtons, map)
585 register DeviceIntPtr dev;
589 register ButtonClassPtr butc;
592 butc = (ButtonClassPtr)xalloc(sizeof(ButtonClassRec));
595 butc->numButtons = numButtons;
596 for (i = 1; i <= numButtons; i++)
597 butc->map[i] = map[i];
598 butc->buttonsDown = 0;
600 butc->motionMask = 0;
601 bzero((char *)butc->down, DOWN_LENGTH);
603 butc->xkb_acts= NULL;
610 InitValuatorClassDeviceStruct(dev, numAxes, motionProc, numMotionEvents, mode)
612 ValuatorMotionProcPtr motionProc;
618 register ValuatorClassPtr valc;
620 valc = (ValuatorClassPtr)xalloc(sizeof(ValuatorClassRec) +
621 numAxes * sizeof(AxisInfo) +
622 numAxes * sizeof(unsigned int));
625 valc->GetMotionProc = motionProc;
626 valc->numMotionEvents = numMotionEvents;
627 valc->motionHintWindow = NullWindow;
628 valc->numAxes = numAxes;
630 valc->axes = (AxisInfoPtr)(valc + 1);
631 valc->axisVal = (int *)(valc->axes + numAxes);
632 for (i=0; i<numAxes; i++)
634 dev->valuator = valc;
639 InitFocusClassDeviceStruct(dev)
642 register FocusClassPtr focc;
644 focc = (FocusClassPtr)xalloc(sizeof(FocusClassRec));
647 focc->win = PointerRootWin;
649 focc->time = currentTime;
650 focc->trace = (WindowPtr *)NULL;
658 InitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc)
660 BellProcPtr bellProc;
661 KbdCtrlProcPtr controlProc;
663 register KbdFeedbackPtr feedc;
665 feedc = (KbdFeedbackPtr)xalloc(sizeof(KbdFeedbackClassRec));
668 feedc->BellProc = bellProc;
669 feedc->CtrlProc = controlProc;
671 defaultKeyboardControl.autoRepeat = TRUE;
673 feedc->ctrl = defaultKeyboardControl;
675 if ((feedc->next = dev->kbdfeed) != 0)
676 feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1;
677 dev->kbdfeed = feedc;
679 feedc->xkb_sli= NULL;
681 XkbFinishDeviceInit(dev);
683 (*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl);
688 InitPtrFeedbackClassDeviceStruct(dev, controlProc)
690 PtrCtrlProcPtr controlProc;
692 register PtrFeedbackPtr feedc;
694 feedc = (PtrFeedbackPtr)xalloc(sizeof(PtrFeedbackClassRec));
697 feedc->CtrlProc = controlProc;
701 feedc->ctrl.threshold = 1;
703 feedc->ctrl = defaultPointerControl;
706 if ( (feedc->next = dev->ptrfeed) )
707 feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1;
708 dev->ptrfeed = feedc;
709 (*controlProc)(dev, &feedc->ctrl);
714 LedCtrl defaultLedControl = {
715 DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0};
717 BellCtrl defaultBellControl = {
720 DEFAULT_BELL_DURATION,
723 IntegerCtrl defaultIntegerControl = {
724 DEFAULT_INT_RESOLUTION,
725 DEFAULT_INT_MIN_VALUE,
726 DEFAULT_INT_MAX_VALUE,
727 DEFAULT_INT_DISPLAYED,
731 InitStringFeedbackClassDeviceStruct (dev, controlProc, max_symbols,
732 num_symbols_supported, symbols)
734 StringCtrlProcPtr controlProc;
736 int num_symbols_supported;
740 register StringFeedbackPtr feedc;
742 feedc = (StringFeedbackPtr)xalloc(sizeof(StringFeedbackClassRec));
745 feedc->CtrlProc = controlProc;
746 feedc->ctrl.num_symbols_supported = num_symbols_supported;
747 feedc->ctrl.num_symbols_displayed = 0;
748 feedc->ctrl.max_symbols = max_symbols;
749 feedc->ctrl.symbols_supported = (KeySym *)
750 xalloc (sizeof (KeySym) * num_symbols_supported);
751 feedc->ctrl.symbols_displayed = (KeySym *)
752 xalloc (sizeof (KeySym) * max_symbols);
753 if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed)
755 if (feedc->ctrl.symbols_supported)
756 xfree(feedc->ctrl.symbols_supported);
757 if (feedc->ctrl.symbols_displayed)
758 xfree(feedc->ctrl.symbols_displayed);
762 for (i=0; i<num_symbols_supported; i++)
763 *(feedc->ctrl.symbols_supported+i) = *symbols++;
764 for (i=0; i<max_symbols; i++)
765 *(feedc->ctrl.symbols_displayed+i) = (KeySym) NULL;
767 if ( (feedc->next = dev->stringfeed) )
768 feedc->ctrl.id = dev->stringfeed->ctrl.id + 1;
769 dev->stringfeed = feedc;
770 (*controlProc)(dev, &feedc->ctrl);
775 InitBellFeedbackClassDeviceStruct (dev, bellProc, controlProc)
777 BellProcPtr bellProc;
778 BellCtrlProcPtr controlProc;
780 register BellFeedbackPtr feedc;
782 feedc = (BellFeedbackPtr)xalloc(sizeof(BellFeedbackClassRec));
785 feedc->CtrlProc = controlProc;
786 feedc->BellProc = bellProc;
787 feedc->ctrl = defaultBellControl;
789 if ( (feedc->next = dev->bell) )
790 feedc->ctrl.id = dev->bell->ctrl.id + 1;
792 (*controlProc)(dev, &feedc->ctrl);
797 InitLedFeedbackClassDeviceStruct (dev, controlProc)
799 LedCtrlProcPtr controlProc;
801 register LedFeedbackPtr feedc;
803 feedc = (LedFeedbackPtr)xalloc(sizeof(LedFeedbackClassRec));
806 feedc->CtrlProc = controlProc;
807 feedc->ctrl = defaultLedControl;
809 if ( (feedc->next = dev->leds) )
810 feedc->ctrl.id = dev->leds->ctrl.id + 1;
812 feedc->xkb_sli= NULL;
815 (*controlProc)(dev, &feedc->ctrl);
820 InitIntegerFeedbackClassDeviceStruct (dev, controlProc)
822 IntegerCtrlProcPtr controlProc;
824 register IntegerFeedbackPtr feedc;
826 feedc = (IntegerFeedbackPtr)xalloc(sizeof(IntegerFeedbackClassRec));
829 feedc->CtrlProc = controlProc;
830 feedc->ctrl = defaultIntegerControl;
832 if ( (feedc->next = dev->intfeed) )
833 feedc->ctrl.id = dev->intfeed->ctrl.id + 1;
834 dev->intfeed = feedc;
835 (*controlProc)(dev, &feedc->ctrl);
840 InitPointerDeviceStruct(device, map, numButtons, motionProc, controlProc,
845 PtrCtrlProcPtr controlProc;
846 ValuatorMotionProcPtr motionProc;
849 DeviceIntPtr dev = (DeviceIntPtr)device;
851 return(InitButtonClassDeviceStruct(dev, numButtons, map) &&
852 InitValuatorClassDeviceStruct(dev, 2, motionProc,
853 numMotionEvents, 0) &&
854 InitPtrFeedbackClassDeviceStruct(dev, controlProc));
858 InitKeyboardDeviceStruct(device, pKeySyms, pModifiers, bellProc, controlProc)
862 BellProcPtr bellProc;
863 KbdCtrlProcPtr controlProc;
865 DeviceIntPtr dev = (DeviceIntPtr)device;
867 return(InitKeyClassDeviceStruct(dev, pKeySyms, pModifiers) &&
868 InitFocusClassDeviceStruct(dev) &&
869 InitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc));
873 SendMappingNotify(request, firstKeyCode, count, client)
874 unsigned int request, count;
875 unsigned int firstKeyCode;
881 event.u.u.type = MappingNotify;
882 event.u.mappingNotify.request = request;
883 if (request == MappingKeyboard)
885 event.u.mappingNotify.firstKeyCode = firstKeyCode;
886 event.u.mappingNotify.count = count;
889 if (!noXkbExtension &&
890 ((request == MappingKeyboard) || (request == MappingModifier))) {
891 XkbApplyMappingChange(inputInfo.keyboard,request,firstKeyCode,count,
896 /* 0 is the server client */
897 for (i=1; i<currentMaxClients; i++)
899 if (clients[i] && clients[i]->clientState == ClientStateRunning)
902 if (!noXkbExtension &&
903 (request == MappingKeyboard) &&
904 (clients[i]->xkbClientFlags != 0) &&
905 (clients[i]->mapNotifyMask&XkbKeySymsMask))
908 event.u.u.sequenceNumber = clients[i]->sequence;
909 WriteEventsToClient(clients[i], 1, &event);
915 * n-squared algorithm. n < 255 and don't want to copy the whole thing and
916 * sort it to do the checking. How often is it called? Just being lazy?
919 BadDeviceMap(buff, length, low, high, errval)
927 for (i = 0; i < length; i++)
928 if (buff[i]) /* only check non-zero elements */
930 if ((low > buff[i]) || (high < buff[i]))
935 for (j = i + 1; j < length; j++)
936 if (buff[i] == buff[j])
946 AllModifierKeysAreUp(dev, map1, per1, map2, per2)
947 register DeviceIntPtr dev;
948 register CARD8 *map1, *map2;
951 register int i, j, k;
952 register CARD8 *down = dev->key->down;
954 for (i = 8; --i >= 0; map2 += per2)
956 for (j = per1; --j >= 0; map1++)
958 if (*map1 && BitIsOn(down, *map1))
960 for (k = per2; (--k >= 0) && (*map1 != map2[k]);)
971 ProcSetModifierMapping(client)
974 xSetModifierMappingReply rep;
975 REQUEST(xSetModifierMappingReq);
979 DeviceIntPtr keybd = inputInfo.keyboard;
980 register KeyClassPtr keyc = keybd->key;
982 REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
984 if (client->req_len != ((stuff->numKeyPerModifier<<1) +
985 (sizeof (xSetModifierMappingReq)>>2)))
988 inputMapLen = 8*stuff->numKeyPerModifier;
989 inputMap = (KeyCode *)&stuff[1];
992 * Now enforce the restriction that "all of the non-zero keycodes must be
993 * in the range specified by min-keycode and max-keycode in the
994 * connection setup (else a Value error)"
1000 && (inputMap[i] < keyc->curKeySyms.minKeyCode
1001 || inputMap[i] > keyc->curKeySyms.maxKeyCode))
1003 client->errorValue = inputMap[i];
1009 if (!SecurityCheckDeviceAccess(client, keybd, TRUE))
1014 LbxFlushModifierMapTag();
1018 rep.sequenceNumber = client->sequence;
1019 rep.success = MappingSuccess;
1022 * Now enforce the restriction that none of the old or new
1023 * modifier keys may be down while we change the mapping, and
1024 * that the DDX layer likes the choice.
1026 if (!AllModifierKeysAreUp(keybd, keyc->modifierKeyMap,
1027 (int)keyc->maxKeysPerModifier,
1028 inputMap, (int)stuff->numKeyPerModifier)
1030 !AllModifierKeysAreUp(keybd, inputMap, (int)stuff->numKeyPerModifier,
1031 keyc->modifierKeyMap,
1032 (int)keyc->maxKeysPerModifier))
1034 rep.success = MappingBusy;
1038 for (i = 0; i < inputMapLen; i++)
1040 if (inputMap[i] && !LegalModifier(inputMap[i], (DevicePtr)keybd))
1042 rep.success = MappingFailed;
1048 if (rep.success == MappingSuccess)
1052 * Now build the keyboard's modifier bitmap from the
1055 map = (KeyCode *)xalloc(inputMapLen);
1056 if (!map && inputMapLen)
1058 if (keyc->modifierKeyMap)
1059 xfree(keyc->modifierKeyMap);
1060 keyc->modifierKeyMap = map;
1061 memmove((char *)map, (char *)inputMap, inputMapLen);
1063 keyc->maxKeysPerModifier = stuff->numKeyPerModifier;
1064 for (i = 0; i < MAP_LENGTH; i++)
1065 keyc->modifierMap[i] = 0;
1066 for (i = 0; i < inputMapLen; i++)
1069 keyc->modifierMap[inputMap[i]] |=
1070 (1<<(((unsigned int)i)/keyc->maxKeysPerModifier));
1074 if (rep.success == MappingSuccess)
1075 SendMappingNotify(MappingModifier, 0, 0, client);
1077 WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
1079 return(client->noClientException);
1083 ProcGetModifierMapping(client)
1086 xGetModifierMappingReply rep;
1087 register KeyClassPtr keyc = inputInfo.keyboard->key;
1089 REQUEST_SIZE_MATCH(xReq);
1091 rep.numKeyPerModifier = keyc->maxKeysPerModifier;
1092 rep.sequenceNumber = client->sequence;
1093 /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
1094 rep.length = keyc->maxKeysPerModifier << 1;
1096 WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
1098 /* Use the (modified by DDX) map that SetModifierMapping passed in */
1099 (void)WriteToClient(client, (int)(keyc->maxKeysPerModifier << 3),
1100 (char *)keyc->modifierKeyMap);
1101 return client->noClientException;
1105 ProcChangeKeyboardMapping(client)
1108 REQUEST(xChangeKeyboardMappingReq);
1111 register KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms;
1112 REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
1114 len = client->req_len - (sizeof(xChangeKeyboardMappingReq) >> 2);
1115 if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
1117 if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
1118 (stuff->firstKeyCode > curKeySyms->maxKeyCode))
1120 client->errorValue = stuff->firstKeyCode;
1123 if ( ((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
1124 curKeySyms->maxKeyCode) ||
1125 (stuff->keySymsPerKeyCode == 0))
1127 client->errorValue = stuff->keySymsPerKeyCode;
1131 if (!SecurityCheckDeviceAccess(client, inputInfo.keyboard,
1135 keysyms.minKeyCode = stuff->firstKeyCode;
1136 keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
1137 keysyms.mapWidth = stuff->keySymsPerKeyCode;
1138 keysyms.map = (KeySym *)&stuff[1];
1139 if (!SetKeySymsMap(curKeySyms, &keysyms))
1142 LbxFlushKeyboardMapTag();
1144 SendMappingNotify(MappingKeyboard, stuff->firstKeyCode, stuff->keyCodes,
1146 return client->noClientException;
1151 ProcSetPointerMapping(client)
1154 REQUEST(xSetPointerMappingReq);
1156 xSetPointerMappingReply rep;
1157 register unsigned int i;
1158 DeviceIntPtr mouse = inputInfo.pointer;
1160 REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
1161 if (client->req_len != (sizeof(xSetPointerMappingReq)+stuff->nElts+3) >> 2)
1165 rep.sequenceNumber = client->sequence;
1166 rep.success = MappingSuccess;
1167 map = (BYTE *)&stuff[1];
1168 if (stuff->nElts != mouse->button->numButtons)
1170 client->errorValue = stuff->nElts;
1173 if (BadDeviceMap(&map[0], (int)stuff->nElts, 1, 255, &client->errorValue))
1175 for (i=0; i < stuff->nElts; i++)
1176 if ((mouse->button->map[i + 1] != map[i]) &&
1177 BitIsOn(mouse->button->down, i + 1))
1179 rep.success = MappingBusy;
1180 WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
1183 for (i = 0; i < stuff->nElts; i++)
1184 mouse->button->map[i + 1] = map[i];
1185 SendMappingNotify(MappingPointer, 0, 0, client);
1186 WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
1191 ProcGetKeyboardMapping(client)
1194 xGetKeyboardMappingReply rep;
1195 REQUEST(xGetKeyboardMappingReq);
1196 KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms;
1198 REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
1200 if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
1201 (stuff->firstKeyCode > curKeySyms->maxKeyCode))
1203 client->errorValue = stuff->firstKeyCode;
1206 if (stuff->firstKeyCode + stuff->count >
1207 (unsigned)(curKeySyms->maxKeyCode + 1))
1209 client->errorValue = stuff->count;
1214 rep.sequenceNumber = client->sequence;
1215 rep.keySymsPerKeyCode = curKeySyms->mapWidth;
1216 /* length is a count of 4 byte quantities and KeySyms are 4 bytes */
1217 rep.length = (curKeySyms->mapWidth * stuff->count);
1218 WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
1219 client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
1220 WriteSwappedDataToClient(
1222 curKeySyms->mapWidth * stuff->count * sizeof(KeySym),
1223 &curKeySyms->map[(stuff->firstKeyCode - curKeySyms->minKeyCode) *
1224 curKeySyms->mapWidth]);
1226 return client->noClientException;
1230 ProcGetPointerMapping(client)
1233 xGetPointerMappingReply rep;
1234 ButtonClassPtr butc = inputInfo.pointer->button;
1236 REQUEST_SIZE_MATCH(xReq);
1238 rep.sequenceNumber = client->sequence;
1239 rep.nElts = butc->numButtons;
1240 rep.length = ((unsigned)rep.nElts + (4-1))/4;
1241 WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep);
1242 (void)WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
1247 NoteLedState(keybd, led, on)
1252 KeybdCtrl *ctrl = &keybd->kbdfeed->ctrl;
1254 ctrl->leds |= ((Leds)1 << (led - 1));
1256 ctrl->leds &= ~((Leds)1 << (led - 1));
1260 Ones(mask) /* HACKMEM 169 */
1263 register unsigned long y;
1265 y = (mask >> 1) &033333333333;
1266 y = mask - y - ((y >>1) & 033333333333);
1267 return (((y + (y >> 3)) & 030707070707) % 077);
1271 ProcChangeKeyboardControl (client)
1276 DeviceIntPtr keybd = inputInfo.keyboard;
1281 BITS32 vmask, index2;
1283 REQUEST(xChangeKeyboardControlReq);
1285 REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
1286 vmask = stuff->mask;
1287 if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
1290 if (!SecurityCheckDeviceAccess(client, keybd, TRUE))
1293 vlist = (XID *)&stuff[1]; /* first word of values */
1294 ctrl = keybd->kbdfeed->ctrl;
1297 index2 = (BITS32) lowbit (vmask);
1301 case KBKeyClickPercent:
1305 t = defaultKeyboardControl.click;
1306 else if (t < 0 || t > 100)
1308 client->errorValue = t;
1317 t = defaultKeyboardControl.bell;
1318 else if (t < 0 || t > 100)
1320 client->errorValue = t;
1329 t = defaultKeyboardControl.bell_pitch;
1332 client->errorValue = t;
1335 ctrl.bell_pitch = t;
1337 case KBBellDuration:
1341 t = defaultKeyboardControl.bell_duration;
1344 client->errorValue = t;
1347 ctrl.bell_duration = t;
1350 led = (CARD8)*vlist;
1352 if (led < 1 || led > 32)
1354 client->errorValue = led;
1357 if (!(stuff->mask & KBLedMode))
1363 if (t == LedModeOff)
1368 ctrl.leds &= ~(((Leds)(1)) << (led - 1));
1370 else if (t == LedModeOn)
1375 ctrl.leds |= (((Leds)(1)) << (led - 1));
1379 client->errorValue = t;
1383 if (!noXkbExtension) {
1384 XkbEventCauseRec cause;
1385 XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
1386 keybd->kbdfeed->ctrl.leds = ctrl.leds;
1387 XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
1393 key = (KeyCode)*vlist;
1395 if ((KeyCode)key < inputInfo.keyboard->key->curKeySyms.minKeyCode ||
1396 (KeyCode)key > inputInfo.keyboard->key->curKeySyms.maxKeyCode)
1398 client->errorValue = key;
1401 if (!(stuff->mask & KBAutoRepeatMode))
1404 case KBAutoRepeatMode:
1406 mask = (1 << (key & 7));
1410 if (!noXkbExtension && key != DO_ALL)
1411 XkbDisableComputedAutoRepeats(keybd,key);
1413 if (t == AutoRepeatModeOff)
1416 ctrl.autoRepeat = FALSE;
1418 ctrl.autoRepeats[i] &= ~mask;
1420 else if (t == AutoRepeatModeOn)
1423 ctrl.autoRepeat = TRUE;
1425 ctrl.autoRepeats[i] |= mask;
1427 else if (t == AutoRepeatModeDefault)
1430 ctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
1432 ctrl.autoRepeats[i] =
1433 (ctrl.autoRepeats[i] & ~mask) |
1434 (defaultKeyboardControl.autoRepeats[i] & mask);
1438 client->errorValue = t;
1443 client->errorValue = stuff->mask;
1447 keybd->kbdfeed->ctrl = ctrl;
1449 /* The XKB RepeatKeys control and core protocol global autorepeat */
1450 /* value are linked */
1451 if (!noXkbExtension) {
1452 XkbSetRepeatKeys(keybd,key,keybd->kbdfeed->ctrl.autoRepeat);
1456 (*keybd->kbdfeed->CtrlProc)(keybd, &keybd->kbdfeed->ctrl);
1462 ProcGetKeyboardControl (client)
1466 register KeybdCtrl *ctrl = &inputInfo.keyboard->kbdfeed->ctrl;
1467 xGetKeyboardControlReply rep;
1469 REQUEST_SIZE_MATCH(xReq);
1472 rep.sequenceNumber = client->sequence;
1473 rep.globalAutoRepeat = ctrl->autoRepeat;
1474 rep.keyClickPercent = ctrl->click;
1475 rep.bellPercent = ctrl->bell;
1476 rep.bellPitch = ctrl->bell_pitch;
1477 rep.bellDuration = ctrl->bell_duration;
1478 rep.ledMask = ctrl->leds;
1479 for (i = 0; i < 32; i++)
1480 rep.map[i] = ctrl->autoRepeats[i];
1481 WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep);
1489 register DeviceIntPtr keybd = inputInfo.keyboard;
1490 int base = keybd->kbdfeed->ctrl.bell;
1493 REQUEST_SIZE_MATCH(xBellReq);
1494 if (stuff->percent < -100 || stuff->percent > 100)
1496 client->errorValue = stuff->percent;
1499 newpercent = (base * stuff->percent) / 100;
1500 if (stuff->percent < 0)
1501 newpercent = base + newpercent;
1503 newpercent = base - newpercent + stuff->percent;
1505 if (!noXkbExtension)
1506 XkbHandleBell(FALSE,FALSE, keybd, newpercent, &keybd->kbdfeed->ctrl, 0,
1507 None, NULL, client);
1510 (*keybd->kbdfeed->BellProc)(newpercent, keybd,
1511 (pointer) &keybd->kbdfeed->ctrl, 0);
1516 ProcChangePointerControl(client)
1519 DeviceIntPtr mouse = inputInfo.pointer;
1520 PtrCtrl ctrl; /* might get BadValue part way through */
1521 REQUEST(xChangePointerControlReq);
1523 REQUEST_SIZE_MATCH(xChangePointerControlReq);
1524 ctrl = mouse->ptrfeed->ctrl;
1525 if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse))
1527 client->errorValue = stuff->doAccel;
1530 if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse))
1532 client->errorValue = stuff->doThresh;
1537 if (stuff->accelNum == -1)
1538 ctrl.num = defaultPointerControl.num;
1539 else if (stuff->accelNum < 0)
1541 client->errorValue = stuff->accelNum;
1544 else ctrl.num = stuff->accelNum;
1545 if (stuff->accelDenum == -1)
1546 ctrl.den = defaultPointerControl.den;
1547 else if (stuff->accelDenum <= 0)
1549 client->errorValue = stuff->accelDenum;
1552 else ctrl.den = stuff->accelDenum;
1554 if (stuff->doThresh)
1556 if (stuff->threshold == -1)
1557 ctrl.threshold = defaultPointerControl.threshold;
1558 else if (stuff->threshold < 0)
1560 client->errorValue = stuff->threshold;
1563 else ctrl.threshold = stuff->threshold;
1565 mouse->ptrfeed->ctrl = ctrl;
1566 (*mouse->ptrfeed->CtrlProc)(mouse, &mouse->ptrfeed->ctrl);
1571 ProcGetPointerControl(client)
1574 register PtrCtrl *ctrl = &inputInfo.pointer->ptrfeed->ctrl;
1575 xGetPointerControlReply rep;
1577 REQUEST_SIZE_MATCH(xReq);
1580 rep.sequenceNumber = client->sequence;
1581 rep.threshold = ctrl->threshold;
1582 rep.accelNumerator = ctrl->num;
1583 rep.accelDenominator = ctrl->den;
1584 WriteReplyToClient(client, sizeof(xGenericReply), &rep);
1589 MaybeStopHint(dev, client)
1590 register DeviceIntPtr dev;
1593 GrabPtr grab = dev->grab;
1595 if ((grab && SameClient(grab, client) &&
1596 ((grab->eventMask & PointerMotionHintMask) ||
1597 (grab->ownerEvents &&
1598 (EventMaskForClient(dev->valuator->motionHintWindow, client) &
1599 PointerMotionHintMask)))) ||
1601 (EventMaskForClient(dev->valuator->motionHintWindow, client) &
1602 PointerMotionHintMask)))
1603 dev->valuator->motionHintWindow = NullWindow;
1607 ProcGetMotionEvents(client)
1611 xTimecoord * coords = (xTimecoord *) NULL;
1612 xGetMotionEventsReply rep;
1613 int i, count, xmin, xmax, ymin, ymax;
1614 unsigned long nEvents;
1615 DeviceIntPtr mouse = inputInfo.pointer;
1616 TimeStamp start, stop;
1617 REQUEST(xGetMotionEventsReq);
1619 REQUEST_SIZE_MATCH(xGetMotionEventsReq);
1620 pWin = SecurityLookupWindow(stuff->window, client, TRUE);
1623 if (mouse->valuator->motionHintWindow)
1624 MaybeStopHint(mouse, client);
1626 rep.sequenceNumber = client->sequence;
1628 start = ClientTimeToServerTime(stuff->start);
1629 stop = ClientTimeToServerTime(stuff->stop);
1630 if ((CompareTimeStamps(start, stop) != LATER) &&
1631 (CompareTimeStamps(start, currentTime) != LATER) &&
1632 mouse->valuator->numMotionEvents)
1634 if (CompareTimeStamps(stop, currentTime) == LATER)
1636 coords = (xTimecoord *)ALLOCATE_LOCAL(mouse->valuator->numMotionEvents
1637 * sizeof(xTimecoord));
1640 count = (*mouse->valuator->GetMotionProc) (mouse, coords,
1643 pWin->drawable.pScreen);
1644 xmin = pWin->drawable.x - wBorderWidth (pWin);
1645 xmax = pWin->drawable.x + (int)pWin->drawable.width +
1646 wBorderWidth (pWin);
1647 ymin = pWin->drawable.y - wBorderWidth (pWin);
1648 ymax = pWin->drawable.y + (int)pWin->drawable.height +
1649 wBorderWidth (pWin);
1650 for (i = 0; i < count; i++)
1651 if ((xmin <= coords[i].x) && (coords[i].x < xmax) &&
1652 (ymin <= coords[i].y) && (coords[i].y < ymax))
1654 coords[nEvents].time = coords[i].time;
1655 coords[nEvents].x = coords[i].x - pWin->drawable.x;
1656 coords[nEvents].y = coords[i].y - pWin->drawable.y;
1660 rep.length = nEvents * (sizeof(xTimecoord) >> 2);
1661 rep.nEvents = nEvents;
1662 WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep);
1665 client->pSwapReplyFunc = (ReplySwapPtr) SwapTimeCoordWrite;
1666 WriteSwappedDataToClient(client, nEvents * sizeof(xTimecoord),
1670 DEALLOCATE_LOCAL(coords);
1675 ProcQueryKeymap(client)
1678 xQueryKeymapReply rep;
1680 CARD8 *down = inputInfo.keyboard->key->down;
1682 REQUEST_SIZE_MATCH(xReq);
1684 rep.sequenceNumber = client->sequence;
1687 if (!SecurityCheckDeviceAccess(client, inputInfo.keyboard, TRUE))
1689 bzero((char *)&rep.map[0], 32);
1693 for (i = 0; i<32; i++)
1694 rep.map[i] = down[i];
1695 WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep);
1699 /******************************************************************************
1700 * The following entrypoints are provided for binary compatibility with
1701 * previous versions (they make casts, where the current version changes types
1702 * for more stringent prototype checking).
1703 ******************************************************************************/
1704 #ifdef AddInputDevice
1705 #undef AddInputDevice
1707 #if NeedFunctionPrototypes
1710 DeviceProc deviceProc,
1714 AddInputDevice(deviceProc, autoStart)
1715 DeviceProc deviceProc;
1719 return (DevicePtr)_AddInputDevice(deviceProc, autoStart);
1721 #endif /* AddInputDevice */
1723 #ifdef RegisterPointerDevice
1724 #undef RegisterPointerDevice
1726 #if NeedFunctionPrototypes
1728 RegisterPointerDevice(DevicePtr device)
1731 RegisterPointerDevice(device)
1735 _RegisterPointerDevice((DeviceIntPtr)device);
1737 #endif /* RegisterPointerDevice */
1739 #ifdef RegisterKeyboardDevice
1740 #undef RegisterKeyboardDevice
1742 #if NeedFunctionPrototypes
1744 RegisterKeyboardDevice(DevicePtr device)
1747 RegisterKeyboardDevice(device)
1751 _RegisterKeyboardDevice((DeviceIntPtr)device);
1753 #endif /* RegisterKeyboardDevice */