void nsMenuFrame::CreateMenuCommandEvent(WidgetGUIEvent* aEvent, bool aFlipChecked) { // Create a trusted event if the triggering event was trusted, or if // we're called from chrome code (since at least one of our caller // passes in a null event). bool isTrusted = aEvent ? aEvent->IsTrusted() : nsContentUtils::IsCallerChrome(); bool shift = false, control = false, alt = false, meta = false; WidgetInputEvent* inputEvent = aEvent ? aEvent->AsInputEvent() : nullptr; if (inputEvent) { shift = inputEvent->IsShift(); control = inputEvent->IsControl(); alt = inputEvent->IsAlt(); meta = inputEvent->IsMeta(); } // Because the command event is firing asynchronously, a flag is needed to // indicate whether user input is being handled. This ensures that a popup // window won't get blocked. bool userinput = EventStateManager::IsHandlingUserInput(); mDelayedMenuCommandEvent = new nsXULMenuCommandEvent(mContent, isTrusted, shift, control, alt, meta, userinput, aFlipChecked); }
void nsButtonBoxFrame::DoMouseClick(WidgetGUIEvent* aEvent, bool aTrustEvent) { // Don't execute if we're disabled. if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled, nsGkAtoms::_true, eCaseMatters)) return; // Execute the oncommand event handler. bool isShift = false; bool isControl = false; bool isAlt = false; bool isMeta = false; if(aEvent) { WidgetInputEvent* inputEvent = aEvent->AsInputEvent(); isShift = inputEvent->IsShift(); isControl = inputEvent->IsControl(); isAlt = inputEvent->IsAlt(); isMeta = inputEvent->IsMeta(); } // Have the content handle the event, propagating it according to normal DOM rules. nsCOMPtr<nsIPresShell> shell = PresContext()->GetPresShell(); if (shell) { nsContentUtils::DispatchXULCommand(mContent, aEvent ? aEvent->mFlags.mIsTrusted : aTrustEvent, nullptr, shell, isControl, isAlt, isShift, isMeta); } }
uint32_t nsMenuBarListener::GetModifiers(nsIDOMKeyEvent* aKeyEvent) { uint32_t modifiers = 0; WidgetInputEvent* inputEvent = static_cast<WidgetInputEvent*>(aKeyEvent->GetInternalNSEvent()); MOZ_ASSERT(inputEvent); if (inputEvent->IsShift()) { modifiers |= MODIFIER_SHIFT; } if (inputEvent->IsControl()) { modifiers |= MODIFIER_CONTROL; } if (inputEvent->IsAlt()) { modifiers |= MODIFIER_ALT; } if (inputEvent->IsMeta()) { modifiers |= MODIFIER_META; } if (inputEvent->IsOS()) { modifiers |= MODIFIER_OS; } return modifiers; }
bool nsXBLPrototypeHandler::ModifiersMatchMask( nsIDOMUIEvent* aEvent, const IgnoreModifierState& aIgnoreModifierState) { WidgetInputEvent* inputEvent = aEvent->AsEvent()->WidgetEventPtr()->AsInputEvent(); NS_ENSURE_TRUE(inputEvent, false); if (mKeyMask & cMetaMask) { if (inputEvent->IsMeta() != ((mKeyMask & cMeta) != 0)) { return false; } } if ((mKeyMask & cOSMask) && !aIgnoreModifierState.mOS) { if (inputEvent->IsOS() != ((mKeyMask & cOS) != 0)) { return false; } } if (mKeyMask & cShiftMask && !aIgnoreModifierState.mShift) { if (inputEvent->IsShift() != ((mKeyMask & cShift) != 0)) { return false; } } if (mKeyMask & cAltMask) { if (inputEvent->IsAlt() != ((mKeyMask & cAlt) != 0)) { return false; } } if (mKeyMask & cControlMask) { if (inputEvent->IsControl() != ((mKeyMask & cControl) != 0)) { return false; } } return true; }
bool nsXBLPrototypeHandler::ModifiersMatchMask(nsIDOMUIEvent* aEvent, bool aIgnoreShiftKey) { WidgetInputEvent* inputEvent = aEvent->GetInternalNSEvent()->AsInputEvent(); NS_ENSURE_TRUE(inputEvent, false); if (mKeyMask & cMetaMask) { if (inputEvent->IsMeta() != ((mKeyMask & cMeta) != 0)) { return false; } } if (mKeyMask & cOSMask) { if (inputEvent->IsOS() != ((mKeyMask & cOS) != 0)) { return false; } } if (mKeyMask & cShiftMask && !aIgnoreShiftKey) { if (inputEvent->IsShift() != ((mKeyMask & cShift) != 0)) { return false; } } if (mKeyMask & cAltMask) { if (inputEvent->IsAlt() != ((mKeyMask & cAlt) != 0)) { return false; } } if (mKeyMask & cControlMask) { if (inputEvent->IsControl() != ((mKeyMask & cControl) != 0)) { return false; } } return true; }
bool nsDOMUIEvent::GetModifierStateInternal(const nsAString& aKey) { WidgetInputEvent* inputEvent = mEvent->AsInputEvent(); MOZ_ASSERT(inputEvent, "mEvent must be WidgetInputEvent or derived class"); if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SHIFT)) { return inputEvent->IsShift(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_CONTROL)) { return inputEvent->IsControl(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_META)) { return inputEvent->IsMeta(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_ALT)) { return inputEvent->IsAlt(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_ALTGRAPH)) { return inputEvent->IsAltGraph(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_OS)) { return inputEvent->IsOS(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_CAPSLOCK)) { return inputEvent->IsCapsLocked(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_NUMLOCK)) { return inputEvent->IsNumLocked(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_FN)) { return inputEvent->IsFn(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SCROLLLOCK)) { return inputEvent->IsScrollLocked(); } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SYMBOLLOCK)) { return inputEvent->IsSymbolLocked(); } return false; }
nsEventStatus APZInputBridge::ReceiveInputEvent( WidgetInputEvent& aEvent, ScrollableLayerGuid* aOutTargetGuid, uint64_t* aOutInputBlockId) { APZThreadUtils::AssertOnControllerThread(); // Initialize aOutInputBlockId to a sane value, and then later we overwrite // it if the input event goes into a block. if (aOutInputBlockId) { *aOutInputBlockId = 0; } switch (aEvent.mClass) { case eMouseEventClass: case eDragEventClass: { WidgetMouseEvent& mouseEvent = *aEvent.AsMouseEvent(); // Note, we call this before having transformed the reference point. if (mouseEvent.IsReal()) { UpdateWheelTransaction(mouseEvent.mRefPoint, mouseEvent.mMessage); } if (WillHandleMouseEvent(mouseEvent)) { MouseInput input(mouseEvent); input.mOrigin = ScreenPoint(mouseEvent.mRefPoint.x, mouseEvent.mRefPoint.y); nsEventStatus status = ReceiveInputEvent(input, aOutTargetGuid, aOutInputBlockId); mouseEvent.mRefPoint.x = input.mOrigin.x; mouseEvent.mRefPoint.y = input.mOrigin.y; mouseEvent.mFlags.mHandledByAPZ = input.mHandledByAPZ; mouseEvent.mFocusSequenceNumber = input.mFocusSequenceNumber; return status; } ProcessUnhandledEvent(&mouseEvent.mRefPoint, aOutTargetGuid, &aEvent.mFocusSequenceNumber); return nsEventStatus_eIgnore; } case eTouchEventClass: { WidgetTouchEvent& touchEvent = *aEvent.AsTouchEvent(); MultiTouchInput touchInput(touchEvent); nsEventStatus result = ReceiveInputEvent(touchInput, aOutTargetGuid, aOutInputBlockId); // touchInput was modified in-place to possibly remove some // touch points (if we are overscrolled), and the coordinates were // modified using the APZ untransform. We need to copy these changes // back into the WidgetInputEvent. touchEvent.mTouches.Clear(); touchEvent.mTouches.SetCapacity(touchInput.mTouches.Length()); for (size_t i = 0; i < touchInput.mTouches.Length(); i++) { *touchEvent.mTouches.AppendElement() = touchInput.mTouches[i].ToNewDOMTouch(); } touchEvent.mFlags.mHandledByAPZ = touchInput.mHandledByAPZ; touchEvent.mFocusSequenceNumber = touchInput.mFocusSequenceNumber; return result; } case eWheelEventClass: { WidgetWheelEvent& wheelEvent = *aEvent.AsWheelEvent(); if (Maybe<APZWheelAction> action = ActionForWheelEvent(&wheelEvent)) { ScrollWheelInput::ScrollMode scrollMode = ScrollWheelInput::SCROLLMODE_INSTANT; if (gfxPrefs::SmoothScrollEnabled() && ((wheelEvent.mDeltaMode == dom::WheelEventBinding::DOM_DELTA_LINE && gfxPrefs::WheelSmoothScrollEnabled()) || (wheelEvent.mDeltaMode == dom::WheelEventBinding::DOM_DELTA_PAGE && gfxPrefs::PageSmoothScrollEnabled()))) { scrollMode = ScrollWheelInput::SCROLLMODE_SMOOTH; } WheelDeltaAdjustmentStrategy strategy = EventStateManager::GetWheelDeltaAdjustmentStrategy(wheelEvent); // Adjust the delta values of the wheel event if the current default // action is to horizontalize scrolling. I.e., deltaY values are set to // deltaX and deltaY and deltaZ values are set to 0. // If horizontalized, the delta values will be restored and its overflow // deltaX will become 0 when the WheelDeltaHorizontalizer instance is // being destroyed. WheelDeltaHorizontalizer horizontalizer(wheelEvent); if (WheelDeltaAdjustmentStrategy::eHorizontalize == strategy) { horizontalizer.Horizontalize(); } // If the wheel event becomes no-op event, don't handle it as scroll. if (wheelEvent.mDeltaX || wheelEvent.mDeltaY) { ScreenPoint origin(wheelEvent.mRefPoint.x, wheelEvent.mRefPoint.y); ScrollWheelInput input(wheelEvent.mTime, wheelEvent.mTimeStamp, 0, scrollMode, ScrollWheelInput::DeltaTypeForDeltaMode( wheelEvent.mDeltaMode), origin, wheelEvent.mDeltaX, wheelEvent.mDeltaY, wheelEvent.mAllowToOverrideSystemScrollSpeed, strategy); input.mAPZAction = action.value(); // We add the user multiplier as a separate field, rather than premultiplying // it, because if the input is converted back to a WidgetWheelEvent, then // EventStateManager would apply the delta a second time. We could in theory // work around this by asking ESM to customize the event much sooner, and // then save the "mCustomizedByUserPrefs" bit on ScrollWheelInput - but for // now, this seems easier. EventStateManager::GetUserPrefsForWheelEvent(&wheelEvent, &input.mUserDeltaMultiplierX, &input.mUserDeltaMultiplierY); nsEventStatus status = ReceiveInputEvent(input, aOutTargetGuid, aOutInputBlockId); wheelEvent.mRefPoint.x = input.mOrigin.x; wheelEvent.mRefPoint.y = input.mOrigin.y; wheelEvent.mFlags.mHandledByAPZ = input.mHandledByAPZ; wheelEvent.mFocusSequenceNumber = input.mFocusSequenceNumber; return status; } } UpdateWheelTransaction(aEvent.mRefPoint, aEvent.mMessage); ProcessUnhandledEvent(&aEvent.mRefPoint, aOutTargetGuid, &aEvent.mFocusSequenceNumber); return nsEventStatus_eIgnore; } case eKeyboardEventClass: { WidgetKeyboardEvent& keyboardEvent = *aEvent.AsKeyboardEvent(); KeyboardInput input(keyboardEvent); nsEventStatus status = ReceiveInputEvent(input, aOutTargetGuid, aOutInputBlockId); keyboardEvent.mFlags.mHandledByAPZ = input.mHandledByAPZ; keyboardEvent.mFocusSequenceNumber = input.mFocusSequenceNumber; return status; } default: { UpdateWheelTransaction(aEvent.mRefPoint, aEvent.mMessage); ProcessUnhandledEvent(&aEvent.mRefPoint, aOutTargetGuid, &aEvent.mFocusSequenceNumber); return nsEventStatus_eIgnore; } } MOZ_ASSERT_UNREACHABLE("Invalid WidgetInputEvent type."); return nsEventStatus_eConsumeNoDefault; }