OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/ui_events_helper.h" | 5 #include "content/browser/renderer_host/ui_events_helper.h" |
6 | 6 |
7 #include "content/common/input/web_touch_event_traits.h" | 7 #include "content/common/input/web_touch_event_traits.h" |
8 #include "third_party/WebKit/public/web/WebInputEvent.h" | 8 #include "third_party/WebKit/public/web/WebInputEvent.h" |
9 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
10 #include "ui/events/event_constants.h" | 10 #include "ui/events/event_constants.h" |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 return NULL; | 299 return NULL; |
300 | 300 |
301 // The spec requires the radii values to be positive (and 1 when unknown). | 301 // The spec requires the radii values to be positive (and 1 when unknown). |
302 point->radiusX = std::max(1.f, event.radius_x()); | 302 point->radiusX = std::max(1.f, event.radius_x()); |
303 point->radiusY = std::max(1.f, event.radius_y()); | 303 point->radiusY = std::max(1.f, event.radius_y()); |
304 point->rotationAngle = event.rotation_angle(); | 304 point->rotationAngle = event.rotation_angle(); |
305 point->force = event.force(); | 305 point->force = event.force(); |
306 | 306 |
307 // Update the location and state of the point. | 307 // Update the location and state of the point. |
308 point->state = TouchPointStateFromEvent(event); | 308 point->state = TouchPointStateFromEvent(event); |
309 if (point->state == blink::WebTouchPoint::StateMoved) { | |
310 // It is possible for badly written touch drivers to emit Move events even | |
311 // when the touch location hasn't changed. In such cases, consume the event | |
312 // and pretend nothing happened. | |
313 if (point->position.x == event.x() && point->position.y == event.y()) | |
314 return NULL; | |
315 } | |
316 point->position.x = event.x(); | 309 point->position.x = event.x(); |
317 point->position.y = event.y(); | 310 point->position.y = event.y(); |
318 | 311 |
319 const gfx::PointF& root_point = event.root_location_f(); | 312 const gfx::PointF& root_point = event.root_location_f(); |
320 point->screenPosition.x = root_point.x(); | 313 point->screenPosition.x = root_point.x(); |
321 point->screenPosition.y = root_point.y(); | 314 point->screenPosition.y = root_point.y(); |
322 | 315 |
323 // Mark the rest of the points as stationary. | 316 // Mark the rest of the points as stationary. |
324 for (unsigned i = 0; i < web_event->touchesLength; ++i) { | 317 for (unsigned i = 0; i < web_event->touchesLength; ++i) { |
325 blink::WebTouchPoint* iter = web_event->touches + i; | 318 blink::WebTouchPoint* iter = web_event->touches + i; |
326 if (iter != point) | 319 if (iter != point) |
327 iter->state = blink::WebTouchPoint::StateStationary; | 320 iter->state = blink::WebTouchPoint::StateStationary; |
328 } | 321 } |
329 | 322 |
330 // Update the type of the touch event. | 323 // Update the type of the touch event. |
331 WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event), | 324 WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event), |
332 event.time_stamp().InSecondsF(), | 325 event.time_stamp().InSecondsF(), |
333 web_event); | 326 web_event); |
334 web_event->modifiers = EventFlagsToWebEventModifiers(event.flags()); | 327 web_event->modifiers = EventFlagsToWebEventModifiers(event.flags()); |
335 | 328 |
336 return point; | 329 return point; |
337 } | 330 } |
338 | 331 |
339 } // namespace content | 332 } // namespace content |
OLD | NEW |