diff --git a/widget/InputData.cpp b/widget/InputData.cpp index c0dbce823a5..df64b05af78 100644 --- a/widget/InputData.cpp +++ b/widget/InputData.cpp @@ -225,6 +225,40 @@ MultiTouchInput::TransformToLocal(const gfx::Matrix4x4& aTransform) return true; } +bool +PanGestureInput::IsMomentum() const +{ + switch (mType) { + case PanGestureInput::PANGESTURE_MOMENTUMSTART: + case PanGestureInput::PANGESTURE_MOMENTUMPAN: + case PanGestureInput::PANGESTURE_MOMENTUMEND: + return true; + default: + return false; + } +} + +WidgetWheelEvent +PanGestureInput::ToWidgetWheelEvent(nsIWidget* aWidget) const +{ + WidgetWheelEvent wheelEvent(true, NS_WHEEL_WHEEL, aWidget); + wheelEvent.modifiers = this->modifiers; + wheelEvent.time = mTime; + wheelEvent.timeStamp = mTimeStamp; + wheelEvent.refPoint = + RoundedToInt(ViewAs(mPanStartPoint, + PixelCastJustification::LayoutDeviceToScreenForUntransformedEvent)); + wheelEvent.buttons = 0; + wheelEvent.deltaMode = nsIDOMWheelEvent::DOM_DELTA_PIXEL; + wheelEvent.isMomentum = IsMomentum(); + wheelEvent.lineOrPageDeltaX = mLineOrPageDeltaX; + wheelEvent.lineOrPageDeltaY = mLineOrPageDeltaY; + wheelEvent.deltaX = mPanDisplacement.x; + wheelEvent.deltaY = mPanDisplacement.y; + wheelEvent.mFlags.mHandledByAPZ = true; + return wheelEvent; +} + bool PanGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform) { @@ -264,6 +298,39 @@ TapGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform) return true; } +static uint32_t +DeltaModeForDeltaType(ScrollWheelInput::ScrollDeltaType aDeltaType) +{ + switch (aDeltaType) { + case ScrollWheelInput::SCROLLDELTA_LINE: + return nsIDOMWheelEvent::DOM_DELTA_LINE; + case ScrollWheelInput::SCROLLDELTA_PIXEL: + default: + return nsIDOMWheelEvent::DOM_DELTA_PIXEL; + } +} + +WidgetWheelEvent +ScrollWheelInput::ToWidgetWheelEvent(nsIWidget* aWidget) const +{ + WidgetWheelEvent wheelEvent(true, NS_WHEEL_WHEEL, aWidget); + wheelEvent.modifiers = this->modifiers; + wheelEvent.time = mTime; + wheelEvent.timeStamp = mTimeStamp; + wheelEvent.refPoint = + RoundedToInt(ViewAs(mOrigin, + PixelCastJustification::LayoutDeviceToScreenForUntransformedEvent)); + wheelEvent.buttons = 0; + wheelEvent.deltaMode = DeltaModeForDeltaType(mDeltaType); + wheelEvent.isMomentum = mIsMomentum; + wheelEvent.deltaX = mDeltaX; + wheelEvent.deltaY = mDeltaY; + wheelEvent.lineOrPageDeltaX = mLineOrPageDeltaX; + wheelEvent.lineOrPageDeltaY = mLineOrPageDeltaY; + wheelEvent.mFlags.mHandledByAPZ = true; + return wheelEvent; +} + bool ScrollWheelInput::TransformToLocal(const gfx::Matrix4x4& aTransform) { diff --git a/widget/InputData.h b/widget/InputData.h index 48a90f329d2..112c66d9fe0 100644 --- a/widget/InputData.h +++ b/widget/InputData.h @@ -307,10 +307,16 @@ public: : InputData(PANGESTURE_INPUT, aTime, aTimeStamp, aModifiers), mType(aType), mPanStartPoint(aPanStartPoint), - mPanDisplacement(aPanDisplacement) + mPanDisplacement(aPanDisplacement), + mLineOrPageDeltaX(0), + mLineOrPageDeltaY(0) { } + bool IsMomentum() const; + + WidgetWheelEvent ToWidgetWheelEvent(nsIWidget* aWidget) const; + bool TransformToLocal(const gfx::Matrix4x4& aTransform); PanGestureType mType; @@ -323,6 +329,10 @@ public: // coordinates of the APZC receiving the pan. These are set and used by APZ. ParentLayerPoint mLocalPanStartPoint; ParentLayerPoint mLocalPanDisplacement; + + // See lineOrPageDeltaX/Y on WidgetWheelEvent. + int32_t mLineOrPageDeltaX; + int32_t mLineOrPageDeltaY; }; /** @@ -503,9 +513,13 @@ public: mScrollMode(aScrollMode), mOrigin(aOrigin), mDeltaX(aDeltaX), - mDeltaY(aDeltaY) + mDeltaY(aDeltaY), + mLineOrPageDeltaX(0), + mLineOrPageDeltaY(0), + mIsMomentum(false) {} + WidgetWheelEvent ToWidgetWheelEvent(nsIWidget* aWidget) const; bool TransformToLocal(const gfx::Matrix4x4& aTransform); ScrollDeltaType mDeltaType; @@ -525,6 +539,12 @@ public: // The location of the scroll in local coordinates. This is set and used by // APZ. ParentLayerPoint mLocalOrigin; + + // See lineOrPageDeltaX/Y on WidgetWheelEvent. + int32_t mLineOrPageDeltaX; + int32_t mLineOrPageDeltaY; + + bool mIsMomentum; }; } // namespace mozilla