Chromium Code Reviews| 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 "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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |