Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Unified Diff: content/browser/renderer_host/web_input_event_aurax11.cc

Issue 8377001: aura: Add touch-event support for RWHVA. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: windows Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/web_input_event_aurax11.cc
diff --git a/content/browser/renderer_host/web_input_event_aurax11.cc b/content/browser/renderer_host/web_input_event_aurax11.cc
index 2360cc9140556dbca238d4d23741d742be568b0c..0eeb3c18ad537ea4eeb5c26677960b3d4b27feb2 100644
--- a/content/browser/renderer_host/web_input_event_aurax11.cc
+++ b/content/browser/renderer_host/web_input_event_aurax11.cc
@@ -199,6 +199,38 @@ void ResetClickCountState() {
g_last_click_button = WebKit::WebMouseEvent::ButtonNone;
}
+WebKit::WebTouchPoint::State TouchPointStateFromEvent(
+ const aura::TouchEvent* event) {
+ switch (event->type()) {
+ case ui::ET_TOUCH_PRESSED:
+ return WebKit::WebTouchPoint::StatePressed;
+ case ui::ET_TOUCH_RELEASED:
+ return WebKit::WebTouchPoint::StateReleased;
+ case ui::ET_TOUCH_MOVED:
+ return WebKit::WebTouchPoint::StateMoved;
+ case ui::ET_TOUCH_CANCELLED:
+ return WebKit::WebTouchPoint::StateCancelled;
+ default:
+ return WebKit::WebTouchPoint::StateUndefined;
+ }
+}
+
+WebKit::WebInputEvent::Type TouchEventTypeFromEvent(
+ const aura::TouchEvent* event) {
+ switch (event->type()) {
+ case ui::ET_TOUCH_PRESSED:
+ return WebKit::WebInputEvent::TouchStart;
+ case ui::ET_TOUCH_RELEASED:
+ return WebKit::WebInputEvent::TouchEnd;
+ case ui::ET_TOUCH_MOVED:
+ return WebKit::WebInputEvent::TouchMove;
+ case ui::ET_TOUCH_CANCELLED:
+ return WebKit::WebInputEvent::TouchCancel;
+ default:
+ return WebKit::WebInputEvent::Undefined;
+ }
+}
+
} // namespace
WebKit::WebMouseEvent MakeWebMouseEventFromAuraEvent(aura::MouseEvent* event) {
@@ -319,4 +351,73 @@ WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
return webkit_event;
}
+WebKit::WebTouchPoint* UpdateWebTouchEventFromAuraEvent(
+ aura::TouchEvent* event, WebKit::WebTouchEvent* web_event) {
+ WebKit::WebTouchPoint* point = NULL;
+ switch (event->type()) {
+ case ui::ET_TOUCH_PRESSED:
+ // Add a new touch point.
+ if (web_event->touchesLength < WebKit::WebTouchEvent::touchesLengthCap) {
+ point = &web_event->touches[web_event->touchesLength++];
+ point->id = event->touch_id();
+ }
+ break;
+ case ui::ET_TOUCH_RELEASED:
+ case ui::ET_TOUCH_CANCELLED:
+ case ui::ET_TOUCH_MOVED: {
+ // The touch point should have been added to the event from an earlier
+ // _PRESSED event. So find that.
+ // At the moment, only a maximum of 4 touch-points are allowed. So a
+ // simple loop should be sufficient.
+ for (unsigned i = 0; i < web_event->touchesLength; ++i) {
+ point = web_event->touches + i;
+ if (point->id == event->touch_id())
+ break;
+ point = NULL;
+ }
+ break;
+ }
+ default:
+ DLOG(WARNING) << "Unknown touch event " << event->type();
+ break;
+ }
+
+ if (!point)
+ return NULL;
+
+ point->radiusX = event->radius_x();
+ point->radiusY = event->radius_y();
+ point->rotationAngle = event->rotation_angle();
+ point->force = event->force();
+
+ // Update the location and state of the point.
+ point->state = TouchPointStateFromEvent(event);
+ if (point->state == WebKit::WebTouchPoint::StateMoved) {
+ // It is possible for badly written touch drivers to emit Move events even
+ // when the touch location hasn't changed. In such cases, consume the event
+ // and pretend nothing happened.
+ if (point->position.x == event->x() && point->position.y == event->y())
+ return NULL;
+ }
+ point->position.x = event->x();
+ point->position.y = event->y();
+
+ // TODO(sad): Convert to screen coordinates.
+ point->screenPosition.x = point->position.x;
+ point->screenPosition.y = point->position.y;
+
+ // Mark the rest of the points as stationary.
+ for (unsigned i = 0; i < web_event->touchesLength; ++i) {
+ WebKit::WebTouchPoint* iter = web_event->touches + i;
+ if (iter != point)
+ iter->state = WebKit::WebTouchPoint::StateStationary;
+ }
+
+ // Update the type of the touch event.
+ web_event->type = TouchEventTypeFromEvent(event);
+ web_event->timeStampSeconds = event->time_stamp().ToDoubleT();
+
+ return point;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698