Пример #1
0
PRBool  nsWidget::DispatchKeyEvent( PhKeyEvent_t *aPhKeyEvent, int force ) {
    NS_ASSERTION(aPhKeyEvent, "nsWidget::DispatchKeyEvent a NULL PhKeyEvent was passed in");

    if( !(aPhKeyEvent->key_flags & (Pk_KF_Cap_Valid|Pk_KF_Sym_Valid) ) ) {
        //printf("nsWidget::DispatchKeyEvent throwing away invalid key: Modifiers Valid=<%d,%d,%d> this=<%p>\n",
        //(aPhKeyEvent->key_flags & Pk_KF_Scan_Valid), (aPhKeyEvent->key_flags & Pk_KF_Sym_Valid), (aPhKeyEvent->key_flags & Pk_KF_Cap_Valid), this );
        return PR_FALSE;
    }

    if ( !force && PtIsFocused(mWidget) != 2) {
        //printf("nsWidget::DispatchKeyEvent Not on focus leaf! PtIsFocused(mWidget)=<%d>\n", PtIsFocused(mWidget));
        return PR_FALSE;
    }

    if ( ( aPhKeyEvent->key_cap == Pk_Shift_L )
            || ( aPhKeyEvent->key_cap == Pk_Shift_R )
            || ( aPhKeyEvent->key_cap == Pk_Control_L )
            || ( aPhKeyEvent->key_cap ==  Pk_Control_R )
            || ( aPhKeyEvent->key_cap ==  Pk_Num_Lock )
            || ( aPhKeyEvent->key_cap ==  Pk_Scroll_Lock )
       )
        return PR_TRUE;

    nsWindow *w = (nsWindow *) this;

    w->AddRef();

    if (aPhKeyEvent->key_flags & Pk_KF_Key_Down) {
        nsKeyEvent keyDownEvent(PR_TRUE, NS_KEY_DOWN, w);
        InitKeyEvent(aPhKeyEvent, keyDownEvent);
        PRBool noDefault = w->OnKey(keyDownEvent);

        nsKeyEvent keyPressEvent(PR_TRUE, NS_KEY_PRESS, w);
        InitKeyPressEvent(aPhKeyEvent, keyPressEvent);
        if (noDefault) {  // If prevent default set for keydown, do same for keypress
            keyPressEvent.flags = NS_EVENT_FLAG_NO_DEFAULT;
        }
        w->OnKey(keyPressEvent);
    }
    else if (aPhKeyEvent->key_flags & Pk_KF_Key_Repeat) {
        nsKeyEvent keyPressEvent(PR_TRUE, NS_KEY_PRESS, w);
        InitKeyPressEvent(aPhKeyEvent, keyPressEvent);
        w->OnKey(keyPressEvent);
    }
    else if (PkIsKeyDown(aPhKeyEvent->key_flags) == 0) {
        nsKeyEvent kevent(PR_TRUE, NS_KEY_UP, w);
        InitKeyEvent(aPhKeyEvent, kevent);
        w->OnKey(kevent);
    }

    w->Release();

    return PR_TRUE;
}
Пример #2
0
void
KeyboardEvent::InitWithKeyboardEventInit(EventTarget* aOwner,
                                         const nsAString& aType,
                                         const KeyboardEventInit& aParam,
                                         ErrorResult& aRv)
{
  bool trusted = Init(aOwner);
  aRv = InitKeyEvent(aType, aParam.mBubbles, aParam.mCancelable,
                     aParam.mView, aParam.mCtrlKey, aParam.mAltKey,
                     aParam.mShiftKey, aParam.mMetaKey,
                     aParam.mKeyCode, aParam.mCharCode);
  SetTrusted(trusted);
  mDetail = aParam.mDetail;
  mInitializedByCtor = true;
  mInitializedWhichValue = aParam.mWhich;

  WidgetKeyboardEvent* internalEvent = mEvent->AsKeyboardEvent();
  internalEvent->location = aParam.mLocation;
  internalEvent->mIsRepeat = aParam.mRepeat;
  internalEvent->mIsComposing = aParam.mIsComposing;
  internalEvent->mKeyNameIndex = KEY_NAME_INDEX_USE_STRING;
  internalEvent->mCodeNameIndex = CODE_NAME_INDEX_USE_STRING;
  internalEvent->mKeyValue = aParam.mKey;
  internalEvent->mCodeValue = aParam.mCode;
}