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

Side by Side Diff: content/browser/renderer_host/input/fling/flinger.cc

Issue 41703006: Move fling implementation from renderer to browser: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: patch Created 7 years, 1 month 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
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/input/fling/flinger.h"
6
7 namespace content {
8
9 const float kFrameRate = 60;
10
11 Flinger::Flinger(FlingHelper* helper)
12 : helper_(helper),
13 fling_in_progress_(false),
14 ignore_next_tap_(false),
15 ignore_next_click_(false),
16 fling_start_time_secs_(0),
17 fling_source_(blink::WebGestureEvent::Touchscreen) {}
18
19 bool Flinger::HandleGestureEvent(
20 const GestureEventWithLatencyInfo& gesture_event) {
21 switch (gesture_event.event.type) {
22 case blink::WebInputEvent::GestureTap:
23 if (ignore_next_tap_) {
24 ignore_next_tap_ = false;
25 return true;
26 }
27 break;
28 case blink::WebInputEvent::GestureFlingStart:
29 // Ignore zero velocity fling starts
30 if (gesture_event.event.data.flingStart.velocityX == 0 &&
31 gesture_event.event.data.flingStart.velocityY == 0)
32 return true;
33 fling_modifier_ = gesture_event.event.modifiers;
34 fling_start_position_ = gfx::Point(gesture_event.event.x,
35 gesture_event.event.y);
36 fling_start_global_position_ = gfx::Point(gesture_event.event.globalX,
37 gesture_event.event.globalY);
38 fling_start_time_secs_ = (base::TimeTicks::Now() -
39 base::TimeTicks()).InSecondsF();
40 fling_source_ = gesture_event.event.sourceDevice;
41 fling_curve_.reset(FlingCurve::Create(
42 gesture_event.event.sourceDevice,
43 gfx::PointF(gesture_event.event.data.flingStart.velocityX,
44 gesture_event.event.data.flingStart.velocityY),
45 gfx::Point()));
46 fling_in_progress_ = true;
47 // TODO(varunjain): Use vsync instead of this timer.
48 StartCurveTimer();
49 return true;
50 case blink::WebInputEvent::GestureShowPress:
51 case blink::WebInputEvent::GestureTapDown:
52 return ignore_next_tap_;
53 case blink::WebInputEvent::GestureFlingCancel:
54 ignore_next_tap_ = false;
55 ignore_next_click_ = false;
56 if (fling_in_progress_) {
57 if (gesture_event.event.sourceDevice ==
58 blink::WebGestureEvent::Touchscreen)
59 ignore_next_tap_ = true;
60 else
61 ignore_next_click_ = true;
62 }
63 StopFlingAndCleanup();
64 return true;
65 default:
66 ignore_next_tap_ = false;
67 break;
68 }
69 return false;
70 }
71
72 bool Flinger::HandleMouseEvent(const MouseEventWithLatencyInfo& mouse_event) {
73 switch (mouse_event.event.type) {
74 case blink::WebInputEvent::MouseDown:
75 case blink::WebInputEvent::MouseUp:
76 return ignore_next_click_;
77 default:
78 StopFlingAndCleanup();
79 ignore_next_click_ = false;
80 break;
81 }
82 return false;
83 }
84
85 bool Flinger::HandleWheelEvent(
86 const MouseWheelEventWithLatencyInfo& wheel_event) {
87 StopFlingAndCleanup();
88 return false;
89 }
90
91 bool Flinger::HandleKeyboardEvent() {
92 StopFlingAndCleanup();
93 return false;
94 }
95
96 void Flinger::ProcessEventAck(blink::WebInputEvent::Type type,
97 InputEventAckState ack_result,
98 const ui::LatencyInfo& latency) {
99 if (!fling_in_progress_)
100 return;
101
102 if ((type == blink::WebInputEvent::GestureScrollUpdate ||
103 type == blink::WebInputEvent::MouseWheel) &&
104 ack_result == content::INPUT_EVENT_ACK_STATE_NOT_CONSUMED)
105 StopFlingAndCleanup();
106 }
107
108 void Flinger::ScrollBy(const gfx::PointF& delta) {
109 if (fling_source_ == blink::WebGestureEvent::Touchpad) {
110 blink::WebMouseWheelEvent synthetic_wheel;
111 const float tick_divisor = 120;
112 synthetic_wheel.type = blink::WebInputEvent::MouseWheel;
113 synthetic_wheel.deltaX = delta.x();
114 synthetic_wheel.deltaY = delta.y();
115 synthetic_wheel.wheelTicksX = delta.x() / tick_divisor;
116 synthetic_wheel.wheelTicksY = delta.y() / tick_divisor;
117 synthetic_wheel.hasPreciseScrollingDeltas = true;
118 synthetic_wheel.x = fling_start_position_.x();
119 synthetic_wheel.y = fling_start_position_.y();
120 synthetic_wheel.globalX = fling_start_global_position_.x();
121 synthetic_wheel.globalY = fling_start_global_position_.y();
122 synthetic_wheel.modifiers = fling_modifier_;
123 helper_->SendEventForFling(synthetic_wheel);
124 } else {
125 blink::WebGestureEvent synthetic_gesture;
126 synthetic_gesture.type = blink::WebInputEvent::GestureScrollUpdate;
127 synthetic_gesture.data.scrollUpdate.deltaX = delta.x();
128 synthetic_gesture.data.scrollUpdate.deltaY = delta.y();
129 synthetic_gesture.x = fling_start_position_.x();
130 synthetic_gesture.y = fling_start_position_.y();
131 synthetic_gesture.globalX = fling_start_global_position_.x();
132 synthetic_gesture.globalY = fling_start_global_position_.y();
133 synthetic_gesture.modifiers = fling_modifier_;
134 synthetic_gesture.sourceDevice = blink::WebGestureEvent::Touchscreen;
135 helper_->SendEventForFling(synthetic_gesture);
136 }
137 }
138
139 void Flinger::NotifyCurrentFlingVelocity(const gfx::PointF& velocity) {
140 }
141
142 void Flinger::StartCurveTimer() {
143 if (curve_timer_.IsRunning())
144 curve_timer_.Stop();
145 // TODO(varunjain): Use vsync instead of this timer.
146 curve_timer_.Start(FROM_HERE,
147 base::TimeDelta::FromMilliseconds(1000.0 / kFrameRate),
148 this,
149 &Flinger::CurveTimerFired);
150 }
151
152 void Flinger::CurveTimerFired() {
153 if (!fling_in_progress_)
154 return;
155 double now = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
156 bool curve_done = !fling_curve_->Apply(now - fling_start_time_secs_, this);
157 if (!curve_done)
158 StartCurveTimer();
159 else
160 StopFlingAndCleanup();
161 }
162
163 void Flinger::StopFlingAndCleanup() {
164 if (!fling_in_progress_)
165 return;
166 curve_timer_.Stop();
167 fling_curve_.reset();
168 fling_in_progress_ = false;
169 helper_->FlingFinished(fling_source_);
170 }
171
172 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/input/fling/flinger.h ('k') | content/browser/renderer_host/input/fling/flinger_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698