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/browser/renderer_host/input/web_input_event_util.h" | 7 #include "content/browser/renderer_host/input/web_input_event_util.h" |
8 #include "content/common/input/web_touch_event_traits.h" | 8 #include "content/common/input/web_touch_event_traits.h" |
9 #include "third_party/WebKit/public/web/WebInputEvent.h" | 9 #include "third_party/WebKit/public/web/WebInputEvent.h" |
10 #include "ui/events/event.h" | 10 #include "ui/events/event.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 return ui::ET_TOUCH_MOVED; | 25 return ui::ET_TOUCH_MOVED; |
26 | 26 |
27 case blink::WebTouchPoint::StateCancelled: | 27 case blink::WebTouchPoint::StateCancelled: |
28 return ui::ET_TOUCH_CANCELLED; | 28 return ui::ET_TOUCH_CANCELLED; |
29 | 29 |
30 default: | 30 default: |
31 return ui::ET_UNKNOWN; | 31 return ui::ET_UNKNOWN; |
32 } | 32 } |
33 } | 33 } |
34 | 34 |
35 blink::WebTouchPoint::State TouchPointStateFromEvent( | |
36 const ui::TouchEvent& event) { | |
37 switch (event.type()) { | |
38 case ui::ET_TOUCH_PRESSED: | |
39 return blink::WebTouchPoint::StatePressed; | |
40 case ui::ET_TOUCH_RELEASED: | |
41 return blink::WebTouchPoint::StateReleased; | |
42 case ui::ET_TOUCH_MOVED: | |
43 return blink::WebTouchPoint::StateMoved; | |
44 case ui::ET_TOUCH_CANCELLED: | |
45 return blink::WebTouchPoint::StateCancelled; | |
46 default: | |
47 return blink::WebTouchPoint::StateUndefined; | |
48 } | |
49 } | |
50 | |
51 blink::WebInputEvent::Type TouchEventTypeFromEvent( | |
52 const ui::TouchEvent& event) { | |
53 switch (event.type()) { | |
54 case ui::ET_TOUCH_PRESSED: | |
55 return blink::WebInputEvent::TouchStart; | |
56 case ui::ET_TOUCH_RELEASED: | |
57 return blink::WebInputEvent::TouchEnd; | |
58 case ui::ET_TOUCH_MOVED: | |
59 return blink::WebInputEvent::TouchMove; | |
60 case ui::ET_TOUCH_CANCELLED: | |
61 return blink::WebInputEvent::TouchCancel; | |
62 default: | |
63 return blink::WebInputEvent::Undefined; | |
64 } | |
65 } | |
66 | |
67 } // namespace | 35 } // namespace |
68 | 36 |
69 namespace content { | 37 namespace content { |
70 | 38 |
71 bool MakeUITouchEventsFromWebTouchEvents( | 39 bool MakeUITouchEventsFromWebTouchEvents( |
72 const TouchEventWithLatencyInfo& touch_with_latency, | 40 const TouchEventWithLatencyInfo& touch_with_latency, |
73 ScopedVector<ui::TouchEvent>* list, | 41 ScopedVector<ui::TouchEvent>* list, |
74 TouchEventCoordinateSystem coordinate_system) { | 42 TouchEventCoordinateSystem coordinate_system) { |
75 const blink::WebTouchEvent& touch = touch_with_latency.event; | 43 const blink::WebTouchEvent& touch = touch_with_latency.event; |
76 ui::EventType type = ui::ET_UNKNOWN; | 44 ui::EventType type = ui::ET_UNKNOWN; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 90 |
123 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( | 91 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( |
124 const ui::GestureEvent& event) { | 92 const ui::GestureEvent& event) { |
125 return CreateWebGestureEvent(event.details(), | 93 return CreateWebGestureEvent(event.details(), |
126 event.time_stamp(), | 94 event.time_stamp(), |
127 event.location_f(), | 95 event.location_f(), |
128 event.root_location_f(), | 96 event.root_location_f(), |
129 event.flags()); | 97 event.flags()); |
130 } | 98 } |
131 | 99 |
132 blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent( | |
133 const ui::TouchEvent& event, | |
134 blink::WebTouchEvent* web_event) { | |
135 blink::WebTouchPoint* point = NULL; | |
136 switch (event.type()) { | |
137 case ui::ET_TOUCH_PRESSED: | |
138 // Add a new touch point. | |
139 if (web_event->touchesLength < blink::WebTouchEvent::touchesLengthCap) { | |
140 point = &web_event->touches[web_event->touchesLength++]; | |
141 point->id = event.touch_id(); | |
142 } | |
143 break; | |
144 case ui::ET_TOUCH_RELEASED: | |
145 case ui::ET_TOUCH_CANCELLED: | |
146 case ui::ET_TOUCH_MOVED: { | |
147 // The touch point should have been added to the event from an earlier | |
148 // _PRESSED event. So find that. | |
149 // At the moment, only a maximum of 4 touch-points are allowed. So a | |
150 // simple loop should be sufficient. | |
151 for (unsigned i = 0; i < web_event->touchesLength; ++i) { | |
152 point = web_event->touches + i; | |
153 if (point->id == event.touch_id()) | |
154 break; | |
155 point = NULL; | |
156 } | |
157 break; | |
158 } | |
159 default: | |
160 DLOG(WARNING) << "Unknown touch event " << event.type(); | |
161 break; | |
162 } | |
163 | |
164 if (!point) | |
165 return NULL; | |
166 | |
167 // The spec requires the radii values to be positive (and 1 when unknown). | |
168 point->radiusX = std::max(1.f, event.radius_x()); | |
169 point->radiusY = std::max(1.f, event.radius_y()); | |
170 point->rotationAngle = event.rotation_angle(); | |
171 point->force = event.force(); | |
172 | |
173 // Update the location and state of the point. | |
174 point->state = TouchPointStateFromEvent(event); | |
175 point->position.x = event.x(); | |
176 point->position.y = event.y(); | |
177 | |
178 const gfx::PointF& root_point = event.root_location_f(); | |
179 point->screenPosition.x = root_point.x(); | |
180 point->screenPosition.y = root_point.y(); | |
181 | |
182 // Mark the rest of the points as stationary. | |
183 for (unsigned i = 0; i < web_event->touchesLength; ++i) { | |
184 blink::WebTouchPoint* iter = web_event->touches + i; | |
185 if (iter != point) | |
186 iter->state = blink::WebTouchPoint::StateStationary; | |
187 } | |
188 | |
189 // Update the type of the touch event. | |
190 WebTouchEventTraits::ResetType(TouchEventTypeFromEvent(event), | |
191 event.time_stamp().InSecondsF(), | |
192 web_event); | |
193 web_event->causesScrollingIfUncanceled = event.may_cause_scrolling(); | |
194 web_event->modifiers = EventFlagsToWebEventModifiers(event.flags()); | |
195 | |
196 return point; | |
197 } | |
198 | |
199 } // namespace content | 100 } // namespace content |
OLD | NEW |