void XkbDDXKeybdCtrlProc(DeviceIntPtr dev,KeybdCtrl *ctrl) { int realRepeat; realRepeat= ctrl->autoRepeat; if ((dev->kbdfeed)&&(XkbDDXUsesSoftRepeat(dev))) ctrl->autoRepeat= 0; if (dev->key && dev->key->xkbInfo && dev->key->xkbInfo->kbdProc) (*dev->key->xkbInfo->kbdProc)(dev,ctrl); ctrl->autoRepeat= realRepeat; return; }
Bool AccessXFilterPressEvent( register xEvent * xE, register DeviceIntPtr keybd, int count) { XkbSrvInfoPtr xkbi = keybd->key->xkbInfo; XkbControlsPtr ctrls = xkbi->desc->ctrls; Bool ignoreKeyEvent = FALSE; KeyCode key = xE->u.u.detail; KeySym * sym = XkbKeySymsPtr(xkbi->desc,key); if (ctrls->enabled_ctrls&XkbAccessXKeysMask) { /* check for magic sequences */ if ((sym[0]==XK_Shift_R)||(sym[0]==XK_Shift_L)) { if (XkbAX_NeedFeedback(ctrls,XkbAX_SlowWarnFBMask)) { xkbi->krgTimerActive = _KRG_WARN_TIMER; xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 4000, AccessXKRGExpire, (pointer)keybd); } else { xkbi->krgTimerActive = _KRG_TIMER; xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 8000, AccessXKRGExpire, (pointer)keybd); } if (!(ctrls->enabled_ctrls & XkbSlowKeysMask)) { CARD32 now= GetTimeInMillis(); if ((now-xkbi->lastShiftEventTime)>15000) xkbi->shiftKeyCount= 1; else xkbi->shiftKeyCount++; xkbi->lastShiftEventTime= now; } } else { if (xkbi->krgTimerActive) { xkbi->krgTimer= TimerSet(xkbi->krgTimer,0, 0, NULL, NULL); xkbi->krgTimerActive= _OFF_TIMER; } } } /* Don't transmit the KeyPress if SlowKeys is turned on; * The wakeup handler will synthesize one for us if the user * has held the key long enough. */ if (ctrls->enabled_ctrls & XkbSlowKeysMask) { xkbAccessXNotify ev; /* If key was already pressed, ignore subsequent press events * from the server's autorepeat */ if(xkbi->slowKey == key) return TRUE; ev.detail= XkbAXN_SKPress; ev.keycode= key; ev.slowKeysDelay= ctrls->slow_keys_delay; ev.debounceDelay= ctrls->debounce_delay; XkbSendAccessXNotify(keybd,&ev); if (XkbAX_NeedFeedback(ctrls,XkbAX_SKPressFBMask)) XkbDDXAccessXBeep(keybd,_BEEP_SLOW_PRESS,XkbSlowKeysMask); xkbi->slowKey= key; xkbi->slowKeysTimer = TimerSet(xkbi->slowKeysTimer, 0, ctrls->slow_keys_delay, AccessXSlowKeyExpire, (pointer)keybd); ignoreKeyEvent = TRUE; } /* Don't transmit the KeyPress if BounceKeys is turned on * and the user pressed the same key within a given time period * from the last release. */ else if ((ctrls->enabled_ctrls & XkbBounceKeysMask) && (key == xkbi->inactiveKey)) { if (XkbAX_NeedFeedback(ctrls,XkbAX_BKRejectFBMask)) XkbDDXAccessXBeep(keybd,_BEEP_BOUNCE_REJECT,XkbBounceKeysMask); ignoreKeyEvent = TRUE; } /* Start repeating if necessary. Stop autorepeating if the user * presses a non-modifier key that doesn't autorepeat. */ if (XkbDDXUsesSoftRepeat(keybd)) { if ((keybd->kbdfeed->ctrl.autoRepeat) && ((ctrls->enabled_ctrls&(XkbSlowKeysMask|XkbRepeatKeysMask))== XkbRepeatKeysMask)) { if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,key) && !keybd->key->modifierMap[key]) { #ifdef DEBUG if (xkbDebugFlags&0x10) ErrorF("Starting software autorepeat...\n"); #endif xkbi->repeatKey = key; xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer, 0, ctrls->repeat_delay, AccessXRepeatKeyExpire, (pointer)keybd); } } } /* Check for two keys being pressed at the same time. This section * essentially says the following: * * If StickyKeys is on, and a modifier is currently being held down, * and one of the following is true: the current key is not a modifier * or the currentKey is a modifier, but not the only modifier being * held down, turn StickyKeys off if the TwoKeys off ctrl is set. */ if ((ctrls->enabled_ctrls & XkbStickyKeysMask) && (xkbi->state.base_mods!=0) && (XkbAX_NeedOption(ctrls,XkbAX_TwoKeysMask))) { xkbControlsNotify cn; cn.keycode = key; cn.eventType = KeyPress; cn.requestMajor = 0; cn.requestMinor = 0; AccessXStickyKeysTurnOff(keybd,&cn); } if (!ignoreKeyEvent) XkbProcessKeyboardEvent(xE,keybd,count); return ignoreKeyEvent; } /* AccessXFilterPressEvent */