mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
2327f70281
- Bug 895274 part.184 Rename NS_WHEEL_WHEEL to eWheel r=smaug (b78075d68c) - Bug 895274 part.185 Rename NS_WHEEL_START to eWheelOperationStart r=smaug (ef147b337a) - Bug 895274 part.186 Rename NS_WHEEL_END to eWheelOperationEnd r=smaug (8c6bfb5aca) - Bug 895274 part.187 Rename NS_QUERY_TEXT_RECT to eQueryTextRect r=smaug (01b97dedc2) - Bug 895274 part.188 Rename NS_COMPOSITION_COMMIT_AS_IS to eCompositionCommitAsIs r=smaug (3bd8938a00) - Bug 895274 part.189 Rename NS_COMPOSITION_EVENT_START to eCompositionEventFirst r=smaug (b0f5236baf) - Bug 895274 part.190 Rename NS_COMPOSITION_START to eCompositionStart r=smaug (7ee199114a) - Bug 895274 part.191 Rename NS_COMPOSITION_END to eCompositionEnd r=smaug (d30424b8cd) - Bug 895274 part.192 Rename NS_COMPOSITION_UPDATE to eCompositionUpdate r=smaug (c403cf13e5) - Bug 895274 part.193 Rename NS_COMPOSITION_CHANGE to eCompositionChange r=smaug (a389b8bbfc) - Bug 895274 part.194 Rename NS_COMPOSITION_COMMIT to eCompositionCommit r=smaug (1301188afb) - Bug 895274 part.195 Rename NS_SMIL_TIME_EVENT_START to eSMILEventFist r=smaug (3a2be988bb) - Bug 895274 part.196 Rename NS_SMIL_BEGIN to eSMILBeginEvent r=smaug (d765c0369e) - Bug 895274 part.197 Rename NS_SMIL_END to eSMILEndEvent r=smaug (68da522bca) - Bug 895274 part.198 Rename NS_SMIL_REPEAT to eSMILRepeatEvent r=smaug (ccf4ce4ef5) - Bug 895274 part.199 Rename NS_GAMEPAD_DISCONNECTED to eGamepadDisconnected r=smaug (1c05f03479) - Bug 895274 part.200 Rename NS_GAMEPAD_CONNECTED to eGamepadConnected r=smaug (8920a80441) - Bug 895274 part.201 Rename NS_GAMEPAD_BUTTONDOWN to eGamepadButtonDown r=smaug (df670ac919) - Bug 895274 part.202 Rename NS_GAMEPAD_BUTTONUP to eGamepadButtonUp r=smaug (eefcc73239) - Bug 895274 part.203 Rename NS_GAMEPAD_AXISMOVE to eGamepadAxisMove r=smaug (496a66cfb7) - Bug 895274 part.204 Rename NS_GAMEPAD_START to eGamepadEventFirst r=smaug (5025e77563) - Bug 895274 part.205 Rename NS_GAMEPAD_END to eGamepadEventLast r=smaug (25b879b144) - Bug 895274 part.206 Rename NS_MOZ_TIME_CHANGE_EVENT to eTimeChange r=smaug (9f6f3289c5) - Bug 895274 part.207 Rename NS_NETWORK_DOWNLOAD_EVENT to eNetworkDownload r=smaug (bfd645cc48) - Bug 895274 part.208 Rename NS_NETWORK_UPLOAD_EVENT to eNetworkUpload r=smaug (ceed6a3922) - Bug 895274 part.209 Rename NS_NETWORK_EVENT_START to eNetworkEventFirst r=smaug (899b28835b) - Bug 895274 part.210 Rename NS_POINTERLOCK_START to ePointerLockEventFirst r=smaug (4cdbcc2c8f) - Bug 895274 part.211 Rename NS_POINTERLOCKCHANGE to ePointerLockChange r=smaug (b6a7348123) - Bug 895274 part.212 Rename NS_POINTERLOCKERROR to ePointerLockError r=smaug (78a71d9f47) - Bug 895274 part.213 Rename NS_SCROLLPORT_OVERFLOW to eScrollPortOverflow r=smaug (b6ca32dd44) - Bug 895274 part.214 Rename NS_SCROLLPORT_UNDERFLOW to eScrollPortUnderflow r=smaug (d25c9bad43) - Bug 895274 part.215 Rename NS_SCROLLPORT_START to eScrollPortEventFirst r=smaug (d25f492167) - Bug 895274 part.216 Rename NS_SCROLLAREA_EVENT_START to eScrolledAreaEventFirst r=smaug (e5edc9d76d) - Bug 895274 part.217 Rename NS_SCROLLEDAREACHANGE to eScrolledAreaChanged r=smaug (dd7decaea6) - Bug 895274 part.218 Remove NS_ORIENTATION_EVENT due to unused r=smaug (5e5614a959) - Bug 895274 part.219 Rename NS_GESTURENOTIFY_EVENT_START to eGestureNotify r=smaug (8dd0f241b8) - Bug 895274 part.220 Rename NS_PRINT_EVENT_START to ePrintEventFirst r=smaug (fbf29cd28e) - Bug 895274 part.221 Rename NS_BEFOREPRINT to eBeforePrint r=smaug (b9b7e96411) - Bug 895274 part.222 Rename NS_AFTERPRINT to eAfterPrint r=smaug (1f5f4b98e1) - Bug 895274 part.223 Rename NS_DEVICE_ORIENTATION_START to eDeviceEventFirst r=smaug (6a807bda4d) - Bug 895274 part.224 Rename NS_DEVICE_ORIENTATION to eDeviceOrientation r=smaug (ba858460ea) - Bug 895274 part.225 Rename NS_DEVICE_MOTION to eDeviceMotion r=smaug (97dcea31fe) - Bug 895274 part.226 Rename NS_DEVICE_PROXIMITY to eDeviceProximity r=smaug (80e400848d) - Bug 895274 part.227 Rename NS_USER_PROXIMITY to eUserProximity r=smaug (80a851b462) - Bug 895274 part.228 Rename NS_DEVICE_LIGHT to eDeviceLight r=smaug (299cab2e5b) - Bug 895274 part.229 Rename NS_SELECTION_CHANGE to eSelectionChange r=smaug (579d40b3a3) - followup 895274 NS_VISIBILITY_CHANGE to eVisibilityChange (9d222cb4fc)
346 lines
10 KiB
C++
346 lines
10 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "InputData.h"
|
|
|
|
#include "mozilla/dom/Touch.h"
|
|
#include "nsDebug.h"
|
|
#include "nsThreadUtils.h"
|
|
#include "mozilla/MouseEvents.h"
|
|
#include "mozilla/TouchEvents.h"
|
|
#include "UnitTransforms.h"
|
|
|
|
namespace mozilla {
|
|
|
|
using namespace dom;
|
|
|
|
already_AddRefed<Touch> SingleTouchData::ToNewDOMTouch() const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only create dom::Touch instances on main thread");
|
|
nsRefPtr<Touch> touch = new Touch(mIdentifier,
|
|
LayoutDeviceIntPoint(mScreenPoint.x, mScreenPoint.y),
|
|
nsIntPoint(mRadius.width, mRadius.height),
|
|
mRotationAngle,
|
|
mForce);
|
|
return touch.forget();
|
|
}
|
|
|
|
MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
|
: InputData(MULTITOUCH_INPUT, aTouchEvent.time, aTouchEvent.timeStamp,
|
|
aTouchEvent.modifiers)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only copy from WidgetTouchEvent on main thread");
|
|
|
|
switch (aTouchEvent.mMessage) {
|
|
case NS_TOUCH_START:
|
|
mType = MULTITOUCH_START;
|
|
break;
|
|
case NS_TOUCH_MOVE:
|
|
mType = MULTITOUCH_MOVE;
|
|
break;
|
|
case NS_TOUCH_END:
|
|
mType = MULTITOUCH_END;
|
|
break;
|
|
case NS_TOUCH_CANCEL:
|
|
mType = MULTITOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to a MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
for (size_t i = 0; i < aTouchEvent.touches.Length(); i++) {
|
|
const Touch* domTouch = aTouchEvent.touches[i];
|
|
|
|
// Extract data from weird interfaces.
|
|
int32_t identifier = domTouch->Identifier();
|
|
int32_t radiusX = domTouch->RadiusX();
|
|
int32_t radiusY = domTouch->RadiusY();
|
|
float rotationAngle = domTouch->RotationAngle();
|
|
float force = domTouch->Force();
|
|
|
|
SingleTouchData data(identifier,
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
gfx::IntPoint(domTouch->mRefPoint.x,
|
|
domTouch->mRefPoint.y)),
|
|
ScreenSize(radiusX, radiusY),
|
|
rotationAngle,
|
|
force);
|
|
|
|
mTouches.AppendElement(data);
|
|
}
|
|
}
|
|
|
|
WidgetTouchEvent
|
|
MultiTouchInput::ToWidgetTouchEvent(nsIWidget* aWidget) const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only convert To WidgetTouchEvent on main thread");
|
|
|
|
EventMessage touchEventMessage = eVoidEvent;
|
|
switch (mType) {
|
|
case MULTITOUCH_START:
|
|
touchEventMessage = NS_TOUCH_START;
|
|
break;
|
|
case MULTITOUCH_MOVE:
|
|
touchEventMessage = NS_TOUCH_MOVE;
|
|
break;
|
|
case MULTITOUCH_END:
|
|
touchEventMessage = NS_TOUCH_END;
|
|
break;
|
|
case MULTITOUCH_CANCEL:
|
|
touchEventMessage = NS_TOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetTouchEvent in MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
WidgetTouchEvent event(true, touchEventMessage, aWidget);
|
|
if (touchEventMessage == eVoidEvent) {
|
|
return event;
|
|
}
|
|
|
|
event.modifiers = this->modifiers;
|
|
event.time = this->mTime;
|
|
event.timeStamp = this->mTimeStamp;
|
|
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
*event.touches.AppendElement() = mTouches[i].ToNewDOMTouch();
|
|
}
|
|
|
|
return event;
|
|
}
|
|
|
|
WidgetMouseEvent
|
|
MultiTouchInput::ToWidgetMouseEvent(nsIWidget* aWidget) const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only convert To WidgetMouseEvent on main thread");
|
|
|
|
EventMessage mouseEventMessage = eVoidEvent;
|
|
switch (mType) {
|
|
case MultiTouchInput::MULTITOUCH_START:
|
|
mouseEventMessage = eMouseDown;
|
|
break;
|
|
case MultiTouchInput::MULTITOUCH_MOVE:
|
|
mouseEventMessage = eMouseMove;
|
|
break;
|
|
case MultiTouchInput::MULTITOUCH_CANCEL:
|
|
case MultiTouchInput::MULTITOUCH_END:
|
|
mouseEventMessage = eMouseUp;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent");
|
|
break;
|
|
}
|
|
|
|
WidgetMouseEvent event(true, mouseEventMessage, aWidget,
|
|
WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal);
|
|
|
|
const SingleTouchData& firstTouch = mTouches[0];
|
|
event.refPoint.x = firstTouch.mScreenPoint.x;
|
|
event.refPoint.y = firstTouch.mScreenPoint.y;
|
|
|
|
event.time = mTime;
|
|
event.button = WidgetMouseEvent::eLeftButton;
|
|
event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
|
|
event.modifiers = modifiers;
|
|
|
|
if (mouseEventMessage != eMouseMove) {
|
|
event.clickCount = 1;
|
|
}
|
|
|
|
return event;
|
|
}
|
|
|
|
int32_t
|
|
MultiTouchInput::IndexOfTouch(int32_t aTouchIdentifier)
|
|
{
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
if (mTouches[i].mIdentifier == aTouchIdentifier) {
|
|
return (int32_t)i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// This conversion from WidgetMouseEvent to MultiTouchInput is needed because on
|
|
// the B2G emulator we can only receive mouse events, but we need to be able
|
|
// to pan correctly. To do this, we convert the events into a format that the
|
|
// panning code can handle. This code is very limited and only supports
|
|
// SingleTouchData. It also sends garbage for the identifier, radius, force
|
|
// and rotation angle.
|
|
MultiTouchInput::MultiTouchInput(const WidgetMouseEvent& aMouseEvent)
|
|
: InputData(MULTITOUCH_INPUT, aMouseEvent.time, aMouseEvent.timeStamp,
|
|
aMouseEvent.modifiers)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only copy from WidgetMouseEvent on main thread");
|
|
switch (aMouseEvent.mMessage) {
|
|
case eMouseDown:
|
|
mType = MULTITOUCH_START;
|
|
break;
|
|
case eMouseMove:
|
|
mType = MULTITOUCH_MOVE;
|
|
break;
|
|
case eMouseUp:
|
|
mType = MULTITOUCH_END;
|
|
break;
|
|
// The mouse pointer has been interrupted in an implementation-specific
|
|
// manner, such as a synchronous event or action cancelling the touch, or a
|
|
// touch point leaving the document window and going into a non-document
|
|
// area capable of handling user interactions.
|
|
case eMouseExitFromWidget:
|
|
mType = MULTITOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
NS_WARNING("Did not assign a type to a MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
mTouches.AppendElement(SingleTouchData(0,
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
gfx::IntPoint(aMouseEvent.refPoint.x,
|
|
aMouseEvent.refPoint.y)),
|
|
ScreenSize(1, 1),
|
|
180.0f,
|
|
1.0f));
|
|
}
|
|
|
|
bool
|
|
MultiTouchInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
Maybe<ParentLayerIntPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mTouches[i].mScreenPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mTouches[i].mLocalScreenPoint = *point;
|
|
}
|
|
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, eWheel, aWidget);
|
|
wheelEvent.modifiers = this->modifiers;
|
|
wheelEvent.time = mTime;
|
|
wheelEvent.timeStamp = mTimeStamp;
|
|
wheelEvent.refPoint =
|
|
RoundedToInt(ViewAs<LayoutDevicePixel>(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 = mHandledByAPZ;
|
|
return wheelEvent;
|
|
}
|
|
|
|
bool
|
|
PanGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> panStartPoint = UntransformTo<ParentLayerPixel>(aTransform, mPanStartPoint);
|
|
if (!panStartPoint) {
|
|
return false;
|
|
}
|
|
mLocalPanStartPoint = *panStartPoint;
|
|
|
|
Maybe<ParentLayerPoint> panDisplacement = UntransformVector<ParentLayerPixel>(aTransform, mPanDisplacement, mPanStartPoint);
|
|
if (!panDisplacement) {
|
|
return false;
|
|
}
|
|
mLocalPanDisplacement = *panDisplacement;
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
PinchGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mFocusPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalFocusPoint = *point;
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TapGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerIntPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalPoint = *point;
|
|
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, eWheel, aWidget);
|
|
wheelEvent.modifiers = this->modifiers;
|
|
wheelEvent.time = mTime;
|
|
wheelEvent.timeStamp = mTimeStamp;
|
|
wheelEvent.refPoint =
|
|
RoundedToInt(ViewAs<LayoutDevicePixel>(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 = mHandledByAPZ;
|
|
return wheelEvent;
|
|
}
|
|
|
|
bool
|
|
ScrollWheelInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mOrigin);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalOrigin = *point;
|
|
return true;
|
|
}
|
|
|
|
} // namespace mozilla
|