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

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

Issue 10702096: Corrected issues with queued touch events. This fixes gestures in Windows. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fix for multi-touch gestures. We now track the number of touch events in each message, and send th… Created 8 years, 5 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
« no previous file with comments | « no previous file | ui/base/gestures/gesture_sequence.cc » ('j') | ui/base/gestures/gesture_sequence.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
+ }
}
}
« no previous file with comments | « no previous file | ui/base/gestures/gesture_sequence.cc » ('j') | ui/base/gestures/gesture_sequence.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698