1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/dom/WheelEvent.h"
8 #include "mozilla/MouseEvents.h"
14 WheelEvent::WheelEvent(EventTarget
* aOwner
,
15 nsPresContext
* aPresContext
,
16 WidgetWheelEvent
* aWheelEvent
)
17 : MouseEvent(aOwner
, aPresContext
,
18 aWheelEvent
? aWheelEvent
:
19 new WidgetWheelEvent(false, 0, nullptr))
20 , mAppUnitsPerDevPixel(0)
23 mEventIsInternal
= false;
24 // If the delta mode is pixel, the WidgetWheelEvent's delta values are in
25 // device pixels. However, JS contents need the delta values in CSS pixels.
26 // We should store the value of mAppUnitsPerDevPixel here because
27 // it might be changed by changing zoom or something.
28 if (aWheelEvent
->deltaMode
== nsIDOMWheelEvent::DOM_DELTA_PIXEL
) {
29 mAppUnitsPerDevPixel
= aPresContext
->AppUnitsPerDevPixel();
32 mEventIsInternal
= true;
33 mEvent
->time
= PR_Now();
34 mEvent
->refPoint
.x
= mEvent
->refPoint
.y
= 0;
35 mEvent
->AsWheelEvent()->inputSource
= nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN
;
39 NS_IMPL_ADDREF_INHERITED(WheelEvent
, MouseEvent
)
40 NS_IMPL_RELEASE_INHERITED(WheelEvent
, MouseEvent
)
42 NS_INTERFACE_MAP_BEGIN(WheelEvent
)
43 NS_INTERFACE_MAP_ENTRY(nsIDOMWheelEvent
)
44 NS_INTERFACE_MAP_END_INHERITING(MouseEvent
)
47 WheelEvent::InitWheelEvent(const nsAString
& aType
,
57 nsIDOMEventTarget
* aRelatedTarget
,
58 const nsAString
& aModifiersList
,
65 MouseEvent::InitMouseEvent(aType
, aCanBubble
, aCancelable
, aView
, aDetail
,
66 aScreenX
, aScreenY
, aClientX
, aClientY
, aButton
,
67 aRelatedTarget
, aModifiersList
);
68 NS_ENSURE_SUCCESS(rv
, rv
);
70 WidgetWheelEvent
* wheelEvent
= mEvent
->AsWheelEvent();
71 wheelEvent
->deltaX
= aDeltaX
;
72 wheelEvent
->deltaY
= aDeltaY
;
73 wheelEvent
->deltaZ
= aDeltaZ
;
74 wheelEvent
->deltaMode
= aDeltaMode
;
82 if (!mAppUnitsPerDevPixel
) {
83 return mEvent
->AsWheelEvent()->deltaX
;
85 return mEvent
->AsWheelEvent()->deltaX
*
86 mAppUnitsPerDevPixel
/ nsPresContext::AppUnitsPerCSSPixel();
90 WheelEvent::GetDeltaX(double* aDeltaX
)
92 NS_ENSURE_ARG_POINTER(aDeltaX
);
101 if (!mAppUnitsPerDevPixel
) {
102 return mEvent
->AsWheelEvent()->deltaY
;
104 return mEvent
->AsWheelEvent()->deltaY
*
105 mAppUnitsPerDevPixel
/ nsPresContext::AppUnitsPerCSSPixel();
109 WheelEvent::GetDeltaY(double* aDeltaY
)
111 NS_ENSURE_ARG_POINTER(aDeltaY
);
120 if (!mAppUnitsPerDevPixel
) {
121 return mEvent
->AsWheelEvent()->deltaZ
;
123 return mEvent
->AsWheelEvent()->deltaZ
*
124 mAppUnitsPerDevPixel
/ nsPresContext::AppUnitsPerCSSPixel();
128 WheelEvent::GetDeltaZ(double* aDeltaZ
)
130 NS_ENSURE_ARG_POINTER(aDeltaZ
);
137 WheelEvent::DeltaMode()
139 return mEvent
->AsWheelEvent()->deltaMode
;
143 WheelEvent::GetDeltaMode(uint32_t* aDeltaMode
)
145 NS_ENSURE_ARG_POINTER(aDeltaMode
);
147 *aDeltaMode
= DeltaMode();
152 GetModifierList(bool aCtrl
, bool aShift
, bool aAlt
, bool aMeta
,
153 nsAString
& aModifierList
)
156 aModifierList
.AppendLiteral(NS_DOM_KEYNAME_CONTROL
);
159 if (!aModifierList
.IsEmpty()) {
160 aModifierList
.Append(' ');
162 aModifierList
.AppendLiteral(NS_DOM_KEYNAME_SHIFT
);
165 if (!aModifierList
.IsEmpty()) {
166 aModifierList
.Append(' ');
168 aModifierList
.AppendLiteral(NS_DOM_KEYNAME_ALT
);
171 if (!aModifierList
.IsEmpty()) {
172 aModifierList
.Append(' ');
174 aModifierList
.AppendLiteral(NS_DOM_KEYNAME_META
);
178 already_AddRefed
<WheelEvent
>
179 WheelEvent::Constructor(const GlobalObject
& aGlobal
,
180 const nsAString
& aType
,
181 const WheelEventInit
& aParam
,
184 nsCOMPtr
<EventTarget
> t
= do_QueryInterface(aGlobal
.GetAsSupports());
185 nsRefPtr
<WheelEvent
> e
= new WheelEvent(t
, nullptr, nullptr);
186 bool trusted
= e
->Init(t
);
187 nsAutoString modifierList
;
188 GetModifierList(aParam
.mCtrlKey
, aParam
.mShiftKey
,
189 aParam
.mAltKey
, aParam
.mMetaKey
,
191 aRv
= e
->InitWheelEvent(aType
, aParam
.mBubbles
, aParam
.mCancelable
,
192 aParam
.mView
, aParam
.mDetail
,
193 aParam
.mScreenX
, aParam
.mScreenY
,
194 aParam
.mClientX
, aParam
.mClientY
,
195 aParam
.mButton
, aParam
.mRelatedTarget
,
196 modifierList
, aParam
.mDeltaX
,
197 aParam
.mDeltaY
, aParam
.mDeltaZ
, aParam
.mDeltaMode
);
198 e
->mEvent
->AsWheelEvent()->buttons
= aParam
.mButtons
;
199 e
->SetTrusted(trusted
);
204 } // namespace mozilla
206 using namespace mozilla
;
207 using namespace mozilla::dom
;
210 NS_NewDOMWheelEvent(nsIDOMEvent
** aInstancePtrResult
,
212 nsPresContext
* aPresContext
,
213 WidgetWheelEvent
* aEvent
)
215 WheelEvent
* it
= new WheelEvent(aOwner
, aPresContext
, aEvent
);
217 *aInstancePtrResult
= static_cast<Event
*>(it
);