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;
}
예제 #2
0
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 */