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

Side by Side Diff: athena/wm/bezel_controller.cc

Issue 420603011: Split Screen mode implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@split_view
Patch Set: Fixed upstream branch Created 6 years, 4 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
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698