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

Side by Side Diff: ui/base/gestures/gesture_sequence.cc

Issue 10958053: Fix drift while scrolling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed spurious whitespace change Created 8 years, 3 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 | Annotate | Revision Log
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 "ui/base/gestures/gesture_sequence.h" 5 #include "ui/base/gestures/gesture_sequence.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 20 matching lines...) Expand all
31 }; 31 };
32 32
33 // ui::TouchStatus is mapped to TouchStatusInternal to simply indicate whether a 33 // ui::TouchStatus is mapped to TouchStatusInternal to simply indicate whether a
34 // processed touch-event should affect gesture-recognition or not. 34 // processed touch-event should affect gesture-recognition or not.
35 enum TouchStatusInternal { 35 enum TouchStatusInternal {
36 TSI_NOT_PROCESSED, // The touch-event should take-part into 36 TSI_NOT_PROCESSED, // The touch-event should take-part into
37 // gesture-recognition only if the touch-event has not 37 // gesture-recognition only if the touch-event has not
38 // been processed. 38 // been processed.
39 39
40 TSI_PROCESSED, // The touch-event should affect gesture-recognition only 40 TSI_PROCESSED, // The touch-event should affect gesture-recognition only
41 // if the touch-event has been processed. 41 // if the touch-event has been processed. In particular,
42 // this means that a JavaScript touch handler called
43 // |preventDefault| on the associated touch event.
sadrul 2012/09/21 23:09:40 This is also for touch-events that were processed
rjkroege 2012/09/24 13:53:16 Done.
42 44
43 TSI_ALWAYS // The touch-event should always affect gesture 45 TSI_ALWAYS // The touch-event should always affect gesture
44 // recognition. 46 // recognition.
45 }; 47 };
46 48
47 // Get equivalent TouchState from EventType |type|. 49 // Get equivalent TouchState from EventType |type|.
48 TouchState TouchEventTypeToTouchState(ui::EventType type) { 50 TouchState TouchEventTypeToTouchState(ui::EventType type) {
49 switch (type) { 51 switch (type) {
50 case ui::ET_TOUCH_RELEASED: 52 case ui::ET_TOUCH_RELEASED:
51 return TS_RELEASED; 53 return TS_RELEASED;
(...skipping 30 matching lines...) Expand all
82 GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED = 84 GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED =
83 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_RELEASED, TSI_NOT_PROCESSED), 85 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_RELEASED, TSI_NOT_PROCESSED),
84 86
85 GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED = 87 GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED =
86 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_RELEASED, TSI_PROCESSED), 88 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_RELEASED, TSI_PROCESSED),
87 89
88 // Ignore processed touch-move events until gesture-scroll starts. 90 // Ignore processed touch-move events until gesture-scroll starts.
89 GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED = 91 GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED =
90 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_MOVED, TSI_NOT_PROCESSED), 92 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_MOVED, TSI_NOT_PROCESSED),
91 93
94 GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED =
95 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_MOVED, TSI_PROCESSED),
96
92 GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY = 97 GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY =
93 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_STATIONARY, TSI_NOT_PROCESSED), 98 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_STATIONARY, TSI_NOT_PROCESSED),
94 99
95 GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED = 100 GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED =
96 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_CANCELLED, TSI_ALWAYS), 101 G(GS_PENDING_SYNTHETIC_CLICK, 0, TS_CANCELLED, TSI_ALWAYS),
97 102
98 GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED = 103 GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED =
99 G(GS_PENDING_SYNTHETIC_CLICK, 1, TS_PRESSED, TSI_NOT_PROCESSED), 104 G(GS_PENDING_SYNTHETIC_CLICK, 1, TS_PRESSED, TSI_NOT_PROCESSED),
100 105
101 GST_SCROLL_FIRST_RELEASED = 106 GST_SCROLL_FIRST_RELEASED =
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 CHECK((touch_id & 0xfff) == touch_id); 212 CHECK((touch_id & 0xfff) == touch_id);
208 TouchState touch_state = TouchEventTypeToTouchState(type); 213 TouchState touch_state = TouchEventTypeToTouchState(type);
209 EdgeStateSignatureType signature = static_cast<EdgeStateSignatureType> 214 EdgeStateSignatureType signature = static_cast<EdgeStateSignatureType>
210 (G(gesture_state, touch_id, touch_state, touch_status)); 215 (G(gesture_state, touch_id, touch_state, touch_status));
211 216
212 switch (signature) { 217 switch (signature) {
213 case GST_NO_GESTURE_FIRST_PRESSED: 218 case GST_NO_GESTURE_FIRST_PRESSED:
214 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED: 219 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED:
215 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED: 220 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED:
216 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED: 221 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED:
222 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
217 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY: 223 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY:
218 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED: 224 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
219 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED: 225 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
220 case GST_SCROLL_FIRST_RELEASED: 226 case GST_SCROLL_FIRST_RELEASED:
221 case GST_SCROLL_FIRST_MOVED: 227 case GST_SCROLL_FIRST_MOVED:
222 case GST_SCROLL_FIRST_CANCELLED: 228 case GST_SCROLL_FIRST_CANCELLED:
223 case GST_SCROLL_SECOND_PRESSED: 229 case GST_SCROLL_SECOND_PRESSED:
224 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED: 230 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED:
225 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED_HANDLED: 231 case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED_HANDLED:
226 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED: 232 case GST_PENDING_TWO_FINGER_TAP_SECOND_RELEASED:
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 unsigned int ComputeTouchBitmask(const GesturePoint* points) { 273 unsigned int ComputeTouchBitmask(const GesturePoint* points) {
268 unsigned int touch_bitmask = 0; 274 unsigned int touch_bitmask = 0;
269 for (int i = 0; i < GestureSequence::kMaxGesturePoints; ++i) { 275 for (int i = 0; i < GestureSequence::kMaxGesturePoints; ++i) {
270 if (points[i].in_use()) 276 if (points[i].in_use())
271 touch_bitmask |= 1 << points[i].touch_id(); 277 touch_bitmask |= 1 << points[i].touch_id();
272 } 278 }
273 return touch_bitmask; 279 return touch_bitmask;
274 } 280 }
275 281
276 float CalibrateFlingVelocity(float velocity) { 282 float CalibrateFlingVelocity(float velocity) {
277 // TODO(sad|rjkroege): fling-curve is currently configured to work well with
278 // touchpad scroll-events. This curve needs to be adjusted to work correctly
279 // with both touchpad and touchscreen. Until then, scale quadratically.
280 // http://crbug.com/120154
281 const float velocity_scaling = 283 const float velocity_scaling =
282 GestureConfiguration::touchscreen_fling_acceleration_adjustment(); 284 GestureConfiguration::touchscreen_fling_acceleration_adjustment();
283 return velocity_scaling * velocity; 285 return velocity_scaling * velocity;
284 } 286 }
285 287
286 } // namespace 288 } // namespace
287 289
288 //////////////////////////////////////////////////////////////////////////////// 290 ////////////////////////////////////////////////////////////////////////////////
289 // GestureSequence Public: 291 // GestureSequence Public:
290 292
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 break; 376 break;
375 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED: 377 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED:
376 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY: 378 case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY:
377 if (ScrollStart(event, point, gestures.get())) { 379 if (ScrollStart(event, point, gestures.get())) {
378 PrependTapCancelGestureEvent(point, gestures.get()); 380 PrependTapCancelGestureEvent(point, gestures.get());
379 set_state(GS_SCROLL); 381 set_state(GS_SCROLL);
380 if (ScrollUpdate(event, point, gestures.get())) 382 if (ScrollUpdate(event, point, gestures.get()))
381 point.UpdateForScroll(); 383 point.UpdateForScroll();
382 } 384 }
383 break; 385 break;
386 case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
387 point.UpdateForScroll();
388 break;
384 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED: 389 case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED:
385 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED: 390 case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
386 PrependTapCancelGestureEvent(point, gestures.get()); 391 PrependTapCancelGestureEvent(point, gestures.get());
387 set_state(GS_NO_GESTURE); 392 set_state(GS_NO_GESTURE);
388 break; 393 break;
389 case GST_SCROLL_FIRST_MOVED: 394 case GST_SCROLL_FIRST_MOVED:
390 if (scroll_type_ == ST_VERTICAL || 395 if (scroll_type_ == ST_VERTICAL ||
391 scroll_type_ == ST_HORIZONTAL) 396 scroll_type_ == ST_HORIZONTAL)
392 BreakRailScroll(event, point, gestures.get()); 397 BreakRailScroll(event, point, gestures.get());
393 if (ScrollUpdate(event, point, gestures.get())) 398 if (ScrollUpdate(event, point, gestures.get()))
rjkroege 2012/09/21 22:50:38 oops.
rjkroege 2012/09/24 13:53:16 Done.
394 point.UpdateForScroll(); 399 point.UpdateForScroll();
395 break; 400 break;
396 case GST_SCROLL_FIRST_RELEASED: 401 case GST_SCROLL_FIRST_RELEASED:
397 case GST_SCROLL_FIRST_CANCELLED: 402 case GST_SCROLL_FIRST_CANCELLED:
398 ScrollEnd(event, point, gestures.get()); 403 ScrollEnd(event, point, gestures.get());
399 set_state(GS_NO_GESTURE); 404 set_state(GS_NO_GESTURE);
400 break; 405 break;
401 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED: 406 case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
402 PrependTapCancelGestureEvent(point, gestures.get()); 407 PrependTapCancelGestureEvent(point, gestures.get());
403 // fall through 408 // fall through
404 case GST_SCROLL_SECOND_PRESSED: 409 case GST_SCROLL_SECOND_PRESSED:
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 location, 701 location,
697 flags_, 702 flags_,
698 base::Time::FromDoubleT(point.last_touch_time()), 703 base::Time::FromDoubleT(point.last_touch_time()),
699 1 << point.touch_id())); 704 1 << point.touch_id()));
700 } 705 }
701 } 706 }
702 707
703 void GestureSequence::AppendScrollGestureUpdate(GesturePoint& point, 708 void GestureSequence::AppendScrollGestureUpdate(GesturePoint& point,
704 const gfx::Point& location, 709 const gfx::Point& location,
705 Gestures* gestures) { 710 Gestures* gestures) {
706 gfx::Point current_center = bounding_box_.CenterPoint(); 711 int dx, dy;
707 int dx = current_center.x() - bounding_box_last_center_.x(); 712 if (point_count_ == 1) {
708 int dy = current_center.y() - bounding_box_last_center_.y(); 713 dx = round(point.x_delta());
714 dy = round(point.y_delta());
715 } else {
716 gfx::Point current_center = bounding_box_.CenterPoint();
717 dx = current_center.x() - bounding_box_last_center_.x();
718 dy = current_center.y() - bounding_box_last_center_.y();
719 }
709 if (scroll_type_ == ST_HORIZONTAL) 720 if (scroll_type_ == ST_HORIZONTAL)
710 dy = 0; 721 dy = 0;
711 else if (scroll_type_ == ST_VERTICAL) 722 else if (scroll_type_ == ST_VERTICAL)
712 dx = 0; 723 dx = 0;
713 if (dx == 0 && dy == 0) 724 if (dx == 0 && dy == 0)
714 return; 725 return;
715 726
716 GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE, dx, dy); 727 GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE, dx, dy);
717 details.SetScrollVelocity( 728 details.SetScrollVelocity(
718 scroll_type_ == ST_VERTICAL ? 0 : point.XVelocity(), 729 scroll_type_ == ST_VERTICAL ? 0 : point.XVelocity(),
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 return; 1080 return;
1070 1081
1071 // Since long press timer has been started, there should be a non-NULL point. 1082 // Since long press timer has been started, there should be a non-NULL point.
1072 const GesturePoint* point = GetPointByPointId(0); 1083 const GesturePoint* point = GetPointByPointId(0);
1073 if (!ui::gestures::IsInsideManhattanSquare(point->first_touch_position(), 1084 if (!ui::gestures::IsInsideManhattanSquare(point->first_touch_position(),
1074 event.location())) 1085 event.location()))
1075 long_press_timer_->Stop(); 1086 long_press_timer_->Stop();
1076 } 1087 }
1077 1088
1078 } // namespace ui 1089 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698