Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_win.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc |
| index 5e71c92a61e31652ca3463a8b13792543d31eaa6..03da2f86602c1ededb8ed324d86566b7a22135f0 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_win.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_win.cc |
| @@ -499,7 +499,7 @@ class LocalTouchEvent : |
| } |
| // Returns a copy of the touch event at the specified index. |
| - const LocalTouchEvent& Index( size_t index) { |
| + const LocalTouchEvent& Index( size_t index) const { |
| const int touch_history_size = 40; |
| static LocalTouchEvent touch_history[touch_history_size]; |
| static int touch_history_index; |
| @@ -538,11 +538,19 @@ class WebTouchState { |
| bool is_changed() { return touch_event_.data().changedTouchesLength != 0; } |
| void QueueEvents(ui::GestureConsumer* consumer, ui::GestureRecognizer* gr) { |
| + if (touch_event_.data().touchesLength > 0) |
| + touch_count_.push( touch_event_.data().touchesLength); |
|
sadrul
2012/07/05 17:00:54
no space after (
girard
2012/07/05 18:43:44
Done.
|
| for (size_t i = 0; i < touch_event_.data().touchesLength; ++i) { |
| gr->QueueTouchEventForGesture(consumer, touch_event_.Index(i)); |
| } |
| } |
| + int get_touch_count() { |
|
sadrul
2012/07/05 17:00:54
Perhaps GetNextTouchCount would be a better name f
girard
2012/07/05 18:43:44
Done.
|
| + int result = touch_count_.top(); |
| + touch_count_.pop(); |
| + return result; |
| + } |
| + |
| private: |
| typedef std::map<unsigned int, int> MapType; |
| @@ -560,6 +568,12 @@ class WebTouchState { |
| // Remove any mappings that are no longer in use. |
| void RemoveExpiredMappings(); |
| + // The gesture recognizer processes touch events one at a time, but WebKit |
| + // (ForwardTouchEvent) takes a set of touch events. _touchCount_ tracks how |
|
sadrul
2012/07/05 17:00:54
|touch_count_| instead of _touchCount_
girard
2012/07/05 18:43:44
Done. Thanks.
|
| + // many individual touch events were sent to ForwardTouchEvent, so we can |
| + // send the correct number of AdvanceTouchQueue's |
| + std::stack<int> touch_count_; |
| + |
| LocalTouchEvent touch_event_; |
| const RenderWidgetHostViewWin* const window_; |
| @@ -1210,9 +1224,16 @@ void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) { |
| void RenderWidgetHostViewWin::ProcessTouchAck( |
| WebKit::WebInputEvent::Type type, bool processed) { |
| - scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
| - gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed)); |
| - ProcessGestures(gestures.get()); |
| + |
| + DCHECK(render_widget_host_->has_touch_handler() && |
| + touch_events_enabled_); |
| + |
| + int touchCount = touch_state_->get_touch_count(); |
| + for (int i = 0; i < touchCount; ++i) { |
| + scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
| + gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed)); |
| + ProcessGestures(gestures.get()); |
| + } |
| if (type == WebKit::WebInputEvent::TouchStart) |
| UpdateDesiredTouchMode(processed); |
| @@ -1587,9 +1608,6 @@ void RenderWidgetHostViewWin::OnSetFocus(HWND window) { |
| render_widget_host_->GotFocus(); |
| render_widget_host_->SetActive(true); |
| - |
| - if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_) |
| - render_widget_host_->ForwardTouchEvent(touch_state_->touch_event()); |
| } |
| void RenderWidgetHostViewWin::OnKillFocus(HWND window) { |
| @@ -1599,9 +1617,6 @@ void RenderWidgetHostViewWin::OnKillFocus(HWND window) { |
| render_widget_host_->SetActive(false); |
| render_widget_host_->Blur(); |
| - |
| - if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_) |
| - render_widget_host_->ForwardTouchEvent(touch_state_->touch_event()); |
| } |
| void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) { |
| @@ -2297,15 +2312,18 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam, |
| for (size_t start = 0; start < total;) { |
| start += touch_state_->UpdateTouchPoints(points + start, total - start); |
| if (has_touch_handler) { |
| - if (touch_state_->is_changed()) |
| + if (touch_state_->is_changed()) { |
| render_widget_host_->ForwardTouchEvent(touch_state_->touch_event()); |
| - touch_state_->QueueEvents(this,gesture_recognizer_.get()); |
| + touch_state_->QueueEvents(this,gesture_recognizer_.get()); |
|
sadrul
2012/07/05 17:00:54
space after ,
|
| + } |
| } else { |
| - // TODO: This probably needs to be updated to call Next() |
| - scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
| - gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( |
| - *touch_state_->ui_touch_event(), ui::TOUCH_STATUS_UNKNOWN, this)); |
| - ProcessGestures(gestures.get()); |
| + const LocalTouchEvent *touch_event = touch_state_->ui_touch_event(); |
|
sadrul
2012/07/05 17:00:54
'LocatedTouchEvent* touch_event'
|
| + for (size_t i = 0; i < touch_event->data().touchesLength; ++i) { |
| + scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
| + gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( |
| + touch_event->Index(i), ui::TOUCH_STATUS_UNKNOWN, this)); |
| + this->ProcessGestures(gestures.get()); |
|
sadrul
2012/07/05 17:00:54
Is this |this->| bit necessary here?
girard
2012/07/05 18:43:44
Nope. Removed.
|
| + } |
| } |
| } |