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; }
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; }