diff --git a/widget/InputData.cpp b/widget/InputData.cpp index 33a5e6c2be54..2c2e76fde086 100644 --- a/widget/InputData.cpp +++ b/widget/InputData.cpp @@ -28,6 +28,49 @@ already_AddRefed SingleTouchData::ToNewDOMTouch() const return touch.forget(); } +MouseInput::MouseInput(const WidgetMouseEventBase& aMouseEvent) + : InputData(MOUSE_INPUT, aMouseEvent.time, aMouseEvent.timeStamp, + aMouseEvent.modifiers) +{ + MOZ_ASSERT(NS_IsMainThread(), + "Can only copy from WidgetTouchEvent on main thread"); + + mButtonType = NONE; + + switch (aMouseEvent.button) { + case WidgetMouseEventBase::eLeftButton: + mButtonType = MouseInput::LEFT_BUTTON; + break; + case WidgetMouseEventBase::eMiddleButton: + mButtonType = MouseInput::MIDDLE_BUTTON; + break; + case WidgetMouseEventBase::eRightButton: + mButtonType = MouseInput::RIGHT_BUTTON; + break; + } + + switch (aMouseEvent.mMessage) { + case eMouseMove: + mType = MOUSE_MOVE; + break; + case eMouseUp: + mType = MOUSE_UP; + break; + case eMouseDown: + mType = MOUSE_DOWN; + break; + case eDragStart: + mType = MOUSE_DRAG_START; + break; + case eDragEnd: + mType = MOUSE_DRAG_END; + break; + default: + MOZ_ASSERT_UNREACHABLE("Mouse event type not supported"); + break; + } +} + MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent) : InputData(MULTITOUCH_INPUT, aTouchEvent.time, aTouchEvent.timeStamp, aTouchEvent.modifiers) diff --git a/widget/InputData.h b/widget/InputData.h index 637ffadacbed..c6fa6d093f35 100644 --- a/widget/InputData.h +++ b/widget/InputData.h @@ -30,6 +30,7 @@ class Matrix4x4; enum InputType { MULTITOUCH_INPUT, + MOUSE_INPUT, PANGESTURE_INPUT, PINCHGESTURE_INPUT, TAPGESTURE_INPUT, @@ -37,6 +38,7 @@ enum InputType }; class MultiTouchInput; +class MouseInput; class PanGestureInput; class PinchGestureInput; class TapGestureInput; @@ -76,6 +78,7 @@ public: Modifiers modifiers; INPUTDATA_AS_CHILD_TYPE(MultiTouchInput, MULTITOUCH_INPUT) + INPUTDATA_AS_CHILD_TYPE(MouseInput, MOUSE_INPUT) INPUTDATA_AS_CHILD_TYPE(PanGestureInput, PANGESTURE_INPUT) INPUTDATA_AS_CHILD_TYPE(PinchGestureInput, PINCHGESTURE_INPUT) INPUTDATA_AS_CHILD_TYPE(TapGestureInput, TAPGESTURE_INPUT) @@ -245,6 +248,47 @@ public: nsTArray mTouches; }; +class MouseInput : public InputData +{ +public: + enum MouseType + { + MOUSE_MOVE, + MOUSE_DOWN, + MOUSE_UP, + MOUSE_DRAG_START, + MOUSE_DRAG_END, + }; + + enum ButtonType + { + LEFT_BUTTON, + MIDDLE_BUTTON, + RIGHT_BUTTON, + NONE + }; + + MouseInput(MouseType aType, ButtonType aButtonType, uint32_t aTime, + TimeStamp aTimeStamp, Modifiers aModifiers) + : InputData(MOUSE_INPUT, aTime, aTimeStamp, aModifiers) + , mType(aType) + , mButtonType(aButtonType) + {} + + MouseInput() + : InputData(MOUSE_INPUT) + {} + + explicit MouseInput(const WidgetMouseEventBase& aMouseEvent); + + bool IsLeftButton() const { return mButtonType == LEFT_BUTTON; } + + MouseType mType; + ButtonType mButtonType; + ScreenPoint mOrigin; + ParentLayerPoint mLocalOrigin; +}; + /** * Encapsulation class for pan events, can be used off-main-thread. * These events are currently only used for scrolling on desktop.