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/. */
6 #ifndef mozilla_TouchEvents_h__
7 #define mozilla_TouchEvents_h__
11 #include "mozilla/dom/Touch.h"
12 #include "mozilla/MouseEvents.h"
13 #include "mozilla/RefPtr.h"
18 /******************************************************************************
19 * mozilla::WidgetGestureNotifyEvent
21 * This event is the first event generated when the user touches
22 * the screen with a finger, and it's meant to decide what kind
23 * of action we'll use for that touch interaction.
25 * The event is dispatched to the layout and based on what is underneath
26 * the initial contact point it's then decided if we should pan
27 * (finger scrolling) or drag the target element.
28 ******************************************************************************/
30 class WidgetGestureNotifyEvent
: public WidgetGUIEvent
{
32 virtual WidgetGestureNotifyEvent
* AsGestureNotifyEvent() override
{
36 WidgetGestureNotifyEvent(bool aIsTrusted
, EventMessage aMessage
,
38 const WidgetEventTime
* aTime
= nullptr)
39 : WidgetGUIEvent(aIsTrusted
, aMessage
, aWidget
, eGestureNotifyEventClass
,
41 mPanDirection(ePanNone
),
42 mDisplayPanFeedback(false) {}
44 virtual WidgetEvent
* Duplicate() const override
{
45 // XXX Looks like this event is handled only in PostHandleEvent() of
46 // EventStateManager. Therefore, it might be possible to handle this
47 // in PreHandleEvent() and not to dispatch as a DOM event into the DOM
48 // tree like ContentQueryEvent. Then, this event doesn't need to
49 // support Duplicate().
50 MOZ_ASSERT(mClass
== eGestureNotifyEventClass
,
51 "Duplicate() must be overridden by sub class");
52 // Not copying widget, it is a weak reference.
53 WidgetGestureNotifyEvent
* result
=
54 new WidgetGestureNotifyEvent(false, mMessage
, nullptr, this);
55 result
->AssignGestureNotifyEventData(*this, true);
56 result
->mFlags
= mFlags
;
60 typedef int8_t PanDirectionType
;
61 enum PanDirection
: PanDirectionType
{
68 PanDirection mPanDirection
;
69 bool mDisplayPanFeedback
;
71 void AssignGestureNotifyEventData(const WidgetGestureNotifyEvent
& aEvent
,
73 AssignGUIEventData(aEvent
, aCopyTargets
);
75 mPanDirection
= aEvent
.mPanDirection
;
76 mDisplayPanFeedback
= aEvent
.mDisplayPanFeedback
;
80 /******************************************************************************
81 * mozilla::WidgetSimpleGestureEvent
82 ******************************************************************************/
84 class WidgetSimpleGestureEvent
: public WidgetMouseEventBase
{
86 virtual WidgetSimpleGestureEvent
* AsSimpleGestureEvent() override
{
90 WidgetSimpleGestureEvent(bool aIsTrusted
, EventMessage aMessage
,
92 const WidgetEventTime
* aTime
= nullptr)
93 : WidgetMouseEventBase(aIsTrusted
, aMessage
, aWidget
,
94 eSimpleGestureEventClass
, aTime
),
95 mAllowedDirections(0),
100 WidgetSimpleGestureEvent(const WidgetSimpleGestureEvent
& aOther
)
101 : WidgetMouseEventBase(aOther
.IsTrusted(), aOther
.mMessage
,
102 aOther
.mWidget
, eSimpleGestureEventClass
),
103 mAllowedDirections(aOther
.mAllowedDirections
),
104 mDirection(aOther
.mDirection
),
106 mDelta(aOther
.mDelta
) {}
108 virtual WidgetEvent
* Duplicate() const override
{
109 MOZ_ASSERT(mClass
== eSimpleGestureEventClass
,
110 "Duplicate() must be overridden by sub class");
111 // Not copying widget, it is a weak reference.
112 WidgetSimpleGestureEvent
* result
=
113 new WidgetSimpleGestureEvent(false, mMessage
, nullptr, this);
114 result
->AssignSimpleGestureEventData(*this, true);
115 result
->mFlags
= mFlags
;
119 // See SimpleGestureEvent.webidl for values
120 uint32_t mAllowedDirections
;
121 // See SimpleGestureEvent.webidl for values
123 // The number of taps for tap events
124 uint32_t mClickCount
;
125 // Delta for magnify and rotate events
128 // XXX Not tested by test_assign_event_data.html
129 void AssignSimpleGestureEventData(const WidgetSimpleGestureEvent
& aEvent
,
131 AssignMouseEventBaseData(aEvent
, aCopyTargets
);
133 // mAllowedDirections isn't copied
134 mDirection
= aEvent
.mDirection
;
135 mDelta
= aEvent
.mDelta
;
136 mClickCount
= aEvent
.mClickCount
;
140 /******************************************************************************
141 * mozilla::WidgetTouchEvent
142 ******************************************************************************/
144 class WidgetTouchEvent final
: public WidgetInputEvent
{
146 typedef nsTArray
<RefPtr
<mozilla::dom::Touch
>> TouchArray
;
147 typedef AutoTArray
<RefPtr
<mozilla::dom::Touch
>, 10> AutoTouchArray
;
148 typedef AutoTouchArray::base_type TouchArrayBase
;
150 WidgetTouchEvent
* AsTouchEvent() override
{ return this; }
152 MOZ_COUNTED_DEFAULT_CTOR(WidgetTouchEvent
)
154 WidgetTouchEvent(const WidgetTouchEvent
& aOther
)
155 : WidgetInputEvent(aOther
.IsTrusted(), aOther
.mMessage
, aOther
.mWidget
,
157 MOZ_COUNT_CTOR(WidgetTouchEvent
);
158 mModifiers
= aOther
.mModifiers
;
159 mTimeStamp
= aOther
.mTimeStamp
;
160 mTouches
.AppendElements(aOther
.mTouches
);
161 mInputSource
= aOther
.mInputSource
;
162 mButton
= aOther
.mButton
;
163 mButtons
= aOther
.mButtons
;
164 mFlags
.mCancelable
= mMessage
!= eTouchCancel
;
165 mFlags
.mHandledByAPZ
= aOther
.mFlags
.mHandledByAPZ
;
168 WidgetTouchEvent(WidgetTouchEvent
&& aOther
)
169 : WidgetInputEvent(std::move(aOther
)) {
170 MOZ_COUNT_CTOR(WidgetTouchEvent
);
171 mModifiers
= aOther
.mModifiers
;
172 mTimeStamp
= aOther
.mTimeStamp
;
173 mTouches
= std::move(aOther
.mTouches
);
174 mInputSource
= aOther
.mInputSource
;
175 mButton
= aOther
.mButton
;
176 mButtons
= aOther
.mButtons
;
177 mFlags
= aOther
.mFlags
;
180 WidgetTouchEvent
& operator=(WidgetTouchEvent
&&) = default;
182 WidgetTouchEvent(bool aIsTrusted
, EventMessage aMessage
, nsIWidget
* aWidget
,
183 const WidgetEventTime
* aTime
= nullptr)
184 : WidgetInputEvent(aIsTrusted
, aMessage
, aWidget
, eTouchEventClass
,
186 MOZ_COUNT_CTOR(WidgetTouchEvent
);
187 mFlags
.mCancelable
= mMessage
!= eTouchCancel
;
190 MOZ_COUNTED_DTOR_OVERRIDE(WidgetTouchEvent
)
192 WidgetEvent
* Duplicate() const override
{
193 MOZ_ASSERT(mClass
== eTouchEventClass
,
194 "Duplicate() must be overridden by sub class");
195 // Not copying widget, it is a weak reference.
196 WidgetTouchEvent
* result
=
197 new WidgetTouchEvent(false, mMessage
, nullptr, this);
198 result
->AssignTouchEventData(*this, true);
199 result
->mFlags
= mFlags
;
204 uint16_t mInputSource
= 5; // MouseEvent_Binding::MOZ_SOURCE_TOUCH
205 int16_t mButton
= eNotPressed
;
206 int16_t mButtons
= 0;
208 void AssignTouchEventData(const WidgetTouchEvent
& aEvent
, bool aCopyTargets
) {
209 AssignInputEventData(aEvent
, aCopyTargets
);
211 // Assign*EventData() assume that they're called only new instance.
212 MOZ_ASSERT(mTouches
.IsEmpty());
213 mTouches
.AppendElements(aEvent
.mTouches
);
214 mInputSource
= aEvent
.mInputSource
;
218 } // namespace mozilla
220 #endif // mozilla_TouchEvents_h__