OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "athena/wm/bezel_controller.h" | 5 #include "athena/wm/bezel_controller.h" |
6 | 6 |
7 #include "ui/aura/window.h" | 7 #include "ui/aura/window.h" |
8 #include "ui/events/event_handler.h" | 8 #include "ui/events/event_handler.h" |
9 #include "ui/gfx/display.h" | |
10 #include "ui/gfx/geometry/point_conversions.h" | |
11 #include "ui/gfx/screen.h" | |
12 #include "ui/wm/core/coordinate_conversion.h" | |
9 | 13 |
10 namespace athena { | 14 namespace athena { |
11 namespace { | 15 namespace { |
12 | 16 |
13 // Using bezel swipes, the first touch that is registered is usually within | 17 // Using bezel swipes, the first touch that is registered is usually within |
14 // 5-10 pixels from the edge, but sometimes as far as 29 pixels away. | 18 // 5-10 pixels from the edge, but sometimes as far as 29 pixels away. |
15 // So setting this width fairly high for now. | 19 // So setting this width fairly high for now. |
16 const float kBezelWidth = 20.0f; | 20 const float kBezelWidth = 20.0f; |
17 | 21 |
18 const float kScrollPositionNone = -100; | 22 const float kScrollDeltaNone = 0; |
19 | 23 |
20 bool ShouldProcessGesture(ui::EventType event_type) { | 24 bool ShouldProcessGesture(ui::EventType event_type) { |
21 return event_type == ui::ET_GESTURE_SCROLL_UPDATE || | 25 return event_type == ui::ET_GESTURE_SCROLL_UPDATE || |
22 event_type == ui::ET_GESTURE_SCROLL_BEGIN || | 26 event_type == ui::ET_GESTURE_SCROLL_BEGIN || |
23 event_type == ui::ET_GESTURE_BEGIN || | 27 event_type == ui::ET_GESTURE_BEGIN || |
24 event_type == ui::ET_GESTURE_END; | 28 event_type == ui::ET_GESTURE_END; |
25 } | 29 } |
26 | 30 |
31 gfx::Display GetDisplay(aura::Window* window) { | |
32 gfx::Screen* screen = gfx::Screen::GetScreenFor(window); | |
33 return screen->GetDisplayNearestWindow(window); | |
34 } | |
35 | |
27 } // namespace | 36 } // namespace |
28 | 37 |
29 BezelController::BezelController(aura::Window* container) | 38 BezelController::BezelController(aura::Window* container) |
30 : container_(container), | 39 : container_(container), |
31 state_(NONE), | 40 state_(NONE), |
32 scroll_bezel_(BEZEL_NONE), | 41 scroll_bezel_(BEZEL_NONE), |
33 scroll_target_(NULL), | 42 scroll_target_(NULL), |
34 left_right_delegate_(NULL) { | 43 left_right_delegate_(NULL) { |
35 } | 44 } |
36 | 45 |
37 float BezelController::GetDistance(const gfx::PointF& position, | 46 float BezelController::GetDistance(const gfx::PointF& location, |
Jun Mukai
2014/08/05 21:13:38
Now GetDistance doesn't refer to any fields of thi
mfomitchev
2014/08/06 18:11:32
It's private, so I moved it to the anonymous names
Jun Mukai
2014/08/06 19:56:10
+1
| |
47 aura::Window* window, | |
38 BezelController::Bezel bezel) { | 48 BezelController::Bezel bezel) { |
39 DCHECK(bezel == BEZEL_LEFT || bezel == BEZEL_RIGHT); | 49 DCHECK(bezel == BEZEL_LEFT || bezel == BEZEL_RIGHT); |
50 // Convert location from window coordinates to screen coordinates. | |
51 gfx::Point point_in_screen(gfx::ToRoundedPoint(location)); | |
Jun Mukai
2014/08/05 21:13:38
RoundedPoint is slightly different from your previ
mfomitchev
2014/08/06 18:11:32
Yes, I think ToRoundedPoint is better - we want th
| |
52 wm::ConvertPointToScreen(window, &point_in_screen); | |
40 return bezel == BEZEL_LEFT | 53 return bezel == BEZEL_LEFT |
41 ? position.x() | 54 ? point_in_screen.x() |
42 : position.x() - container_->GetBoundsInScreen().width(); | 55 : point_in_screen.x() - GetDisplay(window).bounds().width(); |
43 } | 56 } |
44 | 57 |
45 void BezelController::SetState(BezelController::State state, | 58 void BezelController::SetState(BezelController::State state) { |
46 const gfx::PointF& scroll_position) { | 59 // Use SetState(State, float) if |state| is one of the BEZEL_SCROLLING states. |
60 DCHECK_NE(state, BEZEL_SCROLLING_TWO_FINGERS); | |
61 DCHECK_NE(state, BEZEL_SCROLLING_ONE_FINGER); | |
62 SetState(state, kScrollDeltaNone); | |
63 } | |
64 | |
65 void BezelController::SetState( | |
66 BezelController::State state, float scroll_delta) { | |
47 if (!left_right_delegate_ || state == state_) | 67 if (!left_right_delegate_ || state == state_) |
48 return; | 68 return; |
49 | 69 |
50 if (state == BEZEL_SCROLLING_TWO_FINGERS) { | 70 if (state == BEZEL_SCROLLING_TWO_FINGERS) |
51 float delta = GetDistance(scroll_position, scroll_bezel_); | 71 left_right_delegate_->ScrollBegin(scroll_bezel_, scroll_delta); |
52 left_right_delegate_->ScrollBegin(scroll_bezel_, delta); | 72 else if (state_ == BEZEL_SCROLLING_TWO_FINGERS) |
53 } else if (state_ == BEZEL_SCROLLING_TWO_FINGERS) { | |
54 left_right_delegate_->ScrollEnd(); | 73 left_right_delegate_->ScrollEnd(); |
55 } | |
56 state_ = state; | 74 state_ = state; |
57 if (state == NONE) { | 75 if (state == NONE) { |
58 scroll_bezel_ = BEZEL_NONE; | 76 scroll_bezel_ = BEZEL_NONE; |
59 scroll_target_ = NULL; | 77 scroll_target_ = NULL; |
60 } | 78 } |
61 } | 79 } |
62 | 80 |
63 // Only implemented for LEFT and RIGHT bezels ATM. | 81 // Only implemented for LEFT and RIGHT bezels ATM. |
64 BezelController::Bezel BezelController::GetBezel(const gfx::PointF& location) { | 82 BezelController::Bezel BezelController::GetBezel(const gfx::PointF& location) { |
83 int screen_width = GetDisplay(container_).bounds().width(); | |
65 if (location.x() < kBezelWidth) { | 84 if (location.x() < kBezelWidth) { |
66 return BEZEL_LEFT; | 85 return BEZEL_LEFT; |
67 } else if (location.x() > | 86 } else if (location.x() > screen_width - kBezelWidth) { |
68 container_->GetBoundsInScreen().width() - kBezelWidth) { | |
69 return BEZEL_RIGHT; | 87 return BEZEL_RIGHT; |
70 } else { | 88 } else { |
71 return BEZEL_NONE; | 89 return BEZEL_NONE; |
72 } | 90 } |
73 } | 91 } |
74 | 92 |
75 void BezelController::OnGestureEvent(ui::GestureEvent* event) { | 93 void BezelController::OnGestureEvent(ui::GestureEvent* event) { |
76 // TODO (mfomitchev): Currently we aren't retargetting or consuming any of the | 94 // TODO (mfomitchev): Currently we aren't retargetting or consuming any of the |
77 // touch events. This means that content can prevent the generation of gesture | 95 // touch events. This means that content can prevent the generation of gesture |
78 // events and two-finger scroll won't work. Possible solution to this problem | 96 // events and two-finger scroll won't work. Possible solution to this problem |
79 // is hosting our own gesture recognizer or retargetting touch events at the | 97 // is hosting our own gesture recognizer or retargetting touch events at the |
80 // bezel. | 98 // bezel. |
81 | 99 |
82 if (!left_right_delegate_) | 100 if (!left_right_delegate_) |
83 return; | 101 return; |
84 | 102 |
85 ui::EventType type = event->type(); | 103 ui::EventType type = event->type(); |
86 if (!ShouldProcessGesture(type)) | 104 if (!ShouldProcessGesture(type)) |
87 return; | 105 return; |
88 | 106 |
89 if (scroll_target_ && event->target() != scroll_target_) | 107 if (scroll_target_ && event->target() != scroll_target_) |
90 return; | 108 return; |
91 | 109 |
92 const gfx::PointF& event_location = event->location_f(); | 110 const gfx::PointF& event_location = event->location_f(); |
93 const ui::GestureEventDetails& event_details = event->details(); | 111 const ui::GestureEventDetails& event_details = event->details(); |
94 int num_touch_points = event_details.touch_points(); | 112 int num_touch_points = event_details.touch_points(); |
113 float scroll_delta = kScrollDeltaNone; | |
114 if (scroll_bezel_ != BEZEL_NONE) { | |
115 aura::Window* target_window = static_cast<aura::Window*> (event->target()); | |
116 scroll_delta = GetDistance( | |
117 event_location, target_window, scroll_bezel_); | |
118 } | |
95 | 119 |
96 if (type == ui::ET_GESTURE_BEGIN) { | 120 if (type == ui::ET_GESTURE_BEGIN) { |
97 if (num_touch_points > 2) { | 121 if (num_touch_points > 2) { |
98 SetState(IGNORE_CURRENT_SCROLL, | 122 SetState(IGNORE_CURRENT_SCROLL); |
99 gfx::Point(kScrollPositionNone, kScrollPositionNone)); | |
100 return; | 123 return; |
101 } | 124 } |
102 BezelController::Bezel event_bezel = GetBezel(event->location_f()); | 125 BezelController::Bezel event_bezel = GetBezel(event->location_f()); |
103 switch (state_) { | 126 switch (state_) { |
104 case NONE: | 127 case NONE: |
105 scroll_bezel_ = event_bezel; | 128 scroll_bezel_ = event_bezel; |
106 scroll_target_ = event->target(); | 129 scroll_target_ = event->target(); |
107 if (event_bezel != BEZEL_LEFT && event_bezel != BEZEL_RIGHT) { | 130 if (event_bezel != BEZEL_LEFT && event_bezel != BEZEL_RIGHT) |
108 SetState(IGNORE_CURRENT_SCROLL, | 131 SetState(IGNORE_CURRENT_SCROLL); |
109 gfx::Point(kScrollPositionNone, kScrollPositionNone)); | 132 else |
110 } else { | 133 SetState(BEZEL_GESTURE_STARTED); |
111 SetState(BEZEL_GESTURE_STARTED, event_location); | |
112 } | |
113 break; | 134 break; |
114 case IGNORE_CURRENT_SCROLL: | 135 case IGNORE_CURRENT_SCROLL: |
115 break; | 136 break; |
116 case BEZEL_GESTURE_STARTED: | 137 case BEZEL_GESTURE_STARTED: |
117 case BEZEL_SCROLLING_ONE_FINGER: | 138 case BEZEL_SCROLLING_ONE_FINGER: |
118 DCHECK_EQ(num_touch_points, 2); | 139 DCHECK_EQ(num_touch_points, 2); |
119 DCHECK(scroll_target_); | 140 DCHECK(scroll_target_); |
120 DCHECK_NE(scroll_bezel_, BEZEL_NONE); | 141 DCHECK_NE(scroll_bezel_, BEZEL_NONE); |
121 | 142 |
122 if (event_bezel != scroll_bezel_) { | 143 if (event_bezel != scroll_bezel_) { |
123 SetState(IGNORE_CURRENT_SCROLL, | 144 SetState(IGNORE_CURRENT_SCROLL); |
124 gfx::Point(kScrollPositionNone, kScrollPositionNone)); | |
125 return; | 145 return; |
126 } | 146 } |
127 if (state_ == BEZEL_SCROLLING_ONE_FINGER) | 147 if (state_ == BEZEL_SCROLLING_ONE_FINGER) |
128 SetState(BEZEL_SCROLLING_TWO_FINGERS, event_location); | 148 SetState(BEZEL_SCROLLING_TWO_FINGERS); |
129 break; | 149 break; |
130 case BEZEL_SCROLLING_TWO_FINGERS: | 150 case BEZEL_SCROLLING_TWO_FINGERS: |
131 // Should've exited above | 151 // Should've exited above |
132 NOTREACHED(); | 152 NOTREACHED(); |
133 break; | 153 break; |
134 } | 154 } |
135 } else if (type == ui::ET_GESTURE_END) { | 155 } else if (type == ui::ET_GESTURE_END) { |
136 if (state_ == NONE) | 156 if (state_ == NONE) |
137 return; | 157 return; |
138 | 158 |
139 CHECK(scroll_target_); | 159 CHECK(scroll_target_); |
140 if (num_touch_points == 1) { | 160 if (num_touch_points == 1) { |
141 SetState(NONE, gfx::Point(kScrollPositionNone, kScrollPositionNone)); | 161 SetState(NONE); |
142 } else { | 162 } else { |
143 SetState(IGNORE_CURRENT_SCROLL, | 163 SetState(IGNORE_CURRENT_SCROLL); |
144 gfx::Point(kScrollPositionNone, kScrollPositionNone)); | |
145 } | 164 } |
146 } else if (type == ui::ET_GESTURE_SCROLL_BEGIN) { | 165 } else if (type == ui::ET_GESTURE_SCROLL_BEGIN) { |
147 DCHECK(state_ == IGNORE_CURRENT_SCROLL || state_ == BEZEL_GESTURE_STARTED); | 166 DCHECK(state_ == IGNORE_CURRENT_SCROLL || state_ == BEZEL_GESTURE_STARTED); |
148 if (state_ != BEZEL_GESTURE_STARTED) | 167 if (state_ != BEZEL_GESTURE_STARTED) |
149 return; | 168 return; |
150 | 169 |
151 if (num_touch_points == 1) { | 170 if (num_touch_points == 1) { |
152 SetState(BEZEL_SCROLLING_ONE_FINGER, event_location); | 171 SetState(BEZEL_SCROLLING_ONE_FINGER, scroll_delta); |
153 return; | 172 return; |
154 } | 173 } |
155 | 174 |
156 DCHECK_EQ(num_touch_points, 2); | 175 DCHECK_EQ(num_touch_points, 2); |
157 SetState(BEZEL_SCROLLING_TWO_FINGERS, event_location); | 176 SetState(BEZEL_SCROLLING_TWO_FINGERS, scroll_delta); |
158 if (left_right_delegate_->CanScroll()) | 177 if (left_right_delegate_->CanScroll()) |
159 event->SetHandled(); | 178 event->SetHandled(); |
160 } else if (type == ui::ET_GESTURE_SCROLL_UPDATE) { | 179 } else if (type == ui::ET_GESTURE_SCROLL_UPDATE) { |
161 if (state_ != BEZEL_SCROLLING_TWO_FINGERS) | 180 if (state_ != BEZEL_SCROLLING_TWO_FINGERS) |
162 return; | 181 return; |
163 | 182 |
164 float scroll_delta = GetDistance(event_location, scroll_bezel_); | |
165 left_right_delegate_->ScrollUpdate(scroll_delta); | 183 left_right_delegate_->ScrollUpdate(scroll_delta); |
166 if (left_right_delegate_->CanScroll()) | 184 if (left_right_delegate_->CanScroll()) |
167 event->SetHandled(); | 185 event->SetHandled(); |
168 } | 186 } |
169 } | 187 } |
170 | 188 |
171 } // namespace athena | 189 } // namespace athena |
OLD | NEW |