1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include "mozilla/dom/MouseEventBinding.h"
9 #include "mozilla/dom/Touch.h"
10 #include "mozilla/dom/WheelEventBinding.h"
11 #include "mozilla/TextEvents.h"
12 #include "nsContentUtils.h"
14 #include "nsThreadUtils.h"
15 #include "mozilla/MouseEvents.h"
16 #include "mozilla/TouchEvents.h"
17 #include "UnitTransforms.h"
23 InputData::~InputData()
27 InputData::InputData(InputType aInputType
)
28 : mInputType(aInputType
)
30 , mFocusSequenceNumber(0)
35 InputData::InputData(InputType aInputType
, uint32_t aTime
, TimeStamp aTimeStamp
,
37 : mInputType(aInputType
)
39 , mTimeStamp(aTimeStamp
)
40 , mFocusSequenceNumber(0)
41 , modifiers(aModifiers
)
45 SingleTouchData::SingleTouchData(int32_t aIdentifier
, ScreenIntPoint aScreenPoint
,
46 ScreenSize aRadius
, float aRotationAngle
,
48 : mIdentifier(aIdentifier
)
49 , mScreenPoint(aScreenPoint
)
51 , mRotationAngle(aRotationAngle
)
56 SingleTouchData::SingleTouchData(int32_t aIdentifier
,
57 ParentLayerPoint aLocalScreenPoint
,
58 ScreenSize aRadius
, float aRotationAngle
,
60 : mIdentifier(aIdentifier
)
61 , mLocalScreenPoint(aLocalScreenPoint
)
63 , mRotationAngle(aRotationAngle
)
68 SingleTouchData::SingleTouchData()
75 already_AddRefed
<Touch
> SingleTouchData::ToNewDOMTouch() const
77 MOZ_ASSERT(NS_IsMainThread(),
78 "Can only create dom::Touch instances on main thread");
79 RefPtr
<Touch
> touch
= new Touch(mIdentifier
,
80 LayoutDeviceIntPoint::Truncate(mScreenPoint
.x
, mScreenPoint
.y
),
81 LayoutDeviceIntPoint::Truncate(mRadius
.width
, mRadius
.height
),
84 return touch
.forget();
87 MultiTouchInput::MultiTouchInput(MultiTouchType aType
, uint32_t aTime
,
88 TimeStamp aTimeStamp
, Modifiers aModifiers
)
89 : InputData(MULTITOUCH_INPUT
, aTime
, aTimeStamp
, aModifiers
)
91 , mHandledByAPZ(false)
95 MultiTouchInput::MultiTouchInput()
96 : InputData(MULTITOUCH_INPUT
)
97 , mType(MULTITOUCH_START
)
98 , mHandledByAPZ(false)
102 MultiTouchInput::MultiTouchInput(const MultiTouchInput
& aOther
)
103 : InputData(MULTITOUCH_INPUT
, aOther
.mTime
, aOther
.mTimeStamp
, aOther
.modifiers
)
104 , mType(aOther
.mType
)
105 , mHandledByAPZ(aOther
.mHandledByAPZ
)
107 mTouches
.AppendElements(aOther
.mTouches
);
110 MultiTouchInput::MultiTouchInput(const WidgetTouchEvent
& aTouchEvent
)
111 : InputData(MULTITOUCH_INPUT
, aTouchEvent
.mTime
, aTouchEvent
.mTimeStamp
,
112 aTouchEvent
.mModifiers
)
113 , mHandledByAPZ(aTouchEvent
.mFlags
.mHandledByAPZ
)
115 MOZ_ASSERT(NS_IsMainThread(),
116 "Can only copy from WidgetTouchEvent on main thread");
118 switch (aTouchEvent
.mMessage
) {
120 mType
= MULTITOUCH_START
;
123 mType
= MULTITOUCH_MOVE
;
126 mType
= MULTITOUCH_END
;
129 mType
= MULTITOUCH_CANCEL
;
132 MOZ_ASSERT_UNREACHABLE("Did not assign a type to a MultiTouchInput");
136 for (size_t i
= 0; i
< aTouchEvent
.mTouches
.Length(); i
++) {
137 const Touch
* domTouch
= aTouchEvent
.mTouches
[i
];
139 // Extract data from weird interfaces.
140 int32_t identifier
= domTouch
->Identifier();
141 int32_t radiusX
= domTouch
->RadiusX(CallerType::System
);
142 int32_t radiusY
= domTouch
->RadiusY(CallerType::System
);
143 float rotationAngle
= domTouch
->RotationAngle(CallerType::System
);
144 float force
= domTouch
->Force(CallerType::System
);
146 SingleTouchData
data(identifier
,
147 ViewAs
<ScreenPixel
>(domTouch
->mRefPoint
,
148 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
),
149 ScreenSize(radiusX
, radiusY
),
153 mTouches
.AppendElement(data
);
157 MultiTouchInput::MultiTouchInput(const WidgetMouseEvent
& aMouseEvent
)
158 : InputData(MULTITOUCH_INPUT
, aMouseEvent
.mTime
, aMouseEvent
.mTimeStamp
,
159 aMouseEvent
.mModifiers
)
160 , mHandledByAPZ(aMouseEvent
.mFlags
.mHandledByAPZ
)
162 MOZ_ASSERT(NS_IsMainThread(),
163 "Can only copy from WidgetMouseEvent on main thread");
164 switch (aMouseEvent
.mMessage
) {
166 mType
= MULTITOUCH_START
;
169 mType
= MULTITOUCH_MOVE
;
172 mType
= MULTITOUCH_END
;
174 // The mouse pointer has been interrupted in an implementation-specific
175 // manner, such as a synchronous event or action cancelling the touch, or a
176 // touch point leaving the document window and going into a non-document
177 // area capable of handling user interactions.
178 case eMouseExitFromWidget
:
179 mType
= MULTITOUCH_CANCEL
;
182 NS_WARNING("Did not assign a type to a MultiTouchInput");
186 mTouches
.AppendElement(SingleTouchData(0,
187 ViewAs
<ScreenPixel
>(aMouseEvent
.mRefPoint
,
188 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
),
195 MultiTouchInput::Translate(const ScreenPoint
& aTranslation
)
197 const int32_t xTranslation
= (int32_t)(aTranslation
.x
+ 0.5f
);
198 const int32_t yTranslation
= (int32_t)(aTranslation
.y
+ 0.5f
);
200 for (auto iter
= mTouches
.begin(); iter
!= mTouches
.end(); iter
++) {
201 iter
->mScreenPoint
.MoveBy(xTranslation
, yTranslation
);
206 MultiTouchInput::ToWidgetTouchEvent(nsIWidget
* aWidget
) const
208 MOZ_ASSERT(NS_IsMainThread(),
209 "Can only convert To WidgetTouchEvent on main thread");
211 EventMessage touchEventMessage
= eVoidEvent
;
213 case MULTITOUCH_START
:
214 touchEventMessage
= eTouchStart
;
216 case MULTITOUCH_MOVE
:
217 touchEventMessage
= eTouchMove
;
220 touchEventMessage
= eTouchEnd
;
222 case MULTITOUCH_CANCEL
:
223 touchEventMessage
= eTouchCancel
;
226 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetTouchEvent in MultiTouchInput");
230 WidgetTouchEvent
event(true, touchEventMessage
, aWidget
);
231 if (touchEventMessage
== eVoidEvent
) {
235 event
.mModifiers
= this->modifiers
;
236 event
.mTime
= this->mTime
;
237 event
.mTimeStamp
= this->mTimeStamp
;
238 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
239 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
241 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
242 *event
.mTouches
.AppendElement() = mTouches
[i
].ToNewDOMTouch();
249 MultiTouchInput::ToWidgetMouseEvent(nsIWidget
* aWidget
) const
251 MOZ_ASSERT(NS_IsMainThread(),
252 "Can only convert To WidgetMouseEvent on main thread");
254 EventMessage mouseEventMessage
= eVoidEvent
;
256 case MultiTouchInput::MULTITOUCH_START
:
257 mouseEventMessage
= eMouseDown
;
259 case MultiTouchInput::MULTITOUCH_MOVE
:
260 mouseEventMessage
= eMouseMove
;
262 case MultiTouchInput::MULTITOUCH_CANCEL
:
263 case MultiTouchInput::MULTITOUCH_END
:
264 mouseEventMessage
= eMouseUp
;
267 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent");
271 WidgetMouseEvent
event(true, mouseEventMessage
, aWidget
,
272 WidgetMouseEvent::eReal
, WidgetMouseEvent::eNormal
);
274 const SingleTouchData
& firstTouch
= mTouches
[0];
275 event
.mRefPoint
.x
= firstTouch
.mScreenPoint
.x
;
276 event
.mRefPoint
.y
= firstTouch
.mScreenPoint
.y
;
279 event
.button
= WidgetMouseEvent::eLeftButton
;
280 event
.inputSource
= MouseEvent_Binding::MOZ_SOURCE_TOUCH
;
281 event
.mModifiers
= modifiers
;
282 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
283 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
285 if (mouseEventMessage
!= eMouseMove
) {
286 event
.mClickCount
= 1;
293 MultiTouchInput::IndexOfTouch(int32_t aTouchIdentifier
)
295 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
296 if (mTouches
[i
].mIdentifier
== aTouchIdentifier
) {
304 MultiTouchInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
306 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
307 Maybe
<ParentLayerIntPoint
> point
= UntransformBy(aTransform
, mTouches
[i
].mScreenPoint
);
311 mTouches
[i
].mLocalScreenPoint
= *point
;
316 MouseInput::MouseInput()
317 : InputData(MOUSE_INPUT
)
322 , mHandledByAPZ(false)
326 MouseInput::MouseInput(MouseType aType
, ButtonType aButtonType
,
327 uint16_t aInputSource
, int16_t aButtons
,
328 const ScreenPoint
& aPoint
, uint32_t aTime
,
329 TimeStamp aTimeStamp
, Modifiers aModifiers
)
330 : InputData(MOUSE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
332 , mButtonType(aButtonType
)
333 , mInputSource(aInputSource
)
336 , mHandledByAPZ(false)
340 MouseInput::MouseInput(const WidgetMouseEventBase
& aMouseEvent
)
341 : InputData(MOUSE_INPUT
, aMouseEvent
.mTime
, aMouseEvent
.mTimeStamp
,
342 aMouseEvent
.mModifiers
)
345 , mInputSource(aMouseEvent
.inputSource
)
346 , mButtons(aMouseEvent
.buttons
)
347 , mHandledByAPZ(aMouseEvent
.mFlags
.mHandledByAPZ
)
349 MOZ_ASSERT(NS_IsMainThread(),
350 "Can only copy from WidgetTouchEvent on main thread");
354 switch (aMouseEvent
.button
) {
355 case WidgetMouseEventBase::eLeftButton
:
356 mButtonType
= MouseInput::LEFT_BUTTON
;
358 case WidgetMouseEventBase::eMiddleButton
:
359 mButtonType
= MouseInput::MIDDLE_BUTTON
;
361 case WidgetMouseEventBase::eRightButton
:
362 mButtonType
= MouseInput::RIGHT_BUTTON
;
366 switch (aMouseEvent
.mMessage
) {
377 mType
= MOUSE_DRAG_START
;
380 mType
= MOUSE_DRAG_END
;
382 case eMouseEnterIntoWidget
:
383 mType
= MOUSE_WIDGET_ENTER
;
385 case eMouseExitFromWidget
:
386 mType
= MOUSE_WIDGET_EXIT
;
389 mType
= MOUSE_HITTEST
;
392 MOZ_ASSERT_UNREACHABLE("Mouse event type not supported");
397 ScreenPoint(ViewAs
<ScreenPixel
>(aMouseEvent
.mRefPoint
,
398 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
402 MouseInput::IsLeftButton() const
404 return mButtonType
== LEFT_BUTTON
;
408 MouseInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
410 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mOrigin
);
414 mLocalOrigin
= *point
;
420 MouseInput::ToWidgetMouseEvent(nsIWidget
* aWidget
) const
422 MOZ_ASSERT(NS_IsMainThread(),
423 "Can only convert To WidgetTouchEvent on main thread");
425 EventMessage msg
= eVoidEvent
;
426 uint32_t clickCount
= 0;
439 case MOUSE_DRAG_START
:
445 case MOUSE_WIDGET_ENTER
:
446 msg
= eMouseEnterIntoWidget
;
448 case MOUSE_WIDGET_EXIT
:
449 msg
= eMouseExitFromWidget
;
455 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent in MouseInput");
459 WidgetMouseEvent
event(true, msg
, aWidget
, WidgetMouseEvent::eReal
, WidgetMouseEvent::eNormal
);
461 if (msg
== eVoidEvent
) {
465 switch (mButtonType
) {
466 case MouseInput::LEFT_BUTTON
:
467 event
.button
= WidgetMouseEventBase::eLeftButton
;
469 case MouseInput::MIDDLE_BUTTON
:
470 event
.button
= WidgetMouseEventBase::eMiddleButton
;
472 case MouseInput::RIGHT_BUTTON
:
473 event
.button
= WidgetMouseEventBase::eRightButton
;
475 case MouseInput::NONE
:
480 event
.buttons
= mButtons
;
481 event
.mModifiers
= modifiers
;
483 event
.mTimeStamp
= mTimeStamp
;
484 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
486 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mOrigin
,
487 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
488 event
.mClickCount
= clickCount
;
489 event
.inputSource
= mInputSource
;
490 event
.mIgnoreRootScrollFrame
= true;
491 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
496 PanGestureInput::PanGestureInput()
497 : InputData(PANGESTURE_INPUT
)
498 , mType(PANGESTURE_MAYSTART
)
499 , mLineOrPageDeltaX(0)
500 , mLineOrPageDeltaY(0)
501 , mUserDeltaMultiplierX(1.0)
502 , mUserDeltaMultiplierY(1.0)
503 , mHandledByAPZ(false)
504 , mFollowedByMomentum(false)
505 , mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
506 , mOverscrollBehaviorAllowsSwipe(false)
510 PanGestureInput::PanGestureInput(PanGestureType aType
, uint32_t aTime
,
511 TimeStamp aTimeStamp
,
512 const ScreenPoint
& aPanStartPoint
,
513 const ScreenPoint
& aPanDisplacement
,
514 Modifiers aModifiers
)
515 : InputData(PANGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
517 , mPanStartPoint(aPanStartPoint
)
518 , mPanDisplacement(aPanDisplacement
)
519 , mLineOrPageDeltaX(0)
520 , mLineOrPageDeltaY(0)
521 , mUserDeltaMultiplierX(1.0)
522 , mUserDeltaMultiplierY(1.0)
523 , mHandledByAPZ(false)
524 , mFollowedByMomentum(false)
525 , mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
526 , mOverscrollBehaviorAllowsSwipe(false)
531 PanGestureInput::IsMomentum() const
534 case PanGestureInput::PANGESTURE_MOMENTUMSTART
:
535 case PanGestureInput::PANGESTURE_MOMENTUMPAN
:
536 case PanGestureInput::PANGESTURE_MOMENTUMEND
:
544 PanGestureInput::ToWidgetWheelEvent(nsIWidget
* aWidget
) const
546 WidgetWheelEvent
wheelEvent(true, eWheel
, aWidget
);
547 wheelEvent
.mModifiers
= this->modifiers
;
548 wheelEvent
.mTime
= mTime
;
549 wheelEvent
.mTimeStamp
= mTimeStamp
;
550 wheelEvent
.mRefPoint
=
551 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mPanStartPoint
,
552 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
553 wheelEvent
.buttons
= 0;
554 wheelEvent
.mDeltaMode
= WheelEvent_Binding::DOM_DELTA_PIXEL
;
555 wheelEvent
.mMayHaveMomentum
= true; // pan inputs may have momentum
556 wheelEvent
.mIsMomentum
= IsMomentum();
557 wheelEvent
.mLineOrPageDeltaX
= mLineOrPageDeltaX
;
558 wheelEvent
.mLineOrPageDeltaY
= mLineOrPageDeltaY
;
559 wheelEvent
.mDeltaX
= mPanDisplacement
.x
;
560 wheelEvent
.mDeltaY
= mPanDisplacement
.y
;
561 wheelEvent
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
562 wheelEvent
.mFocusSequenceNumber
= mFocusSequenceNumber
;
567 PanGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
569 Maybe
<ParentLayerPoint
> panStartPoint
= UntransformBy(aTransform
, mPanStartPoint
);
570 if (!panStartPoint
) {
573 mLocalPanStartPoint
= *panStartPoint
;
575 Maybe
<ParentLayerPoint
> panDisplacement
= UntransformVector(aTransform
, mPanDisplacement
, mPanStartPoint
);
576 if (!panDisplacement
) {
579 mLocalPanDisplacement
= *panDisplacement
;
584 PanGestureInput::UserMultipliedPanDisplacement() const
586 return ScreenPoint(mPanDisplacement
.x
* mUserDeltaMultiplierX
,
587 mPanDisplacement
.y
* mUserDeltaMultiplierY
);
591 PanGestureInput::UserMultipliedLocalPanDisplacement() const
593 return ParentLayerPoint(mLocalPanDisplacement
.x
* mUserDeltaMultiplierX
,
594 mLocalPanDisplacement
.y
* mUserDeltaMultiplierY
);
597 PinchGestureInput::PinchGestureInput()
598 : InputData(PINCHGESTURE_INPUT
)
599 , mType(PINCHGESTURE_START
)
603 PinchGestureInput::PinchGestureInput(PinchGestureType aType
, uint32_t aTime
,
604 TimeStamp aTimeStamp
,
605 const ScreenPoint
& aFocusPoint
,
606 ParentLayerCoord aCurrentSpan
,
607 ParentLayerCoord aPreviousSpan
,
608 Modifiers aModifiers
)
609 : InputData(PINCHGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
611 , mFocusPoint(aFocusPoint
)
612 , mCurrentSpan(aCurrentSpan
)
613 , mPreviousSpan(aPreviousSpan
)
617 PinchGestureInput::PinchGestureInput(PinchGestureType aType
, uint32_t aTime
,
618 TimeStamp aTimeStamp
,
619 const ParentLayerPoint
& aLocalFocusPoint
,
620 ParentLayerCoord aCurrentSpan
,
621 ParentLayerCoord aPreviousSpan
,
622 Modifiers aModifiers
)
623 : InputData(PINCHGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
625 , mLocalFocusPoint(aLocalFocusPoint
)
626 , mCurrentSpan(aCurrentSpan
)
627 , mPreviousSpan(aPreviousSpan
)
632 PinchGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
634 if (mFocusPoint
== BothFingersLifted
<ScreenPixel
>()) {
635 // Special value, no transform required.
636 mLocalFocusPoint
= BothFingersLifted();
639 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mFocusPoint
);
643 mLocalFocusPoint
= *point
;
647 TapGestureInput::TapGestureInput()
648 : InputData(TAPGESTURE_INPUT
)
649 , mType(TAPGESTURE_LONG
)
653 TapGestureInput::TapGestureInput(TapGestureType aType
, uint32_t aTime
,
654 TimeStamp aTimeStamp
,
655 const ScreenIntPoint
& aPoint
,
656 Modifiers aModifiers
)
657 : InputData(TAPGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
663 TapGestureInput::TapGestureInput(TapGestureType aType
, uint32_t aTime
,
664 TimeStamp aTimeStamp
,
665 const ParentLayerPoint
& aLocalPoint
,
666 Modifiers aModifiers
)
667 : InputData(TAPGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
669 , mLocalPoint(aLocalPoint
)
674 TapGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
676 Maybe
<ParentLayerIntPoint
> point
= UntransformBy(aTransform
, mPoint
);
680 mLocalPoint
= *point
;
684 ScrollWheelInput::ScrollWheelInput()
685 : InputData(SCROLLWHEEL_INPUT
)
686 , mDeltaType(SCROLLDELTA_LINE
)
687 , mScrollMode(SCROLLMODE_INSTANT
)
688 , mHandledByAPZ(false)
691 , mLineOrPageDeltaX(0)
692 , mLineOrPageDeltaY(0)
693 , mScrollSeriesNumber(0)
694 , mUserDeltaMultiplierX(1.0)
695 , mUserDeltaMultiplierY(1.0)
696 , mMayHaveMomentum(false)
698 , mAPZAction(APZWheelAction::Scroll
)
702 ScrollWheelInput::ScrollWheelInput(uint32_t aTime
, TimeStamp aTimeStamp
,
703 Modifiers aModifiers
, ScrollMode aScrollMode
,
704 ScrollDeltaType aDeltaType
,
705 const ScreenPoint
& aOrigin
, double aDeltaX
,
707 bool aAllowToOverrideSystemScrollSpeed
,
708 WheelDeltaAdjustmentStrategy
709 aWheelDeltaAdjustmentStrategy
)
710 : InputData(SCROLLWHEEL_INPUT
, aTime
, aTimeStamp
, aModifiers
)
711 , mDeltaType(aDeltaType
)
712 , mScrollMode(aScrollMode
)
714 , mHandledByAPZ(false)
717 , mLineOrPageDeltaX(0)
718 , mLineOrPageDeltaY(0)
719 , mScrollSeriesNumber(0)
720 , mUserDeltaMultiplierX(1.0)
721 , mUserDeltaMultiplierY(1.0)
722 , mMayHaveMomentum(false)
724 , mAllowToOverrideSystemScrollSpeed(aAllowToOverrideSystemScrollSpeed
)
725 , mWheelDeltaAdjustmentStrategy(aWheelDeltaAdjustmentStrategy
)
726 , mAPZAction(APZWheelAction::Scroll
)
730 ScrollWheelInput::ScrollWheelInput(const WidgetWheelEvent
& aWheelEvent
)
731 : InputData(SCROLLWHEEL_INPUT
, aWheelEvent
.mTime
, aWheelEvent
.mTimeStamp
,
732 aWheelEvent
.mModifiers
)
733 , mDeltaType(DeltaTypeForDeltaMode(aWheelEvent
.mDeltaMode
))
734 , mScrollMode(SCROLLMODE_INSTANT
)
735 , mHandledByAPZ(aWheelEvent
.mFlags
.mHandledByAPZ
)
736 , mDeltaX(aWheelEvent
.mDeltaX
)
737 , mDeltaY(aWheelEvent
.mDeltaY
)
738 , mLineOrPageDeltaX(aWheelEvent
.mLineOrPageDeltaX
)
739 , mLineOrPageDeltaY(aWheelEvent
.mLineOrPageDeltaY
)
740 , mScrollSeriesNumber(0)
741 , mUserDeltaMultiplierX(1.0)
742 , mUserDeltaMultiplierY(1.0)
743 , mMayHaveMomentum(aWheelEvent
.mMayHaveMomentum
)
744 , mIsMomentum(aWheelEvent
.mIsMomentum
)
745 , mAllowToOverrideSystemScrollSpeed(
746 aWheelEvent
.mAllowToOverrideSystemScrollSpeed
)
747 , mWheelDeltaAdjustmentStrategy(WheelDeltaAdjustmentStrategy::eNone
)
748 , mAPZAction(APZWheelAction::Scroll
)
751 ScreenPoint(ViewAs
<ScreenPixel
>(aWheelEvent
.mRefPoint
,
752 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
755 ScrollWheelInput::ScrollDeltaType
756 ScrollWheelInput::DeltaTypeForDeltaMode(uint32_t aDeltaMode
)
758 switch (aDeltaMode
) {
759 case WheelEvent_Binding::DOM_DELTA_LINE
:
760 return SCROLLDELTA_LINE
;
761 case WheelEvent_Binding::DOM_DELTA_PAGE
:
762 return SCROLLDELTA_PAGE
;
763 case WheelEvent_Binding::DOM_DELTA_PIXEL
:
764 return SCROLLDELTA_PIXEL
;
768 return SCROLLDELTA_LINE
;
772 ScrollWheelInput::DeltaModeForDeltaType(ScrollDeltaType aDeltaType
)
774 switch (aDeltaType
) {
775 case ScrollWheelInput::SCROLLDELTA_LINE
:
776 return WheelEvent_Binding::DOM_DELTA_LINE
;
777 case ScrollWheelInput::SCROLLDELTA_PAGE
:
778 return WheelEvent_Binding::DOM_DELTA_PAGE
;
779 case ScrollWheelInput::SCROLLDELTA_PIXEL
:
781 return WheelEvent_Binding::DOM_DELTA_PIXEL
;
785 nsIScrollableFrame::ScrollUnit
786 ScrollWheelInput::ScrollUnitForDeltaType(ScrollDeltaType aDeltaType
)
788 switch (aDeltaType
) {
789 case SCROLLDELTA_LINE
:
790 return nsIScrollableFrame::LINES
;
791 case SCROLLDELTA_PAGE
:
792 return nsIScrollableFrame::PAGES
;
793 case SCROLLDELTA_PIXEL
:
794 return nsIScrollableFrame::DEVICE_PIXELS
;
798 return nsIScrollableFrame::LINES
;
802 ScrollWheelInput::ToWidgetWheelEvent(nsIWidget
* aWidget
) const
804 WidgetWheelEvent
wheelEvent(true, eWheel
, aWidget
);
805 wheelEvent
.mModifiers
= this->modifiers
;
806 wheelEvent
.mTime
= mTime
;
807 wheelEvent
.mTimeStamp
= mTimeStamp
;
808 wheelEvent
.mRefPoint
=
809 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mOrigin
,
810 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
811 wheelEvent
.buttons
= 0;
812 wheelEvent
.mDeltaMode
= DeltaModeForDeltaType(mDeltaType
);
813 wheelEvent
.mMayHaveMomentum
= mMayHaveMomentum
;
814 wheelEvent
.mIsMomentum
= mIsMomentum
;
815 wheelEvent
.mDeltaX
= mDeltaX
;
816 wheelEvent
.mDeltaY
= mDeltaY
;
817 wheelEvent
.mLineOrPageDeltaX
= mLineOrPageDeltaX
;
818 wheelEvent
.mLineOrPageDeltaY
= mLineOrPageDeltaY
;
819 wheelEvent
.mAllowToOverrideSystemScrollSpeed
=
820 mAllowToOverrideSystemScrollSpeed
;
821 wheelEvent
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
822 wheelEvent
.mFocusSequenceNumber
= mFocusSequenceNumber
;
827 ScrollWheelInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
829 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mOrigin
);
833 mLocalOrigin
= *point
;
838 ScrollWheelInput::IsCustomizedByUserPrefs() const
840 return mUserDeltaMultiplierX
!= 1.0 ||
841 mUserDeltaMultiplierY
!= 1.0;
844 KeyboardInput::KeyboardInput(const WidgetKeyboardEvent
& aEvent
)
845 : InputData(KEYBOARD_INPUT
,
849 , mKeyCode(aEvent
.mKeyCode
)
850 , mCharCode(aEvent
.mCharCode
)
851 , mHandledByAPZ(false)
853 switch (aEvent
.mMessage
) {
855 mType
= KeyboardInput::KEY_PRESS
;
859 mType
= KeyboardInput::KEY_UP
;
863 mType
= KeyboardInput::KEY_DOWN
;
867 mType
= KeyboardInput::KEY_OTHER
;
871 aEvent
.GetShortcutKeyCandidates(mShortcutCandidates
);
874 KeyboardInput::KeyboardInput()
875 : InputData(KEYBOARD_INPUT
)
879 , mHandledByAPZ(false)
883 } // namespace mozilla