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/Touch.h"
9 #include "nsContentUtils.h"
11 #include "nsThreadUtils.h"
12 #include "mozilla/MouseEvents.h"
13 #include "mozilla/TouchEvents.h"
14 #include "UnitTransforms.h"
20 InputData::~InputData()
24 InputData::InputData(InputType aInputType
)
25 : mInputType(aInputType
)
27 , mFocusSequenceNumber(0)
32 InputData::InputData(InputType aInputType
, uint32_t aTime
, TimeStamp aTimeStamp
,
34 : mInputType(aInputType
)
36 , mTimeStamp(aTimeStamp
)
37 , mFocusSequenceNumber(0)
38 , modifiers(aModifiers
)
42 SingleTouchData::SingleTouchData(int32_t aIdentifier
, ScreenIntPoint aScreenPoint
,
43 ScreenSize aRadius
, float aRotationAngle
,
45 : mIdentifier(aIdentifier
)
46 , mScreenPoint(aScreenPoint
)
48 , mRotationAngle(aRotationAngle
)
53 SingleTouchData::SingleTouchData(int32_t aIdentifier
,
54 ParentLayerPoint aLocalScreenPoint
,
55 ScreenSize aRadius
, float aRotationAngle
,
57 : mIdentifier(aIdentifier
)
58 , mLocalScreenPoint(aLocalScreenPoint
)
60 , mRotationAngle(aRotationAngle
)
65 SingleTouchData::SingleTouchData()
69 already_AddRefed
<Touch
> SingleTouchData::ToNewDOMTouch() const
71 MOZ_ASSERT(NS_IsMainThread(),
72 "Can only create dom::Touch instances on main thread");
73 RefPtr
<Touch
> touch
= new Touch(mIdentifier
,
74 LayoutDeviceIntPoint::Truncate(mScreenPoint
.x
, mScreenPoint
.y
),
75 LayoutDeviceIntPoint::Truncate(mRadius
.width
, mRadius
.height
),
78 return touch
.forget();
81 MultiTouchInput::MultiTouchInput(MultiTouchType aType
, uint32_t aTime
,
82 TimeStamp aTimeStamp
, Modifiers aModifiers
)
83 : InputData(MULTITOUCH_INPUT
, aTime
, aTimeStamp
, aModifiers
)
85 , mHandledByAPZ(false)
89 MultiTouchInput::MultiTouchInput()
90 : InputData(MULTITOUCH_INPUT
)
91 , mHandledByAPZ(false)
95 MultiTouchInput::MultiTouchInput(const MultiTouchInput
& aOther
)
96 : InputData(MULTITOUCH_INPUT
, aOther
.mTime
, aOther
.mTimeStamp
, aOther
.modifiers
)
98 , mHandledByAPZ(aOther
.mHandledByAPZ
)
100 mTouches
.AppendElements(aOther
.mTouches
);
103 MultiTouchInput::MultiTouchInput(const WidgetTouchEvent
& aTouchEvent
)
104 : InputData(MULTITOUCH_INPUT
, aTouchEvent
.mTime
, aTouchEvent
.mTimeStamp
,
105 aTouchEvent
.mModifiers
)
106 , mHandledByAPZ(aTouchEvent
.mFlags
.mHandledByAPZ
)
108 MOZ_ASSERT(NS_IsMainThread(),
109 "Can only copy from WidgetTouchEvent on main thread");
111 switch (aTouchEvent
.mMessage
) {
113 mType
= MULTITOUCH_START
;
116 mType
= MULTITOUCH_MOVE
;
119 mType
= MULTITOUCH_END
;
122 mType
= MULTITOUCH_CANCEL
;
125 MOZ_ASSERT_UNREACHABLE("Did not assign a type to a MultiTouchInput");
129 for (size_t i
= 0; i
< aTouchEvent
.mTouches
.Length(); i
++) {
130 const Touch
* domTouch
= aTouchEvent
.mTouches
[i
];
132 // Extract data from weird interfaces.
133 int32_t identifier
= domTouch
->Identifier();
134 int32_t radiusX
= domTouch
->RadiusX(CallerType::System
);
135 int32_t radiusY
= domTouch
->RadiusY(CallerType::System
);
136 float rotationAngle
= domTouch
->RotationAngle(CallerType::System
);
137 float force
= domTouch
->Force(CallerType::System
);
139 SingleTouchData
data(identifier
,
140 ViewAs
<ScreenPixel
>(domTouch
->mRefPoint
,
141 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
),
142 ScreenSize(radiusX
, radiusY
),
146 mTouches
.AppendElement(data
);
150 MultiTouchInput::MultiTouchInput(const WidgetMouseEvent
& aMouseEvent
)
151 : InputData(MULTITOUCH_INPUT
, aMouseEvent
.mTime
, aMouseEvent
.mTimeStamp
,
152 aMouseEvent
.mModifiers
)
153 , mHandledByAPZ(aMouseEvent
.mFlags
.mHandledByAPZ
)
155 MOZ_ASSERT(NS_IsMainThread(),
156 "Can only copy from WidgetMouseEvent on main thread");
157 switch (aMouseEvent
.mMessage
) {
159 mType
= MULTITOUCH_START
;
162 mType
= MULTITOUCH_MOVE
;
165 mType
= MULTITOUCH_END
;
167 // The mouse pointer has been interrupted in an implementation-specific
168 // manner, such as a synchronous event or action cancelling the touch, or a
169 // touch point leaving the document window and going into a non-document
170 // area capable of handling user interactions.
171 case eMouseExitFromWidget
:
172 mType
= MULTITOUCH_CANCEL
;
175 NS_WARNING("Did not assign a type to a MultiTouchInput");
179 mTouches
.AppendElement(SingleTouchData(0,
180 ViewAs
<ScreenPixel
>(aMouseEvent
.mRefPoint
,
181 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
),
188 MultiTouchInput::Translate(const ScreenPoint
& aTranslation
)
190 const int32_t xTranslation
= (int32_t)(aTranslation
.x
+ 0.5f
);
191 const int32_t yTranslation
= (int32_t)(aTranslation
.y
+ 0.5f
);
193 for (auto iter
= mTouches
.begin(); iter
!= mTouches
.end(); iter
++) {
194 iter
->mScreenPoint
.MoveBy(xTranslation
, yTranslation
);
199 MultiTouchInput::ToWidgetTouchEvent(nsIWidget
* aWidget
) const
201 MOZ_ASSERT(NS_IsMainThread(),
202 "Can only convert To WidgetTouchEvent on main thread");
204 EventMessage touchEventMessage
= eVoidEvent
;
206 case MULTITOUCH_START
:
207 touchEventMessage
= eTouchStart
;
209 case MULTITOUCH_MOVE
:
210 touchEventMessage
= eTouchMove
;
213 touchEventMessage
= eTouchEnd
;
215 case MULTITOUCH_CANCEL
:
216 touchEventMessage
= eTouchCancel
;
219 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetTouchEvent in MultiTouchInput");
223 WidgetTouchEvent
event(true, touchEventMessage
, aWidget
);
224 if (touchEventMessage
== eVoidEvent
) {
228 event
.mModifiers
= this->modifiers
;
229 event
.mTime
= this->mTime
;
230 event
.mTimeStamp
= this->mTimeStamp
;
231 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
232 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
234 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
235 *event
.mTouches
.AppendElement() = mTouches
[i
].ToNewDOMTouch();
242 MultiTouchInput::ToWidgetMouseEvent(nsIWidget
* aWidget
) const
244 MOZ_ASSERT(NS_IsMainThread(),
245 "Can only convert To WidgetMouseEvent on main thread");
247 EventMessage mouseEventMessage
= eVoidEvent
;
249 case MultiTouchInput::MULTITOUCH_START
:
250 mouseEventMessage
= eMouseDown
;
252 case MultiTouchInput::MULTITOUCH_MOVE
:
253 mouseEventMessage
= eMouseMove
;
255 case MultiTouchInput::MULTITOUCH_CANCEL
:
256 case MultiTouchInput::MULTITOUCH_END
:
257 mouseEventMessage
= eMouseUp
;
260 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent");
264 WidgetMouseEvent
event(true, mouseEventMessage
, aWidget
,
265 WidgetMouseEvent::eReal
, WidgetMouseEvent::eNormal
);
267 const SingleTouchData
& firstTouch
= mTouches
[0];
268 event
.mRefPoint
.x
= firstTouch
.mScreenPoint
.x
;
269 event
.mRefPoint
.y
= firstTouch
.mScreenPoint
.y
;
272 event
.button
= WidgetMouseEvent::eLeftButton
;
273 event
.inputSource
= nsIDOMMouseEvent::MOZ_SOURCE_TOUCH
;
274 event
.mModifiers
= modifiers
;
275 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
276 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
278 if (mouseEventMessage
!= eMouseMove
) {
279 event
.mClickCount
= 1;
286 MultiTouchInput::IndexOfTouch(int32_t aTouchIdentifier
)
288 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
289 if (mTouches
[i
].mIdentifier
== aTouchIdentifier
) {
297 MultiTouchInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
299 for (size_t i
= 0; i
< mTouches
.Length(); i
++) {
300 Maybe
<ParentLayerIntPoint
> point
= UntransformBy(aTransform
, mTouches
[i
].mScreenPoint
);
304 mTouches
[i
].mLocalScreenPoint
= *point
;
309 MouseInput::MouseInput()
310 : InputData(MOUSE_INPUT
)
315 , mHandledByAPZ(false)
319 MouseInput::MouseInput(MouseType aType
, ButtonType aButtonType
,
320 uint16_t aInputSource
, int16_t aButtons
,
321 const ScreenPoint
& aPoint
, uint32_t aTime
,
322 TimeStamp aTimeStamp
, Modifiers aModifiers
)
323 : InputData(MOUSE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
325 , mButtonType(aButtonType
)
326 , mInputSource(aInputSource
)
329 , mHandledByAPZ(false)
333 MouseInput::MouseInput(const WidgetMouseEventBase
& aMouseEvent
)
334 : InputData(MOUSE_INPUT
, aMouseEvent
.mTime
, aMouseEvent
.mTimeStamp
,
335 aMouseEvent
.mModifiers
)
338 , mInputSource(aMouseEvent
.inputSource
)
339 , mButtons(aMouseEvent
.buttons
)
340 , mHandledByAPZ(aMouseEvent
.mFlags
.mHandledByAPZ
)
342 MOZ_ASSERT(NS_IsMainThread(),
343 "Can only copy from WidgetTouchEvent on main thread");
347 switch (aMouseEvent
.button
) {
348 case WidgetMouseEventBase::eLeftButton
:
349 mButtonType
= MouseInput::LEFT_BUTTON
;
351 case WidgetMouseEventBase::eMiddleButton
:
352 mButtonType
= MouseInput::MIDDLE_BUTTON
;
354 case WidgetMouseEventBase::eRightButton
:
355 mButtonType
= MouseInput::RIGHT_BUTTON
;
359 switch (aMouseEvent
.mMessage
) {
370 mType
= MOUSE_DRAG_START
;
373 mType
= MOUSE_DRAG_END
;
375 case eMouseEnterIntoWidget
:
376 mType
= MOUSE_WIDGET_ENTER
;
378 case eMouseExitFromWidget
:
379 mType
= MOUSE_WIDGET_EXIT
;
382 MOZ_ASSERT_UNREACHABLE("Mouse event type not supported");
387 ScreenPoint(ViewAs
<ScreenPixel
>(aMouseEvent
.mRefPoint
,
388 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
392 MouseInput::IsLeftButton() const
394 return mButtonType
== LEFT_BUTTON
;
398 MouseInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
400 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mOrigin
);
404 mLocalOrigin
= *point
;
410 MouseInput::ToWidgetMouseEvent(nsIWidget
* aWidget
) const
412 MOZ_ASSERT(NS_IsMainThread(),
413 "Can only convert To WidgetTouchEvent on main thread");
415 EventMessage msg
= eVoidEvent
;
416 uint32_t clickCount
= 0;
429 case MOUSE_DRAG_START
:
435 case MOUSE_WIDGET_ENTER
:
436 msg
= eMouseEnterIntoWidget
;
438 case MOUSE_WIDGET_EXIT
:
439 msg
= eMouseExitFromWidget
;
442 MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent in MouseInput");
446 WidgetMouseEvent
event(true, msg
, aWidget
, WidgetMouseEvent::eReal
, WidgetMouseEvent::eNormal
);
448 if (msg
== eVoidEvent
) {
452 switch (mButtonType
) {
453 case MouseInput::LEFT_BUTTON
:
454 event
.button
= WidgetMouseEventBase::eLeftButton
;
456 case MouseInput::MIDDLE_BUTTON
:
457 event
.button
= WidgetMouseEventBase::eMiddleButton
;
459 case MouseInput::RIGHT_BUTTON
:
460 event
.button
= WidgetMouseEventBase::eRightButton
;
462 case MouseInput::NONE
:
467 event
.buttons
= mButtons
;
468 event
.mModifiers
= modifiers
;
470 event
.mTimeStamp
= mTimeStamp
;
471 event
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
473 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mOrigin
,
474 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
475 event
.mClickCount
= clickCount
;
476 event
.inputSource
= mInputSource
;
477 event
.mIgnoreRootScrollFrame
= true;
478 event
.mFocusSequenceNumber
= mFocusSequenceNumber
;
483 PanGestureInput::PanGestureInput()
484 : InputData(PANGESTURE_INPUT
)
485 , mLineOrPageDeltaX(0)
486 , mLineOrPageDeltaY(0)
487 , mUserDeltaMultiplierX(1.0)
488 , mUserDeltaMultiplierY(1.0)
489 , mHandledByAPZ(false)
490 , mFollowedByMomentum(false)
491 , mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
495 PanGestureInput::PanGestureInput(PanGestureType aType
, uint32_t aTime
,
496 TimeStamp aTimeStamp
,
497 const ScreenPoint
& aPanStartPoint
,
498 const ScreenPoint
& aPanDisplacement
,
499 Modifiers aModifiers
)
500 : InputData(PANGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
502 , mPanStartPoint(aPanStartPoint
)
503 , mPanDisplacement(aPanDisplacement
)
504 , mLineOrPageDeltaX(0)
505 , mLineOrPageDeltaY(0)
506 , mUserDeltaMultiplierX(1.0)
507 , mUserDeltaMultiplierY(1.0)
508 , mHandledByAPZ(false)
509 , mFollowedByMomentum(false)
510 , mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
515 PanGestureInput::IsMomentum() const
518 case PanGestureInput::PANGESTURE_MOMENTUMSTART
:
519 case PanGestureInput::PANGESTURE_MOMENTUMPAN
:
520 case PanGestureInput::PANGESTURE_MOMENTUMEND
:
528 PanGestureInput::ToWidgetWheelEvent(nsIWidget
* aWidget
) const
530 WidgetWheelEvent
wheelEvent(true, eWheel
, aWidget
);
531 wheelEvent
.mModifiers
= this->modifiers
;
532 wheelEvent
.mTime
= mTime
;
533 wheelEvent
.mTimeStamp
= mTimeStamp
;
534 wheelEvent
.mRefPoint
=
535 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mPanStartPoint
,
536 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
537 wheelEvent
.buttons
= 0;
538 wheelEvent
.mDeltaMode
= nsIDOMWheelEvent::DOM_DELTA_PIXEL
;
539 wheelEvent
.mMayHaveMomentum
= true; // pan inputs may have momentum
540 wheelEvent
.mIsMomentum
= IsMomentum();
541 wheelEvent
.mLineOrPageDeltaX
= mLineOrPageDeltaX
;
542 wheelEvent
.mLineOrPageDeltaY
= mLineOrPageDeltaY
;
543 wheelEvent
.mDeltaX
= mPanDisplacement
.x
;
544 wheelEvent
.mDeltaY
= mPanDisplacement
.y
;
545 wheelEvent
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
546 wheelEvent
.mFocusSequenceNumber
= mFocusSequenceNumber
;
551 PanGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
553 Maybe
<ParentLayerPoint
> panStartPoint
= UntransformBy(aTransform
, mPanStartPoint
);
554 if (!panStartPoint
) {
557 mLocalPanStartPoint
= *panStartPoint
;
559 Maybe
<ParentLayerPoint
> panDisplacement
= UntransformVector(aTransform
, mPanDisplacement
, mPanStartPoint
);
560 if (!panDisplacement
) {
563 mLocalPanDisplacement
= *panDisplacement
;
568 PanGestureInput::UserMultipliedPanDisplacement() const
570 return ScreenPoint(mPanDisplacement
.x
* mUserDeltaMultiplierX
,
571 mPanDisplacement
.y
* mUserDeltaMultiplierY
);
575 PanGestureInput::UserMultipliedLocalPanDisplacement() const
577 return ParentLayerPoint(mLocalPanDisplacement
.x
* mUserDeltaMultiplierX
,
578 mLocalPanDisplacement
.y
* mUserDeltaMultiplierY
);
581 PinchGestureInput::PinchGestureInput()
582 : InputData(PINCHGESTURE_INPUT
)
586 PinchGestureInput::PinchGestureInput(PinchGestureType aType
, uint32_t aTime
,
587 TimeStamp aTimeStamp
,
588 const ParentLayerPoint
& aLocalFocusPoint
,
589 ParentLayerCoord aCurrentSpan
,
590 ParentLayerCoord aPreviousSpan
,
591 Modifiers aModifiers
)
592 : InputData(PINCHGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
594 , mLocalFocusPoint(aLocalFocusPoint
)
595 , mCurrentSpan(aCurrentSpan
)
596 , mPreviousSpan(aPreviousSpan
)
601 PinchGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
603 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mFocusPoint
);
607 mLocalFocusPoint
= *point
;
611 TapGestureInput::TapGestureInput()
612 : InputData(TAPGESTURE_INPUT
)
616 TapGestureInput::TapGestureInput(TapGestureType aType
, uint32_t aTime
,
617 TimeStamp aTimeStamp
,
618 const ScreenIntPoint
& aPoint
,
619 Modifiers aModifiers
)
620 : InputData(TAPGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
626 TapGestureInput::TapGestureInput(TapGestureType aType
, uint32_t aTime
,
627 TimeStamp aTimeStamp
,
628 const ParentLayerPoint
& aLocalPoint
,
629 Modifiers aModifiers
)
630 : InputData(TAPGESTURE_INPUT
, aTime
, aTimeStamp
, aModifiers
)
632 , mLocalPoint(aLocalPoint
)
637 TapGestureInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
639 Maybe
<ParentLayerIntPoint
> point
= UntransformBy(aTransform
, mPoint
);
643 mLocalPoint
= *point
;
647 ScrollWheelInput::ScrollWheelInput()
648 : InputData(SCROLLWHEEL_INPUT
)
649 , mHandledByAPZ(false)
650 , mLineOrPageDeltaX(0)
651 , mLineOrPageDeltaY(0)
652 , mScrollSeriesNumber(0)
653 , mUserDeltaMultiplierX(1.0)
654 , mUserDeltaMultiplierY(1.0)
655 , mMayHaveMomentum(false)
660 ScrollWheelInput::ScrollWheelInput(uint32_t aTime
, TimeStamp aTimeStamp
,
661 Modifiers aModifiers
, ScrollMode aScrollMode
,
662 ScrollDeltaType aDeltaType
,
663 const ScreenPoint
& aOrigin
, double aDeltaX
,
665 bool aAllowToOverrideSystemScrollSpeed
)
666 : InputData(SCROLLWHEEL_INPUT
, aTime
, aTimeStamp
, aModifiers
)
667 , mDeltaType(aDeltaType
)
668 , mScrollMode(aScrollMode
)
670 , mHandledByAPZ(false)
673 , mLineOrPageDeltaX(0)
674 , mLineOrPageDeltaY(0)
675 , mScrollSeriesNumber(0)
676 , mUserDeltaMultiplierX(1.0)
677 , mUserDeltaMultiplierY(1.0)
678 , mMayHaveMomentum(false)
680 , mAllowToOverrideSystemScrollSpeed(aAllowToOverrideSystemScrollSpeed
)
684 ScrollWheelInput::ScrollWheelInput(const WidgetWheelEvent
& aWheelEvent
)
685 : InputData(SCROLLWHEEL_INPUT
, aWheelEvent
.mTime
, aWheelEvent
.mTimeStamp
,
686 aWheelEvent
.mModifiers
)
687 , mDeltaType(DeltaTypeForDeltaMode(aWheelEvent
.mDeltaMode
))
688 , mScrollMode(SCROLLMODE_INSTANT
)
689 , mHandledByAPZ(aWheelEvent
.mFlags
.mHandledByAPZ
)
690 , mDeltaX(aWheelEvent
.mDeltaX
)
691 , mDeltaY(aWheelEvent
.mDeltaY
)
692 , mLineOrPageDeltaX(aWheelEvent
.mLineOrPageDeltaX
)
693 , mLineOrPageDeltaY(aWheelEvent
.mLineOrPageDeltaY
)
694 , mScrollSeriesNumber(0)
695 , mUserDeltaMultiplierX(1.0)
696 , mUserDeltaMultiplierY(1.0)
697 , mMayHaveMomentum(aWheelEvent
.mMayHaveMomentum
)
698 , mIsMomentum(aWheelEvent
.mIsMomentum
)
699 , mAllowToOverrideSystemScrollSpeed(
700 aWheelEvent
.mAllowToOverrideSystemScrollSpeed
)
703 ScreenPoint(ViewAs
<ScreenPixel
>(aWheelEvent
.mRefPoint
,
704 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
707 ScrollWheelInput::ScrollDeltaType
708 ScrollWheelInput::DeltaTypeForDeltaMode(uint32_t aDeltaMode
)
710 switch (aDeltaMode
) {
711 case nsIDOMWheelEvent::DOM_DELTA_LINE
:
712 return SCROLLDELTA_LINE
;
713 case nsIDOMWheelEvent::DOM_DELTA_PAGE
:
714 return SCROLLDELTA_PAGE
;
715 case nsIDOMWheelEvent::DOM_DELTA_PIXEL
:
716 return SCROLLDELTA_PIXEL
;
720 return SCROLLDELTA_LINE
;
724 ScrollWheelInput::DeltaModeForDeltaType(ScrollDeltaType aDeltaType
)
726 switch (aDeltaType
) {
727 case ScrollWheelInput::SCROLLDELTA_LINE
:
728 return nsIDOMWheelEvent::DOM_DELTA_LINE
;
729 case ScrollWheelInput::SCROLLDELTA_PAGE
:
730 return nsIDOMWheelEvent::DOM_DELTA_PAGE
;
731 case ScrollWheelInput::SCROLLDELTA_PIXEL
:
733 return nsIDOMWheelEvent::DOM_DELTA_PIXEL
;
737 nsIScrollableFrame::ScrollUnit
738 ScrollWheelInput::ScrollUnitForDeltaType(ScrollDeltaType aDeltaType
)
740 switch (aDeltaType
) {
741 case SCROLLDELTA_LINE
:
742 return nsIScrollableFrame::LINES
;
743 case SCROLLDELTA_PAGE
:
744 return nsIScrollableFrame::PAGES
;
745 case SCROLLDELTA_PIXEL
:
746 return nsIScrollableFrame::DEVICE_PIXELS
;
750 return nsIScrollableFrame::LINES
;
754 ScrollWheelInput::ToWidgetWheelEvent(nsIWidget
* aWidget
) const
756 WidgetWheelEvent
wheelEvent(true, eWheel
, aWidget
);
757 wheelEvent
.mModifiers
= this->modifiers
;
758 wheelEvent
.mTime
= mTime
;
759 wheelEvent
.mTimeStamp
= mTimeStamp
;
760 wheelEvent
.mRefPoint
=
761 RoundedToInt(ViewAs
<LayoutDevicePixel
>(mOrigin
,
762 PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent
));
763 wheelEvent
.buttons
= 0;
764 wheelEvent
.mDeltaMode
= DeltaModeForDeltaType(mDeltaType
);
765 wheelEvent
.mMayHaveMomentum
= mMayHaveMomentum
;
766 wheelEvent
.mIsMomentum
= mIsMomentum
;
767 wheelEvent
.mDeltaX
= mDeltaX
;
768 wheelEvent
.mDeltaY
= mDeltaY
;
769 wheelEvent
.mLineOrPageDeltaX
= mLineOrPageDeltaX
;
770 wheelEvent
.mLineOrPageDeltaY
= mLineOrPageDeltaY
;
771 wheelEvent
.mAllowToOverrideSystemScrollSpeed
=
772 mAllowToOverrideSystemScrollSpeed
;
773 wheelEvent
.mFlags
.mHandledByAPZ
= mHandledByAPZ
;
774 wheelEvent
.mFocusSequenceNumber
= mFocusSequenceNumber
;
779 ScrollWheelInput::TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
)
781 Maybe
<ParentLayerPoint
> point
= UntransformBy(aTransform
, mOrigin
);
785 mLocalOrigin
= *point
;
790 ScrollWheelInput::IsCustomizedByUserPrefs() const
792 return mUserDeltaMultiplierX
!= 1.0 ||
793 mUserDeltaMultiplierY
!= 1.0;
796 KeyboardInput::KeyboardInput(const WidgetKeyboardEvent
& aEvent
)
797 : InputData(KEYBOARD_INPUT
,
801 , mKeyCode(aEvent
.mKeyCode
)
802 , mCharCode(aEvent
.mCharCode
)
803 , mHandledByAPZ(false)
805 switch (aEvent
.mMessage
) {
807 mType
= KeyboardInput::KEY_PRESS
;
811 mType
= KeyboardInput::KEY_UP
;
815 mType
= KeyboardInput::KEY_DOWN
;
819 mType
= KeyboardInput::KEY_OTHER
;
823 aEvent
.GetShortcutKeyCandidates(mShortcutCandidates
);
826 KeyboardInput::KeyboardInput()
827 : InputData(KEYBOARD_INPUT
)
830 , mHandledByAPZ(false)
834 } // namespace mozilla