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

Side by Side 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: More clean-up. 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 unified diff | Download patch
« no previous file with comments | « no previous file | ui/base/gestures/gesture_sequence.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/render_widget_host_view_win.h" 5 #include "content/browser/renderer_host/render_widget_host_view_win.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <peninputpanel_i.c> 9 #include <peninputpanel_i.c>
10 10
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 return data().touches[index_].radiusY; 492 return data().touches[index_].radiusY;
493 } 493 }
494 virtual float RotationAngle() const OVERRIDE { 494 virtual float RotationAngle() const OVERRIDE {
495 return data().touches[index_].rotationAngle; 495 return data().touches[index_].rotationAngle;
496 } 496 }
497 virtual float Force() const OVERRIDE { 497 virtual float Force() const OVERRIDE {
498 return data().touches[index_].force; 498 return data().touches[index_].force;
499 } 499 }
500 500
501 // Returns a copy of the touch event at the specified index. 501 // Returns a copy of the touch event at the specified index.
502 const LocalTouchEvent& Index( size_t index) { 502 const LocalTouchEvent& Index( size_t index) const {
503 const int touch_history_size = 40; 503 const int touch_history_size = 40;
504 static LocalTouchEvent touch_history[touch_history_size]; 504 static LocalTouchEvent touch_history[touch_history_size];
505 static int touch_history_index; 505 static int touch_history_index;
506 int current = (touch_history_index++ % touch_history_size); 506 int current = (touch_history_index++ % touch_history_size);
507 touch_history[current].data() = data(); 507 touch_history[current].data() = data();
508 touch_history[current].index_ = index; 508 touch_history[current].index_ = index;
509 return touch_history[current]; 509 return touch_history[current];
510 } 510 }
511 511
512 private: 512 private:
(...skipping 18 matching lines...) Expand all
531 bool ReleaseTouchPoints(); 531 bool ReleaseTouchPoints();
532 532
533 // The contained WebTouchEvent. 533 // The contained WebTouchEvent.
534 const WebKit::WebTouchEvent& touch_event() { return touch_event_.data(); } 534 const WebKit::WebTouchEvent& touch_event() { return touch_event_.data(); }
535 const LocalTouchEvent* ui_touch_event() { return &touch_event_; } 535 const LocalTouchEvent* ui_touch_event() { return &touch_event_; }
536 536
537 // Returns if any touches are modified in the event. 537 // Returns if any touches are modified in the event.
538 bool is_changed() { return touch_event_.data().changedTouchesLength != 0; } 538 bool is_changed() { return touch_event_.data().changedTouchesLength != 0; }
539 539
540 void QueueEvents(ui::GestureConsumer* consumer, ui::GestureRecognizer* gr) { 540 void QueueEvents(ui::GestureConsumer* consumer, ui::GestureRecognizer* gr) {
541 if (touch_event_.data().touchesLength > 0)
542 touch_count_.push(touch_event_.data().touchesLength);
541 for (size_t i = 0; i < touch_event_.data().touchesLength; ++i) { 543 for (size_t i = 0; i < touch_event_.data().touchesLength; ++i) {
542 gr->QueueTouchEventForGesture(consumer, touch_event_.Index(i)); 544 gr->QueueTouchEventForGesture(consumer, touch_event_.Index(i));
543 } 545 }
544 } 546 }
545 547
548 int GetNextTouchCount() {
549 int result = touch_count_.top();
550 touch_count_.pop();
551 return result;
552 }
553
546 private: 554 private:
547 typedef std::map<unsigned int, int> MapType; 555 typedef std::map<unsigned int, int> MapType;
548 556
549 // Adds a touch point or returns NULL if there's not enough space. 557 // Adds a touch point or returns NULL if there's not enough space.
550 WebKit::WebTouchPoint* AddTouchPoint(TOUCHINPUT* touch_input); 558 WebKit::WebTouchPoint* AddTouchPoint(TOUCHINPUT* touch_input);
551 559
552 // Copy details from a TOUCHINPUT to an existing WebTouchPoint, returning 560 // Copy details from a TOUCHINPUT to an existing WebTouchPoint, returning
553 // true if the resulting point is a stationary move. 561 // true if the resulting point is a stationary move.
554 bool UpdateTouchPoint(WebKit::WebTouchPoint* touch_point, 562 bool UpdateTouchPoint(WebKit::WebTouchPoint* touch_point,
555 TOUCHINPUT* touch_input); 563 TOUCHINPUT* touch_input);
556 564
557 // Find (or create) a mapping for _os_touch_id_. 565 // Find (or create) a mapping for _os_touch_id_.
558 unsigned int GetMappedTouch(unsigned int os_touch_id); 566 unsigned int GetMappedTouch(unsigned int os_touch_id);
559 567
560 // Remove any mappings that are no longer in use. 568 // Remove any mappings that are no longer in use.
561 void RemoveExpiredMappings(); 569 void RemoveExpiredMappings();
562 570
571 // The gesture recognizer processes touch events one at a time, but WebKit
572 // (ForwardTouchEvent) takes a set of touch events. |touchCount_| tracks how
573 // many individual touch events were sent to ForwardTouchEvent, so we can
574 // send the correct number of AdvanceTouchQueue's
575 std::stack<int> touch_count_;
576
563 LocalTouchEvent touch_event_; 577 LocalTouchEvent touch_event_;
564 const RenderWidgetHostViewWin* const window_; 578 const RenderWidgetHostViewWin* const window_;
565 579
566 // Maps OS touch Id's into an internal (WebKit-friendly) touch-id. 580 // Maps OS touch Id's into an internal (WebKit-friendly) touch-id.
567 // WebKit expects small consecutive integers, starting at 0. 581 // WebKit expects small consecutive integers, starting at 0.
568 MapType touch_map_; 582 MapType touch_map_;
569 583
570 DISALLOW_COPY_AND_ASSIGN(WebTouchState); 584 DISALLOW_COPY_AND_ASSIGN(WebTouchState);
571 }; 585 };
572 586
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 callback.Run(result); 1217 callback.Run(result);
1204 } 1218 }
1205 1219
1206 void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) { 1220 void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) {
1207 content::RenderWidgetHostViewBase::SetBackground(background); 1221 content::RenderWidgetHostViewBase::SetBackground(background);
1208 render_widget_host_->SetBackground(background); 1222 render_widget_host_->SetBackground(background);
1209 } 1223 }
1210 1224
1211 void RenderWidgetHostViewWin::ProcessTouchAck( 1225 void RenderWidgetHostViewWin::ProcessTouchAck(
1212 WebKit::WebInputEvent::Type type, bool processed) { 1226 WebKit::WebInputEvent::Type type, bool processed) {
1213 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 1227
1214 gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed)); 1228 DCHECK(render_widget_host_->has_touch_handler() &&
1215 ProcessGestures(gestures.get()); 1229 touch_events_enabled_);
1230
1231 int touchCount = touch_state_->GetNextTouchCount();
1232 for (int i = 0; i < touchCount; ++i) {
1233 scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
1234 gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed));
1235 ProcessGestures(gestures.get());
1236 }
1216 1237
1217 if (type == WebKit::WebInputEvent::TouchStart) 1238 if (type == WebKit::WebInputEvent::TouchStart)
1218 UpdateDesiredTouchMode(processed); 1239 UpdateDesiredTouchMode(processed);
1219 } 1240 }
1220 1241
1221 void RenderWidgetHostViewWin::SetToGestureMode() { 1242 void RenderWidgetHostViewWin::SetToGestureMode() {
1222 if (base::win::GetVersion() < base::win::VERSION_WIN7) 1243 if (base::win::GetVersion() < base::win::VERSION_WIN7)
1223 return; 1244 return;
1224 UnregisterTouchWindow(m_hWnd); 1245 UnregisterTouchWindow(m_hWnd);
1225 // Single finger panning is consistent with other windows applications. 1246 // Single finger panning is consistent with other windows applications.
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 void RenderWidgetHostViewWin::OnSetFocus(HWND window) { 1601 void RenderWidgetHostViewWin::OnSetFocus(HWND window) {
1581 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnSetFocus"); 1602 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnSetFocus");
1582 if (!render_widget_host_) 1603 if (!render_widget_host_)
1583 return; 1604 return;
1584 1605
1585 if (GetBrowserAccessibilityManager()) 1606 if (GetBrowserAccessibilityManager())
1586 GetBrowserAccessibilityManager()->GotFocus(); 1607 GetBrowserAccessibilityManager()->GotFocus();
1587 1608
1588 render_widget_host_->GotFocus(); 1609 render_widget_host_->GotFocus();
1589 render_widget_host_->SetActive(true); 1610 render_widget_host_->SetActive(true);
1590
1591 if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_)
1592 render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
1593 } 1611 }
1594 1612
1595 void RenderWidgetHostViewWin::OnKillFocus(HWND window) { 1613 void RenderWidgetHostViewWin::OnKillFocus(HWND window) {
1596 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnKillFocus"); 1614 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnKillFocus");
1597 if (!render_widget_host_) 1615 if (!render_widget_host_)
1598 return; 1616 return;
1599 1617
1600 render_widget_host_->SetActive(false); 1618 render_widget_host_->SetActive(false);
1601 render_widget_host_->Blur(); 1619 render_widget_host_->Blur();
1602
1603 if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_)
1604 render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
1605 } 1620 }
1606 1621
1607 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) { 1622 void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) {
1608 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnCaptureChanged"); 1623 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnCaptureChanged");
1609 if (render_widget_host_) 1624 if (render_widget_host_)
1610 render_widget_host_->LostCapture(); 1625 render_widget_host_->LostCapture();
1611 } 1626 }
1612 1627
1613 void RenderWidgetHostViewWin::OnCancelMode() { 1628 void RenderWidgetHostViewWin::OnCancelMode() {
1614 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnCancelMode"); 1629 TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnCancelMode");
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
2290 return 0; 2305 return 0;
2291 } 2306 }
2292 2307
2293 bool has_touch_handler = render_widget_host_->has_touch_handler() && 2308 bool has_touch_handler = render_widget_host_->has_touch_handler() &&
2294 touch_events_enabled_; 2309 touch_events_enabled_;
2295 2310
2296 // Send a copy of the touch events on to the gesture recognizer. 2311 // Send a copy of the touch events on to the gesture recognizer.
2297 for (size_t start = 0; start < total;) { 2312 for (size_t start = 0; start < total;) {
2298 start += touch_state_->UpdateTouchPoints(points + start, total - start); 2313 start += touch_state_->UpdateTouchPoints(points + start, total - start);
2299 if (has_touch_handler) { 2314 if (has_touch_handler) {
2300 if (touch_state_->is_changed()) 2315 if (touch_state_->is_changed()) {
2301 render_widget_host_->ForwardTouchEvent(touch_state_->touch_event()); 2316 render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
2302 touch_state_->QueueEvents(this,gesture_recognizer_.get()); 2317 touch_state_->QueueEvents(this, gesture_recognizer_.get());
2318 }
2303 } else { 2319 } else {
2304 // TODO: This probably needs to be updated to call Next() 2320 const LocalTouchEvent *touch_event = touch_state_->ui_touch_event();
Ben Goodger (Google) 2012/07/11 16:12:58 LocalTouchEvent*
2305 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 2321 for (size_t i = 0; i < touch_event->data().touchesLength; ++i) {
2306 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( 2322 scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
2307 *touch_state_->ui_touch_event(), ui::TOUCH_STATUS_UNKNOWN, this)); 2323 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
2308 ProcessGestures(gestures.get()); 2324 touch_event->Index(i), ui::TOUCH_STATUS_UNKNOWN, this));
2325 ProcessGestures(gestures.get());
2326 }
2309 } 2327 }
2310 } 2328 }
2311 2329
2312 CloseTouchInputHandle((HTOUCHINPUT)lparam); 2330 CloseTouchInputHandle((HTOUCHINPUT)lparam);
2313 2331
2314 return 0; 2332 return 0;
2315 } 2333 }
2316 2334
2317 void RenderWidgetHostViewWin::ProcessGestures( 2335 void RenderWidgetHostViewWin::ProcessGestures(
2318 ui::GestureRecognizer::Gestures* gestures) { 2336 ui::GestureRecognizer::Gestures* gestures) {
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
3165 void RenderWidgetHostViewWin::ResetPointerDownContext() { 3183 void RenderWidgetHostViewWin::ResetPointerDownContext() {
3166 // If the default focus on the page is on an edit field and we did not 3184 // If the default focus on the page is on an edit field and we did not
3167 // receive a focus change in the context of a pointer down message, it means 3185 // receive a focus change in the context of a pointer down message, it means
3168 // that the pointer down message occurred on the edit field and we should 3186 // that the pointer down message occurred on the edit field and we should
3169 // display the on screen keyboard 3187 // display the on screen keyboard
3170 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_) 3188 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_)
3171 DisplayOnScreenKeyboardIfNeeded(); 3189 DisplayOnScreenKeyboardIfNeeded();
3172 received_focus_change_after_pointer_down_ = false; 3190 received_focus_change_after_pointer_down_ = false;
3173 pointer_down_context_ = false; 3191 pointer_down_context_ = false;
3174 } 3192 }
OLDNEW
« no previous file with comments | « no previous file | ui/base/gestures/gesture_sequence.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698