Bug 924791 - Ensure hover event refpoints are converted from CSSPixels to LayoutDevicePixels. r=wesj

This commit is contained in:
Kartikaya Gupta 2013-10-15 17:11:39 -04:00
parent 8a83000296
commit df87dea38c
3 changed files with 54 additions and 36 deletions

View File

@ -833,6 +833,53 @@ AndroidGeckoEvent::MakeMultiTouchInput(nsIWidget* widget)
return event;
}
WidgetMouseEvent
AndroidGeckoEvent::MakeMouseEvent(nsIWidget* widget)
{
uint32_t msg = NS_EVENT_NULL;
if (Points().Length() > 0) {
switch (Action()) {
case AndroidMotionEvent::ACTION_HOVER_MOVE:
msg = NS_MOUSE_MOVE;
break;
case AndroidMotionEvent::ACTION_HOVER_ENTER:
msg = NS_MOUSEENTER;
break;
case AndroidMotionEvent::ACTION_HOVER_EXIT:
msg = NS_MOUSELEAVE;
break;
default:
break;
}
}
WidgetMouseEvent event(true, msg, widget,
WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal);
if (msg == NS_EVENT_NULL) {
// unknown type, or no point data. abort
return event;
}
// XXX can we synthesize different buttons?
event.button = WidgetMouseEvent::eLeftButton;
if (msg != NS_MOUSE_MOVE) {
event.clickCount = 1;
}
event.modifiers = 0;
event.time = Time();
// We are dispatching this event directly into Gecko (as opposed to going
// through the AsyncPanZoomController), and the Points() array has points
// in CSS pixels, which we need to convert to LayoutDevice pixels.
const nsIntPoint& offset = widget->WidgetToScreenOffset();
CSSToLayoutDeviceScale scale = widget->GetDefaultScale();
event.refPoint = LayoutDeviceIntPoint((Points()[0].x * scale.scale) - offset.x,
(Points()[0].y * scale.scale) - offset.y);
return event;
}
void
AndroidPoint::Init(JNIEnv *jenv, jobject jobj)
{

View File

@ -590,6 +590,7 @@ public:
int RequestId() { return mCount; } // for convenience
WidgetTouchEvent MakeTouchEvent(nsIWidget* widget);
MultiTouchInput MakeMultiTouchInput(nsIWidget* widget);
WidgetMouseEvent MakeMouseEvent(nsIWidget* widget);
void UnionRect(nsIntRect const& aRect);
nsIObserver *Observer() { return mObserver; }

View File

@ -1168,46 +1168,16 @@ nsWindow::GetNativeData(uint32_t aDataType)
void
nsWindow::OnMouseEvent(AndroidGeckoEvent *ae)
{
uint32_t msg;
switch (ae->Action()) {
case AndroidMotionEvent::ACTION_HOVER_MOVE:
msg = NS_MOUSE_MOVE;
break;
case AndroidMotionEvent::ACTION_HOVER_ENTER:
msg = NS_MOUSEENTER;
break;
case AndroidMotionEvent::ACTION_HOVER_EXIT:
msg = NS_MOUSELEAVE;
break;
default:
return;
}
nsRefPtr<nsWindow> kungFuDeathGrip(this);
send_again:
WidgetMouseEvent event(true, msg, this,
WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal);
// XXX can we synthesize different buttons?
event.button = WidgetMouseEvent::eLeftButton;
if (msg != NS_MOUSE_MOVE)
event.clickCount = 1;
WidgetMouseEvent event = ae->MakeMouseEvent(this);
if (event.message == NS_EVENT_NULL) {
// invalid event type, abort
return;
}
// XXX add the double-click handling logic here
if (ae->Points().Length() > 0)
DispatchMotionEvent(event, ae, ae->Points()[0]);
if (Destroyed())
return;
if (msg == NS_MOUSE_BUTTON_DOWN) {
msg = NS_MOUSE_MOVE;
goto send_again;
}
DispatchEvent(&event);
}
bool nsWindow::OnMultitouchEvent(AndroidGeckoEvent *ae)