2013-01-23 23:30:48 +00:00
|
|
|
/* -*- 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"
|
|
|
|
|
2013-04-05 08:49:00 +00:00
|
|
|
#include "mozilla/dom/Touch.h"
|
2013-01-23 23:30:48 +00:00
|
|
|
#include "nsDebug.h"
|
2013-05-17 20:17:53 +00:00
|
|
|
#include "nsThreadUtils.h"
|
2013-09-25 11:21:18 +00:00
|
|
|
#include "mozilla/MouseEvents.h"
|
2013-09-25 11:21:16 +00:00
|
|
|
#include "mozilla/TouchEvents.h"
|
2013-01-23 23:30:48 +00:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
2013-04-05 08:49:00 +00:00
|
|
|
using namespace dom;
|
|
|
|
|
2014-08-08 22:15:37 +00:00
|
|
|
already_AddRefed<Touch> SingleTouchData::ToNewDOMTouch() const
|
2014-06-26 00:11:20 +00:00
|
|
|
{
|
|
|
|
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
|
|
|
"Can only create dom::Touch instances on main thread");
|
|
|
|
nsRefPtr<Touch> touch = new Touch(mIdentifier,
|
|
|
|
nsIntPoint(mScreenPoint.x, mScreenPoint.y),
|
|
|
|
nsIntPoint(mRadius.width, mRadius.height),
|
|
|
|
mRotationAngle,
|
|
|
|
mForce);
|
|
|
|
return touch.forget();
|
|
|
|
}
|
|
|
|
|
2013-09-27 06:20:57 +00:00
|
|
|
MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
2014-06-06 05:29:49 +00:00
|
|
|
: InputData(MULTITOUCH_INPUT, aTouchEvent.time, aTouchEvent.timeStamp,
|
|
|
|
aTouchEvent.modifiers)
|
2013-01-23 23:30:48 +00:00
|
|
|
{
|
|
|
|
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
2013-09-27 06:20:57 +00:00
|
|
|
"Can only copy from WidgetTouchEvent on main thread");
|
2013-01-23 23:30:48 +00:00
|
|
|
|
|
|
|
switch (aTouchEvent.message) {
|
|
|
|
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:
|
2014-08-08 22:15:37 +00:00
|
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to a MultiTouchInput");
|
2013-01-23 23:30:48 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < aTouchEvent.touches.Length(); i++) {
|
2013-08-02 07:06:35 +00:00
|
|
|
const Touch* domTouch = aTouchEvent.touches[i];
|
2013-01-23 23:30:48 +00:00
|
|
|
|
|
|
|
// Extract data from weird interfaces.
|
2013-08-02 07:06:35 +00:00
|
|
|
int32_t identifier = domTouch->Identifier();
|
|
|
|
int32_t radiusX = domTouch->RadiusX();
|
|
|
|
int32_t radiusY = domTouch->RadiusY();
|
|
|
|
float rotationAngle = domTouch->RotationAngle();
|
|
|
|
float force = domTouch->Force();
|
2013-01-23 23:30:48 +00:00
|
|
|
|
|
|
|
SingleTouchData data(identifier,
|
2013-06-11 22:13:11 +00:00
|
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
|
|
gfx::IntPoint(domTouch->mRefPoint.x,
|
|
|
|
domTouch->mRefPoint.y)),
|
|
|
|
ScreenSize(radiusX, radiusY),
|
2013-01-23 23:30:48 +00:00
|
|
|
rotationAngle,
|
|
|
|
force);
|
|
|
|
|
|
|
|
mTouches.AppendElement(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-08 22:15:37 +00:00
|
|
|
WidgetTouchEvent
|
|
|
|
MultiTouchInput::ToWidgetTouchEvent(nsIWidget* aWidget) const
|
|
|
|
{
|
|
|
|
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
|
|
|
"Can only convert To WidgetTouchEvent on main thread");
|
|
|
|
|
|
|
|
uint32_t touchType = NS_EVENT_NULL;
|
|
|
|
switch (mType) {
|
|
|
|
case MULTITOUCH_START:
|
|
|
|
touchType = NS_TOUCH_START;
|
|
|
|
break;
|
|
|
|
case MULTITOUCH_MOVE:
|
|
|
|
touchType = NS_TOUCH_MOVE;
|
|
|
|
break;
|
|
|
|
case MULTITOUCH_END:
|
|
|
|
touchType = NS_TOUCH_END;
|
|
|
|
break;
|
|
|
|
case MULTITOUCH_CANCEL:
|
|
|
|
touchType = NS_TOUCH_CANCEL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetTouchEvent in MultiTouchInput");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetTouchEvent event(true, touchType, aWidget);
|
|
|
|
if (touchType == NS_EVENT_NULL) {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2013-10-02 06:38:27 +00:00
|
|
|
// This conversion from WidgetMouseEvent to MultiTouchInput is needed because on
|
2013-01-23 23:30:48 +00:00
|
|
|
// 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.
|
2013-10-02 06:38:27 +00:00
|
|
|
MultiTouchInput::MultiTouchInput(const WidgetMouseEvent& aMouseEvent)
|
2014-06-06 05:29:49 +00:00
|
|
|
: InputData(MULTITOUCH_INPUT, aMouseEvent.time, aMouseEvent.timeStamp,
|
|
|
|
aMouseEvent.modifiers)
|
2013-01-23 23:30:48 +00:00
|
|
|
{
|
|
|
|
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
2013-10-02 06:38:27 +00:00
|
|
|
"Can only copy from WidgetMouseEvent on main thread");
|
2013-01-23 23:30:48 +00:00
|
|
|
switch (aMouseEvent.message) {
|
|
|
|
case NS_MOUSE_BUTTON_DOWN:
|
|
|
|
mType = MULTITOUCH_START;
|
|
|
|
break;
|
|
|
|
case NS_MOUSE_MOVE:
|
|
|
|
mType = MULTITOUCH_MOVE;
|
|
|
|
break;
|
|
|
|
case NS_MOUSE_BUTTON_UP:
|
|
|
|
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 NS_MOUSE_EXIT:
|
|
|
|
mType = MULTITOUCH_CANCEL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
NS_WARNING("Did not assign a type to a MultiTouchInput");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
mTouches.AppendElement(SingleTouchData(0,
|
2013-06-11 22:13:11 +00:00
|
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
|
|
gfx::IntPoint(aMouseEvent.refPoint.x,
|
|
|
|
aMouseEvent.refPoint.y)),
|
|
|
|
ScreenSize(1, 1),
|
2013-01-23 23:30:48 +00:00
|
|
|
180.0f,
|
|
|
|
1.0f));
|
|
|
|
}
|
|
|
|
}
|