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/. */
13 #include "mozilla/ScrollTypes.h"
14 #include "mozilla/DefineEnum.h"
15 #include "mozilla/EventForwards.h"
16 #include "mozilla/TimeStamp.h"
17 #include "mozilla/WheelHandlingHelper.h" // for WheelDeltaAdjustmentStrategy
18 #include "mozilla/gfx/MatrixFwd.h"
19 #include "mozilla/layers/APZPublicUtils.h"
20 #include "mozilla/layers/KeyboardScrollAction.h"
21 #include "mozilla/TextEvents.h"
24 struct already_AddRefed
;
30 class APZInputBridgeChild
;
31 class PAPZInputBridgeParent
;
51 class MultiTouchInput
;
53 class PanGestureInput
;
54 class PinchGestureInput
;
55 class TapGestureInput
;
56 class ScrollWheelInput
;
59 // This looks unnecessary now, but as we add more and more classes that derive
60 // from InputType (eventually probably almost as many as *Events.h has), it
61 // will be more and more clear what's going on with a macro that shortens the
62 // definition of the RTTI functions.
63 #define INPUTDATA_AS_CHILD_TYPE(type, enumID) \
64 const type& As##type() const { \
65 MOZ_ASSERT(mInputType == enumID, "Invalid cast of InputData."); \
66 return (const type&)*this; \
69 MOZ_ASSERT(mInputType == enumID, "Invalid cast of InputData."); \
70 return (type&)*this; \
73 /** Base input data class. Should never be instantiated. */
76 // Warning, this class is serialized and sent over IPC. Any change to its
77 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
79 // Time in milliseconds that this data is relevant to. This only really
80 // matters when this data is used as an event. We use uint32_t instead of
81 // TimeStamp because it is easier to convert from WidgetInputEvent. The time
82 // is platform-specific but it in the case of B2G and Fennec it is since
85 // Set in parallel to mTime until we determine it is safe to drop
86 // platform-specific event times (see bug 77992).
88 // The sequence number of the last potentially focus changing event handled
89 // by APZ. This is used to track when that event has been processed by
90 // content, and focus can be reconfirmed for async keyboard scrolling.
91 uint64_t mFocusSequenceNumber
;
93 // The LayersId of the content process that the corresponding WidgetEvent
94 // should be dispatched to.
95 layers::LayersId mLayersId
;
99 INPUTDATA_AS_CHILD_TYPE(MultiTouchInput
, MULTITOUCH_INPUT
)
100 INPUTDATA_AS_CHILD_TYPE(MouseInput
, MOUSE_INPUT
)
101 INPUTDATA_AS_CHILD_TYPE(PanGestureInput
, PANGESTURE_INPUT
)
102 INPUTDATA_AS_CHILD_TYPE(PinchGestureInput
, PINCHGESTURE_INPUT
)
103 INPUTDATA_AS_CHILD_TYPE(TapGestureInput
, TAPGESTURE_INPUT
)
104 INPUTDATA_AS_CHILD_TYPE(ScrollWheelInput
, SCROLLWHEEL_INPUT
)
105 INPUTDATA_AS_CHILD_TYPE(KeyboardInput
, KEYBOARD_INPUT
)
107 virtual ~InputData();
108 explicit InputData(InputType aInputType
);
111 InputData(InputType aInputType
, uint32_t aTime
, TimeStamp aTimeStamp
,
112 Modifiers aModifiers
);
116 * Data container for a single touch input. Similar to dom::Touch, but used in
117 * off-main-thread situations. This is more for just storing touch data, whereas
118 * dom::Touch is more useful for dispatching through the DOM (which can only
119 * happen on the main thread). dom::Touch also bears the problem of storing
120 * pointers to nsIWidget instances which can only be used on the main thread,
121 * so if instead we used dom::Touch and ever set these pointers
122 * off-main-thread, Bad Things Can Happen(tm).
124 * Note that this doesn't inherit from InputData because this itself is not an
125 * event. It is only a container/struct that should have any number of instances
126 * within a MultiTouchInput.
128 * fixme/bug 775746: Make dom::Touch inherit from this class.
130 class SingleTouchData
{
132 // Construct a SingleTouchData from a Screen point.
133 // mLocalScreenPoint remains (0,0) unless it's set later.
134 SingleTouchData(int32_t aIdentifier
, ScreenIntPoint aScreenPoint
,
135 ScreenSize aRadius
, float aRotationAngle
, float aForce
);
137 // Construct a SingleTouchData from a ParentLayer point.
138 // mScreenPoint remains (0,0) unless it's set later.
139 // Note: if APZ starts using the radius for anything, we should add a local
140 // version of that too, and have this constructor take it as a
142 SingleTouchData(int32_t aIdentifier
, ParentLayerPoint aLocalScreenPoint
,
143 ScreenSize aRadius
, float aRotationAngle
, float aForce
);
147 already_AddRefed
<dom::Touch
> ToNewDOMTouch() const;
149 // Warning, this class is serialized and sent over IPC. Any change to its
150 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
152 // Historical data of this touch, which was coalesced into this event.
153 // Touch event coalescing can happen at the system level when the touch
154 // screen's sampling frequency is higher than the vsync rate, or when the
155 // UI thread is busy. When multiple "samples" of touch data are coalesced into
156 // one touch event, the touch event's regular position information is the
157 // information from the last sample. And the previous, "coalesced-away"
158 // samples are stored in mHistoricalData.
160 struct HistoricalTouchData
{
161 // The timestamp at which the information in this "sample" was originally
163 TimeStamp mTimeStamp
;
165 // The touch data of this historical sample.
166 ScreenIntPoint mScreenPoint
;
167 ParentLayerPoint mLocalScreenPoint
;
169 float mRotationAngle
= 0.0f
;
172 CopyableTArray
<HistoricalTouchData
> mHistoricalData
;
174 // A unique number assigned to each SingleTouchData within a MultiTouchInput
175 // so that they can be easily distinguished when handling a touch
179 // Point on the screen that the touch hit, in device pixels. They are
180 // coordinates on the screen.
181 ScreenIntPoint mScreenPoint
;
183 // |mScreenPoint| transformed to the local coordinates of the APZC targeted
184 // by the hit. This is set and used by APZ.
185 ParentLayerPoint mLocalScreenPoint
;
187 // Radius that the touch covers, i.e. if you're using your thumb it will
188 // probably be larger than using your pinky, even with the same force.
189 // Radius can be different along x and y. For example, if you press down with
190 // your entire finger vertically, the y radius will be much larger than the x
194 float mRotationAngle
;
196 // How hard the screen is being pressed.
201 * Similar to WidgetTouchEvent, but for use off-main-thread. Also only stores a
202 * screen touch point instead of the many different coordinate spaces
203 * WidgetTouchEvent stores its touch point in. This includes a way to initialize
204 * itself from a WidgetTouchEvent by copying all relevant data over. Note that
205 * this copying from WidgetTouchEvent functionality can only be used on the main
208 * Stores an array of SingleTouchData.
210 class MultiTouchInput
: public InputData
{
213 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
222 MultiTouchInput(MultiTouchType aType
, uint32_t aTime
, TimeStamp aTimeStamp
,
223 Modifiers aModifiers
);
225 MultiTouchInput(MultiTouchInput
&&) = default;
226 MultiTouchInput(const MultiTouchInput
& aOther
);
227 explicit MultiTouchInput(const WidgetTouchEvent
& aTouchEvent
);
229 MultiTouchInput
& operator=(MultiTouchInput
&&) = default;
230 MultiTouchInput
& operator=(const MultiTouchInput
&) = default;
232 void Translate(const ScreenPoint
& aTranslation
);
234 WidgetTouchEvent
ToWidgetTouchEvent(nsIWidget
* aWidget
) const;
236 // Return the index into mTouches of the SingleTouchData with the given
237 // identifier, or -1 if there is no such SingleTouchData.
238 int32_t IndexOfTouch(int32_t aTouchIdentifier
);
240 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
242 // Warning, this class is serialized and sent over IPC. Any change to its
243 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
244 MultiTouchType mType
;
245 CopyableTArray
<SingleTouchData
> mTouches
;
246 // The screen offset of the root widget. This can be changing along with
247 // the touch interaction, so we sstore it in the event.
248 ExternalPoint mScreenOffset
;
252 class MouseInput
: public InputData
{
254 friend mozilla::layers::APZInputBridgeChild
;
255 friend mozilla::layers::PAPZInputBridgeParent
;
261 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
274 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
283 MouseInput(MouseType aType
, ButtonType aButtonType
, uint16_t aInputSource
,
284 int16_t aButtons
, const ScreenPoint
& aPoint
, uint32_t aTime
,
285 TimeStamp aTimeStamp
, Modifiers aModifiers
);
286 explicit MouseInput(const WidgetMouseEventBase
& aMouseEvent
);
288 bool IsLeftButton() const;
290 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
291 WidgetMouseEvent
ToWidgetEvent(nsIWidget
* aWidget
) const;
293 // Warning, this class is serialized and sent over IPC. Any change to its
294 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
296 ButtonType mButtonType
;
297 uint16_t mInputSource
;
300 ParentLayerPoint mLocalOrigin
;
305 * Encapsulation class for pan events, can be used off-main-thread.
306 * These events are currently only used for scrolling on desktop.
308 class PanGestureInput
: public InputData
{
310 friend mozilla::layers::APZInputBridgeChild
;
311 friend mozilla::layers::PAPZInputBridgeParent
;
317 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
319 // MayStart: Dispatched before any actual panning has occurred but when a
320 // pan gesture is probably about to start, for example when the user
321 // starts touching the touchpad. Should interrupt any ongoing APZ
322 // animation and can be used to trigger scrollability indicators (e.g.
323 // flashing overlay scrollbars).
326 // Cancelled: Dispatched after MayStart when no pan gesture is going to
327 // happen after all, for example when the user lifts their fingers from a
328 // touchpad without having done any scrolling.
329 PANGESTURE_CANCELLED
,
331 // Start: A pan gesture is starting.
332 // For devices that do not support the MayStart event type, this event can
333 // be used to interrupt ongoing APZ animations.
336 // Pan: The actual pan motion by mPanDisplacement.
339 // End: The pan gesture has ended, for example because the user has lifted
340 // their fingers from a touchpad after scrolling.
341 // Any potential momentum events fire after this event.
344 // The following momentum event types are used in order to control the pan
345 // momentum animation. Using these instead of our own animation ensures
346 // that the animation curve is OS native and that the animation stops
347 // reliably if it is cancelled by the user.
349 // MomentumStart: Dispatched between the End event of the actual
350 // user-controlled pan, and the first MomentumPan event of the momentum
352 PANGESTURE_MOMENTUMSTART
,
354 // MomentumPan: The actual momentum motion by mPanDisplacement.
355 PANGESTURE_MOMENTUMPAN
,
357 // MomentumEnd: The momentum animation has ended, for example because the
358 // momentum velocity has gone below the stopping threshold, or because the
359 // user has stopped the animation by putting their fingers on a touchpad.
360 PANGESTURE_MOMENTUMEND
363 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
365 // There are three kinds of scroll delta modes in Gecko: "page", "line"
366 // and "pixel". Touchpad pan gestures only support "page" and "pixel".
368 // NOTE: PANDELTA_PAGE currently replicates Gtk behavior
369 // (see AsyncPanZoomController::OnPan).
375 PanGestureInput(PanGestureType aType
, uint32_t aTime
, TimeStamp aTimeStamp
,
376 const ScreenPoint
& aPanStartPoint
,
377 const ScreenPoint
& aPanDisplacement
, Modifiers aModifiers
);
379 bool IsMomentum() const;
381 WidgetWheelEvent
ToWidgetEvent(nsIWidget
* aWidget
) const;
383 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
385 ScreenPoint
UserMultipliedPanDisplacement() const;
386 ParentLayerPoint
UserMultipliedLocalPanDisplacement() const;
388 static gfx::IntPoint
GetIntegerDeltaForEvent(bool aIsStart
, float x
, float y
);
390 // Warning, this class is serialized and sent over IPC. Any change to its
391 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
392 PanGestureType mType
;
393 ScreenPoint mPanStartPoint
;
395 // The delta. This can be non-zero on any type of event.
396 ScreenPoint mPanDisplacement
;
398 // Versions of |mPanStartPoint| and |mPanDisplacement| in the local
399 // coordinates of the APZC receiving the pan. These are set and used by APZ.
400 ParentLayerPoint mLocalPanStartPoint
;
401 ParentLayerPoint mLocalPanDisplacement
;
403 // See lineOrPageDeltaX/Y on WidgetWheelEvent.
404 int32_t mLineOrPageDeltaX
;
405 int32_t mLineOrPageDeltaY
;
407 // User-set delta multipliers.
408 double mUserDeltaMultiplierX
;
409 double mUserDeltaMultiplierY
;
411 PanDeltaType mDeltaType
= PANDELTA_PIXEL
;
413 bool mHandledByAPZ
: 1;
415 // true if this is a PANGESTURE_END event that will be followed by a
416 // PANGESTURE_MOMENTUMSTART event.
417 bool mFollowedByMomentum
: 1;
419 // If this is true, and this event started a new input block that couldn't
420 // find a scrollable target which is scrollable in the horizontal component
421 // of the scroll start direction, then this input block needs to be put on
422 // hold until a content response has arrived, even if the block has a
424 // This is used by events that can result in a swipe instead of a scroll.
425 bool mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection
: 1;
427 // This is used by APZ to communicate to the macOS widget code whether
428 // the overscroll-behavior of the scroll frame handling this swipe allows
429 // non-local overscroll behaviors in the horizontal direction (such as
430 // swipe navigation).
431 bool mOverscrollBehaviorAllowsSwipe
: 1;
433 // true if APZ should do a fling animation after this pan ends, like
434 // it would with touchscreens. (For platforms that don't emit momentum
436 bool mSimulateMomentum
: 1;
438 void SetHandledByAPZ(bool aHandled
) { mHandledByAPZ
= aHandled
; }
439 void SetFollowedByMomentum(bool aFollowed
) {
440 mFollowedByMomentum
= aFollowed
;
442 void SetRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(
444 mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection
=
447 void SetOverscrollBehaviorAllowsSwipe(bool aAllows
) {
448 mOverscrollBehaviorAllowsSwipe
= aAllows
;
450 void SetSimulateMomentum(bool aSimulate
) { mSimulateMomentum
= aSimulate
; }
454 * Encapsulation class for pinch events. In general, these will be generated by
455 * a gesture listener by looking at SingleTouchData/MultiTouchInput instances
456 * and determining whether or not the user was trying to do a gesture.
458 class PinchGestureInput
: public InputData
{
460 friend mozilla::layers::APZInputBridgeChild
;
461 friend mozilla::layers::PAPZInputBridgeParent
;
467 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
471 // The FINGERLIFTED state is used when a touch-based pinch gesture is
472 // terminated by lifting one of the two fingers. The position of the
473 // finger that's still down is populated as the focus point.
474 PINCHGESTURE_FINGERLIFTED
,
475 // The END state is used when the pinch gesture is completely terminated.
476 // In this state, the focus point should not be relied upon for having
481 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
482 PinchGestureSource
, (
483 UNKNOWN
, // Default initialization value. Should never actually be used.
484 TOUCH
, // From two-finger pinch gesture
485 ONE_TOUCH
, // From one-finger pinch gesture
486 TRACKPAD
, // From trackpad pinch gesture
487 MOUSEWHEEL
// Synthesized from modifier+mousewheel
489 // If adding more items here, increase n_values for the
490 // APZ_ZOOM_PINCHSOURCE Telemetry metric.
494 // Construct a pinch gesture from a Screen point.
495 PinchGestureInput(PinchGestureType aType
, PinchGestureSource aSource
,
496 uint32_t aTime
, TimeStamp aTimeStamp
,
497 const ExternalPoint
& aScreenOffset
,
498 const ScreenPoint
& aFocusPoint
, ScreenCoord aCurrentSpan
,
499 ScreenCoord aPreviousSpan
, Modifiers aModifiers
);
501 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
503 WidgetWheelEvent
ToWidgetEvent(nsIWidget
* aWidget
) const;
505 double ComputeDeltaY(nsIWidget
* aWidget
) const;
507 static gfx::IntPoint
GetIntegerDeltaForEvent(bool aIsStart
, float x
, float y
);
509 // Warning, this class is serialized and sent over IPC. Any change to its
510 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
511 PinchGestureType mType
;
513 // Some indication of the input device that generated this pinch gesture.
514 PinchGestureSource mSource
;
516 // Center point of the pinch gesture. That is, if there are two fingers on the
517 // screen, it is their midpoint. In the case of more than two fingers, the
518 // point is implementation-specific, but can for example be the midpoint
519 // between the very first and very last touch. This is in device pixels and
520 // are the coordinates on the screen of this midpoint.
521 // For PINCHGESTURE_END events, this may hold the last known focus point or
522 // just be empty; in any case for END events it should not be relied upon.
523 // For PINCHGESTURE_FINGERLIFTED events, this holds the point of the finger
524 // that is still down.
525 ScreenPoint mFocusPoint
;
527 // The screen offset of the root widget. This can be changing along with
528 // the touch interaction, so we sstore it in the event.
529 ExternalPoint mScreenOffset
;
531 // |mFocusPoint| transformed to the local coordinates of the APZC targeted
532 // by the hit. This is set and used by APZ.
533 ParentLayerPoint mLocalFocusPoint
;
535 // The distance between the touches responsible for the pinch gesture.
536 ScreenCoord mCurrentSpan
;
538 // The previous |mCurrentSpan| in the PinchGestureInput preceding this one.
539 // This is only really relevant during a PINCHGESTURE_SCALE because when it is
540 // of this type then there must have been a history of spans.
541 ScreenCoord mPreviousSpan
;
543 // We accumulate (via GetIntegerDeltaForEvent) the deltaY that would be
544 // computed by ToWidgetEvent, and then whenever we get a whole integer
545 // value we put it in mLineOrPageDeltaY. Since we only ever use deltaY we
546 // don't need a mLineOrPageDeltaX. This field is used to dispatch legacy mouse
547 // events which are only dispatched when the corresponding field on
548 // WidgetWheelEvent is non-zero.
549 int32_t mLineOrPageDeltaY
;
555 * Encapsulation class for tap events. In general, these will be generated by
556 * a gesture listener by looking at SingleTouchData/MultiTouchInput instances
557 * and determining whether or not the user was trying to do a gesture.
559 class TapGestureInput
: public InputData
{
561 friend mozilla::layers::APZInputBridgeChild
;
562 friend mozilla::layers::PAPZInputBridgeParent
;
568 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
573 TAPGESTURE_CONFIRMED
,
575 TAPGESTURE_SECOND
, // See GeckoContentController::TapType::eSecondTap
580 // Construct a tap gesture from a Screen point.
581 // mLocalPoint remains (0,0) unless it's set later.
582 TapGestureInput(TapGestureType aType
, uint32_t aTime
, TimeStamp aTimeStamp
,
583 const ScreenIntPoint
& aPoint
, Modifiers aModifiers
);
585 // Construct a tap gesture from a ParentLayer point.
586 // mPoint remains (0,0) unless it's set later.
587 TapGestureInput(TapGestureType aType
, uint32_t aTime
, TimeStamp aTimeStamp
,
588 const ParentLayerPoint
& aLocalPoint
, Modifiers aModifiers
);
590 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
592 WidgetSimpleGestureEvent
ToWidgetEvent(nsIWidget
* aWidget
) const;
594 // Warning, this class is serialized and sent over IPC. Any change to its
595 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
596 TapGestureType mType
;
598 // The location of the tap in screen pixels.
599 ScreenIntPoint mPoint
;
601 // The location of the tap in the local coordinates of the APZC receiving it.
602 // This is set and used by APZ.
603 ParentLayerPoint mLocalPoint
;
606 // Encapsulation class for scroll-wheel events. These are generated by mice
607 // with physical scroll wheels, and on Windows by most touchpads when using
609 class ScrollWheelInput
: public InputData
{
611 friend mozilla::layers::APZInputBridgeChild
;
612 friend mozilla::layers::PAPZInputBridgeParent
;
614 typedef mozilla::layers::APZWheelAction APZWheelAction
;
620 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
622 // There are three kinds of scroll delta modes in Gecko: "page", "line"
629 MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
637 ScrollWheelInput(uint32_t aTime
, TimeStamp aTimeStamp
, Modifiers aModifiers
,
638 ScrollMode aScrollMode
, ScrollDeltaType aDeltaType
,
639 const ScreenPoint
& aOrigin
, double aDeltaX
, double aDeltaY
,
640 bool aAllowToOverrideSystemScrollSpeed
,
641 WheelDeltaAdjustmentStrategy aWheelDeltaAdjustmentStrategy
);
642 explicit ScrollWheelInput(const WidgetWheelEvent
& aEvent
);
644 static ScrollDeltaType
DeltaTypeForDeltaMode(uint32_t aDeltaMode
);
645 static uint32_t DeltaModeForDeltaType(ScrollDeltaType aDeltaType
);
646 static mozilla::ScrollUnit
ScrollUnitForDeltaType(ScrollDeltaType aDeltaType
);
648 WidgetWheelEvent
ToWidgetEvent(nsIWidget
* aWidget
) const;
649 bool TransformToLocal(const ScreenToParentLayerMatrix4x4
& aTransform
);
651 bool IsCustomizedByUserPrefs() const;
653 // The following two functions are for auto-dir scrolling. For detailed
654 // information on auto-dir, @see mozilla::WheelDeltaAdjustmentStrategy
655 bool IsAutoDir() const {
656 switch (mWheelDeltaAdjustmentStrategy
) {
657 case WheelDeltaAdjustmentStrategy::eAutoDir
:
658 case WheelDeltaAdjustmentStrategy::eAutoDirWithRootHonour
:
661 // Prevent compilation errors generated by -Werror=switch
666 // Indicates which element this scroll honours if it's an auto-dir scroll.
667 // If true, honour the root element; otherwise, honour the currently scrolling
669 // Note that if IsAutoDir() returns false, then this function also returns
670 // false, but false in this case is meaningless as IsAutoDir() indicates it's
671 // not an auto-dir scroll.
672 // For detailed information on auto-dir,
673 // @see mozilla::WheelDeltaAdjustmentStrategy
674 bool HonoursRoot() const {
675 return WheelDeltaAdjustmentStrategy::eAutoDirWithRootHonour
==
676 mWheelDeltaAdjustmentStrategy
;
679 // Warning, this class is serialized and sent over IPC. Any change to its
680 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
681 ScrollDeltaType mDeltaType
;
682 ScrollMode mScrollMode
;
687 // Deltas are in units corresponding to the delta type. For line deltas, they
688 // are the number of line units to scroll. The number of device pixels for a
689 // horizontal and vertical line unit are in FrameMetrics::mLineScrollAmount.
690 // For pixel deltas, these values are in ScreenCoords.
692 // The horizontal (X) delta is > 0 for scrolling right and < 0 for scrolling
693 // left. The vertical (Y) delta is < 0 for scrolling up and > 0 for
698 // The location of the scroll in local coordinates. This is set and used by
700 ParentLayerPoint mLocalOrigin
;
702 // See lineOrPageDeltaX/Y on WidgetWheelEvent.
703 int32_t mLineOrPageDeltaX
;
704 int32_t mLineOrPageDeltaY
;
706 // Indicates the order in which this event was added to a transaction. The
707 // first event is 1; if not a member of a transaction, this is 0.
708 uint32_t mScrollSeriesNumber
;
710 // User-set delta multipliers.
711 double mUserDeltaMultiplierX
;
712 double mUserDeltaMultiplierY
;
714 bool mMayHaveMomentum
;
716 bool mAllowToOverrideSystemScrollSpeed
;
718 // Sometimes a wheel event input's wheel delta should be adjusted. This member
719 // specifies how to adjust the wheel delta.
720 WheelDeltaAdjustmentStrategy mWheelDeltaAdjustmentStrategy
;
722 APZWheelAction mAPZAction
;
725 class KeyboardInput
: public InputData
{
727 typedef mozilla::layers::KeyboardScrollAction KeyboardScrollAction
;
729 // Note that if you change the first member in this enum(I.e. KEY_DOWN) to one
730 // other member, don't forget to update the minimum value in
731 // ContiguousEnumSerializer for KeyboardEventType in widget/nsGUIEventIPC
733 enum KeyboardEventType
{
737 // Any other key event such as eKeyDownOnPlugin
740 // Used as an upper bound for ContiguousEnumSerializer
744 explicit KeyboardInput(const WidgetKeyboardEvent
& aEvent
);
746 // Warning, this class is serialized and sent over IPC. Any change to its
747 // fields must be reflected in its ParamTraits<>, in nsGUIEventIPC.h
749 KeyboardEventType mType
;
752 CopyableTArray
<ShortcutKeyCandidate
> mShortcutCandidates
;
756 // The scroll action to perform on a layer for this keyboard input. This is
757 // only used in APZ and is NOT serialized over IPC.
758 KeyboardScrollAction mAction
;
761 friend mozilla::layers::APZInputBridgeChild
;
762 friend mozilla::layers::PAPZInputBridgeParent
;
767 } // namespace mozilla
769 #endif // InputData_h__