📄 devices.c
字号:
int numButtons; CARD8 *map;{ register ButtonClassPtr butc; int i; butc = (ButtonClassPtr)xalloc(sizeof(ButtonClassRec)); if (!butc) return FALSE; butc->numButtons = numButtons; for (i = 1; i <= numButtons; i++) butc->map[i] = map[i]; butc->buttonsDown = 0; butc->state = 0; butc->motionMask = 0; bzero((char *)butc->down, DOWN_LENGTH);#ifdef XKB butc->xkb_acts= NULL;#endif dev->button = butc; return TRUE;}BoolInitValuatorClassDeviceStruct(dev, numAxes, motionProc, numMotionEvents, mode) DeviceIntPtr dev; ValuatorMotionProcPtr motionProc; int numAxes; int numMotionEvents; int mode;{ int i; register ValuatorClassPtr valc; valc = (ValuatorClassPtr)xalloc(sizeof(ValuatorClassRec) + numAxes * sizeof(AxisInfo) + numAxes * sizeof(unsigned int)); if (!valc) return FALSE; valc->GetMotionProc = motionProc; valc->numMotionEvents = numMotionEvents; valc->motionHintWindow = NullWindow; valc->numAxes = numAxes; valc->mode = mode; valc->axes = (AxisInfoPtr)(valc + 1); valc->axisVal = (int *)(valc->axes + numAxes); for (i=0; i<numAxes; i++) valc->axisVal[i]=0; dev->valuator = valc; return TRUE;}BoolInitFocusClassDeviceStruct(dev) DeviceIntPtr dev;{ register FocusClassPtr focc; focc = (FocusClassPtr)xalloc(sizeof(FocusClassRec)); if (!focc) return FALSE; focc->win = PointerRootWin; focc->revert = None; focc->time = currentTime; focc->trace = (WindowPtr *)NULL; focc->traceSize = 0; focc->traceGood = 0; dev->focus = focc; return TRUE;}BoolInitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc) DeviceIntPtr dev; BellProcPtr bellProc; KbdCtrlProcPtr controlProc;{ register KbdFeedbackPtr feedc; feedc = (KbdFeedbackPtr)xalloc(sizeof(KbdFeedbackClassRec)); if (!feedc) return FALSE; feedc->BellProc = bellProc; feedc->CtrlProc = controlProc;#ifdef XKB defaultKeyboardControl.autoRepeat = TRUE;#endif feedc->ctrl = defaultKeyboardControl; feedc->ctrl.id = 0; if ((feedc->next = dev->kbdfeed) != 0) feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1; dev->kbdfeed = feedc;#ifdef XKB feedc->xkb_sli= NULL; if (!noXkbExtension) XkbFinishDeviceInit(dev);#endif (*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl); return TRUE;}BoolInitPtrFeedbackClassDeviceStruct(dev, controlProc) DeviceIntPtr dev; PtrCtrlProcPtr controlProc;{ register PtrFeedbackPtr feedc; feedc = (PtrFeedbackPtr)xalloc(sizeof(PtrFeedbackClassRec)); if (!feedc) return FALSE; feedc->CtrlProc = controlProc;#ifdef sgi feedc->ctrl.num = 1; feedc->ctrl.den = 1; feedc->ctrl.threshold = 1;#else feedc->ctrl = defaultPointerControl;#endif feedc->ctrl.id = 0; if ( (feedc->next = dev->ptrfeed) ) feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1; dev->ptrfeed = feedc; (*controlProc)(dev, &feedc->ctrl); return TRUE;}LedCtrl defaultLedControl = { DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0};BellCtrl defaultBellControl = { DEFAULT_BELL, DEFAULT_BELL_PITCH, DEFAULT_BELL_DURATION, 0};IntegerCtrl defaultIntegerControl = { DEFAULT_INT_RESOLUTION, DEFAULT_INT_MIN_VALUE, DEFAULT_INT_MAX_VALUE, DEFAULT_INT_DISPLAYED, 0};BoolInitStringFeedbackClassDeviceStruct (dev, controlProc, max_symbols, num_symbols_supported, symbols) DeviceIntPtr dev; StringCtrlProcPtr controlProc; int max_symbols; int num_symbols_supported; KeySym *symbols;{ int i; register StringFeedbackPtr feedc; feedc = (StringFeedbackPtr)xalloc(sizeof(StringFeedbackClassRec)); if (!feedc) return FALSE; feedc->CtrlProc = controlProc; feedc->ctrl.num_symbols_supported = num_symbols_supported; feedc->ctrl.num_symbols_displayed = 0; feedc->ctrl.max_symbols = max_symbols; feedc->ctrl.symbols_supported = (KeySym *) xalloc (sizeof (KeySym) * num_symbols_supported); feedc->ctrl.symbols_displayed = (KeySym *) xalloc (sizeof (KeySym) * max_symbols); if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed) { if (feedc->ctrl.symbols_supported) xfree(feedc->ctrl.symbols_supported); if (feedc->ctrl.symbols_displayed) xfree(feedc->ctrl.symbols_displayed); xfree(feedc); return FALSE; } for (i=0; i<num_symbols_supported; i++) *(feedc->ctrl.symbols_supported+i) = *symbols++; for (i=0; i<max_symbols; i++) *(feedc->ctrl.symbols_displayed+i) = (KeySym) NULL; feedc->ctrl.id = 0; if ( (feedc->next = dev->stringfeed) ) feedc->ctrl.id = dev->stringfeed->ctrl.id + 1; dev->stringfeed = feedc; (*controlProc)(dev, &feedc->ctrl); return TRUE;}BoolInitBellFeedbackClassDeviceStruct (dev, bellProc, controlProc) DeviceIntPtr dev; BellProcPtr bellProc; BellCtrlProcPtr controlProc;{ register BellFeedbackPtr feedc; feedc = (BellFeedbackPtr)xalloc(sizeof(BellFeedbackClassRec)); if (!feedc) return FALSE; feedc->CtrlProc = controlProc; feedc->BellProc = bellProc; feedc->ctrl = defaultBellControl; feedc->ctrl.id = 0; if ( (feedc->next = dev->bell) ) feedc->ctrl.id = dev->bell->ctrl.id + 1; dev->bell = feedc; (*controlProc)(dev, &feedc->ctrl); return TRUE;}BoolInitLedFeedbackClassDeviceStruct (dev, controlProc) DeviceIntPtr dev; LedCtrlProcPtr controlProc;{ register LedFeedbackPtr feedc; feedc = (LedFeedbackPtr)xalloc(sizeof(LedFeedbackClassRec)); if (!feedc) return FALSE; feedc->CtrlProc = controlProc; feedc->ctrl = defaultLedControl; feedc->ctrl.id = 0; if ( (feedc->next = dev->leds) ) feedc->ctrl.id = dev->leds->ctrl.id + 1;#ifdef XKB feedc->xkb_sli= NULL;#endif dev->leds = feedc; (*controlProc)(dev, &feedc->ctrl); return TRUE;}BoolInitIntegerFeedbackClassDeviceStruct (dev, controlProc) DeviceIntPtr dev; IntegerCtrlProcPtr controlProc;{ register IntegerFeedbackPtr feedc; feedc = (IntegerFeedbackPtr)xalloc(sizeof(IntegerFeedbackClassRec)); if (!feedc) return FALSE; feedc->CtrlProc = controlProc; feedc->ctrl = defaultIntegerControl; feedc->ctrl.id = 0; if ( (feedc->next = dev->intfeed) ) feedc->ctrl.id = dev->intfeed->ctrl.id + 1; dev->intfeed = feedc; (*controlProc)(dev, &feedc->ctrl); return TRUE;}BoolInitPointerDeviceStruct(device, map, numButtons, motionProc, controlProc, numMotionEvents) DevicePtr device; CARD8 *map; int numButtons; PtrCtrlProcPtr controlProc; ValuatorMotionProcPtr motionProc; int numMotionEvents;{ DeviceIntPtr dev = (DeviceIntPtr)device; return(InitButtonClassDeviceStruct(dev, numButtons, map) && InitValuatorClassDeviceStruct(dev, 2, motionProc, numMotionEvents, 0) && InitPtrFeedbackClassDeviceStruct(dev, controlProc));}BoolInitKeyboardDeviceStruct(device, pKeySyms, pModifiers, bellProc, controlProc) DevicePtr device; KeySymsPtr pKeySyms; CARD8 pModifiers[]; BellProcPtr bellProc; KbdCtrlProcPtr controlProc;{ DeviceIntPtr dev = (DeviceIntPtr)device; return(InitKeyClassDeviceStruct(dev, pKeySyms, pModifiers) && InitFocusClassDeviceStruct(dev) && InitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc));}voidSendMappingNotify(request, firstKeyCode, count, client) unsigned int request, count; unsigned int firstKeyCode; ClientPtr client;{ int i; xEvent event; event.u.u.type = MappingNotify; event.u.mappingNotify.request = request; if (request == MappingKeyboard) { event.u.mappingNotify.firstKeyCode = firstKeyCode; event.u.mappingNotify.count = count; }#ifdef XKB if (!noXkbExtension && ((request == MappingKeyboard) || (request == MappingModifier))) { XkbApplyMappingChange(inputInfo.keyboard,request,firstKeyCode,count, client); }#endif /* 0 is the server client */ for (i=1; i<currentMaxClients; i++) { if (clients[i] && clients[i]->clientState == ClientStateRunning) {#ifdef XKB if (!noXkbExtension && (request == MappingKeyboard) && (clients[i]->xkbClientFlags != 0) && (clients[i]->mapNotifyMask&XkbKeySymsMask)) continue;#endif event.u.u.sequenceNumber = clients[i]->sequence; WriteEventsToClient(clients[i], 1, &event); } }}/* * n-squared algorithm. n < 255 and don't want to copy the whole thing and * sort it to do the checking. How often is it called? Just being lazy? */BoolBadDeviceMap(buff, length, low, high, errval) register BYTE *buff; int length; unsigned low, high; XID *errval;{ register int i, j; for (i = 0; i < length; i++) if (buff[i]) /* only check non-zero elements */ { if ((low > buff[i]) || (high < buff[i])) { *errval = buff[i]; return TRUE; } for (j = i + 1; j < length; j++) if (buff[i] == buff[j]) { *errval = buff[i]; return TRUE; } } return FALSE;}BoolAllModifierKeysAreUp(dev, map1, per1, map2, per2) register DeviceIntPtr dev; register CARD8 *map1, *map2; int per1, per2;{ register int i, j, k; register CARD8 *down = dev->key->down; for (i = 8; --i >= 0; map2 += per2) { for (j = per1; --j >= 0; map1++) { if (*map1 && BitIsOn(down, *map1)) { for (k = per2; (--k >= 0) && (*map1 != map2[k]);) ; if (k < 0) return FALSE; } } } return TRUE;}int ProcSetModifierMapping(client) ClientPtr client;{ xSetModifierMappingReply rep; REQUEST(xSetModifierMappingReq); KeyCode *inputMap; int inputMapLen; register int i; DeviceIntPtr keybd = inputInfo.keyboard; register KeyClassPtr keyc = keybd->key; REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq); if (client->req_len != ((stuff->numKeyPerModifier<<1) + (sizeof (xSetModifierMappingReq)>>2))) return BadLength; inputMapLen = 8*stuff->numKeyPerModifier; inputMap = (KeyCode *)&stuff[1]; /* * Now enforce the restriction that "all of the non-zero keycodes must be * in the range specified by min-keycode and max-keycode in the * connection setup (else a Value error)" */ i = inputMapLen; while (i--) { if (inputMap[i] && (inputMap[i] < keyc->curKeySyms.minKeyCode || inputMap[i] > keyc->curKeySyms.maxKeyCode)) { client->errorValue = inputMap[i]; return BadValue; } }#ifdef XCSECURITY if (!SecurityCheckDeviceAccess(client, keybd, TRUE)) return BadAccess;#endif #ifdef LBX LbxFlushModifierMapTag();#endif rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.success = MappingSuccess; /* * Now enforce the restriction that none of the old or new * modifier keys may be down while we change the mapping, and * that the DDX layer likes the choice. */ if (!AllModifierKeysAreUp(keybd, keyc->modifierKeyMap, (int)keyc->maxKeysPerModifier, inputMap, (int)stuff->numKeyPerModifier) || !AllModifierKeysAreUp(keybd, inputMap, (int)stuff->numKeyPerModifier, keyc->modifierKeyMap, (int)keyc->maxKeysPerModifier)) { rep.success = MappingBusy; } else { for (i = 0; i < inputMapLen; i++) { if (inputMap[i] && !LegalModifier(inputMap[i], (DevicePtr)keybd)) { rep.success = MappingFailed; break; } } } if (rep.success == MappingSuccess) { KeyCode *map; /* * Now build the keyboard's modifier bitmap from the * list of keycodes. */ map = (KeyCode *)xalloc(inputMapLen); if (!map && inputMapLen) return BadAlloc; if (keyc->modifierKeyMap) xfree(keyc->modifierKeyMap); keyc->modifierKeyMap = map; memmove((char *)map, (char *)inputMap, inputMapLen); keyc->maxKeysPerModifier = stuff->numKeyPerModifier; for (i = 0; i < MAP_LENGTH; i++) keyc->modifierMap[i] = 0; for (i = 0; i < inputMapLen; i++) { if (inputMap[i]) keyc->modifierMap[inputMap[i]] |= (1<<(((unsigned int)i)/keyc->maxKeysPerModifier)); } } if (rep.success == MappingSuccess) SendMappingNotify(MappingModifier, 0, 0, client); WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep); return(client->noClientException);}intProcGetModifierMapping(client) ClientPtr client;{ xGetModifierMappingReply rep; register KeyClassPtr keyc = inputInfo.keyboard->key; REQUEST_SIZE_MATCH(xReq); rep.type = X_Reply; rep.numKeyPerModifier = keyc->maxKeysPerModifier; rep.sequenceNumber = client->sequence; /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */ rep.length = keyc->maxKeysPerModifier << 1; WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep); /* Use the (modified by DDX) map that SetModifierMapping passed in */ (void)WriteToClient(client, (int)(keyc->maxKeysPerModifier << 3), (char *)keyc->modifierKeyMap); return client->noClientException;}intProcChangeKeyboardMapping(client) ClientPtr client;{ REQUEST(xChangeKeyboardMappingReq); unsigned len; KeySymsRec keysyms; register KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms; REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq); len = client->req_len - (sizeof(xChangeKeyboardMappingReq) >> 2); if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode)) return BadLength; if ((stuff->firstKeyCode < curKeySyms->minKeyCode) || (stuff->firstKeyCode > curKeySyms->maxKeyCode)) { client->errorValue = stuff->firstKeyCode; return BadValue; } if ( ((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) > curKeySyms->maxKeyCode) || (stuff->keySymsPerKeyCode == 0)) { client->errorValue = stuff->keySymsPerKeyCode; return BadValue; }#ifdef XCSECURITY if (!SecurityCheckDeviceAccess(client, inputInfo.keyboard, TRUE)) return BadAccess;#endif keysyms.minKeyCode = stuff->firstKeyCode; keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1; keysyms.mapWidth = stuff->keySymsPerKeyCode; keysyms.map = (KeySym *)&stuff[1]; if (!SetKeySymsMap(curKeySyms, &keysyms)) return BadAlloc;#ifdef LBX LbxFlushKeyboardMapTag();#endif SendMappingNotify(MappingKeyboard, stuff->firstKeyCode, stuff->keyCodes, client); return client->noClientException;}intProcSetPointerMapping(client) ClientPtr client;{ REQUEST(xSetPointerMappingReq); BYTE *map; xSetPointerMappingReply rep; register unsigned int i; DeviceIntPtr mouse = inputInfo.pointer; REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq); if (client->req_len != (sizeof(xSetPointerMappingReq)+stuff->nElts+3) >> 2) return BadLength; rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.success = MappingSuccess; map = (BYTE *)&stuff[1]; if (stuff->nElts != mouse->button->numButtons) { client->errorValue = stuff->nElts;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -