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

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: Addressing sadrul's feedback, adding license header. 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
« no previous file with comments | « athena/wm/bezel_controller.h ('k') | athena/wm/mru_window_tracker.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
36 float GetDistance(const gfx::PointF& location,
37 aura::Window* window,
38 BezelController::Bezel bezel) {
39 DCHECK(bezel == BezelController::BEZEL_LEFT ||
40 bezel == BezelController::BEZEL_RIGHT);
41 // Convert location from window coordinates to screen coordinates.
42 gfx::Point point_in_screen(gfx::ToRoundedPoint(location));
43 wm::ConvertPointToScreen(window, &point_in_screen);
44 return bezel == BezelController::BEZEL_LEFT
45 ? point_in_screen.x()
46 : point_in_screen.x() - GetDisplay(window).bounds().width();
47 }
48
27 } // namespace 49 } // namespace
28 50
29 BezelController::BezelController(aura::Window* container) 51 BezelController::BezelController(aura::Window* container)
30 : container_(container), 52 : container_(container),
31 state_(NONE), 53 state_(NONE),
32 scroll_bezel_(BEZEL_NONE), 54 scroll_bezel_(BEZEL_NONE),
33 scroll_target_(NULL), 55 scroll_target_(NULL),
34 left_right_delegate_(NULL) { 56 left_right_delegate_(NULL) {
35 } 57 }
36 58
37 float BezelController::GetDistance(const gfx::PointF& position, 59 void BezelController::SetState(BezelController::State state) {
38 BezelController::Bezel bezel) { 60 // Use SetState(State, float) if |state| is one of the BEZEL_SCROLLING states.
39 DCHECK(bezel == BEZEL_LEFT || bezel == BEZEL_RIGHT); 61 DCHECK_NE(state, BEZEL_SCROLLING_TWO_FINGERS);
40 return bezel == BEZEL_LEFT 62 DCHECK_NE(state, BEZEL_SCROLLING_ONE_FINGER);
41 ? position.x() 63 SetState(state, kScrollDeltaNone);
42 : position.x() - container_->GetBoundsInScreen().width();
43 } 64 }
44 65
45 void BezelController::SetState(BezelController::State state, 66 void BezelController::SetState(BezelController::State state,
46 const gfx::PointF& scroll_position) { 67 float scroll_delta) {
47 if (!left_right_delegate_ || state == state_) 68 if (!left_right_delegate_ || state == state_)
48 return; 69 return;
49 70
50 if (state == BEZEL_SCROLLING_TWO_FINGERS) { 71 if (state == BEZEL_SCROLLING_TWO_FINGERS)
51 float delta = GetDistance(scroll_position, scroll_bezel_); 72 left_right_delegate_->ScrollBegin(scroll_bezel_, scroll_delta);
52 left_right_delegate_->ScrollBegin(scroll_bezel_, delta); 73 else if (state_ == BEZEL_SCROLLING_TWO_FINGERS)
53 } else if (state_ == BEZEL_SCROLLING_TWO_FINGERS) {
54 left_right_delegate_->ScrollEnd(); 74 left_right_delegate_->ScrollEnd();
55 }
56 state_ = state; 75 state_ = state;
57 if (state == NONE) { 76 if (state == NONE) {
58 scroll_bezel_ = BEZEL_NONE; 77 scroll_bezel_ = BEZEL_NONE;
59 scroll_target_ = NULL; 78 scroll_target_ = NULL;
60 } 79 }
61 } 80 }
62 81
63 // Only implemented for LEFT and RIGHT bezels ATM. 82 // Only implemented for LEFT and RIGHT bezels ATM.
64 BezelController::Bezel BezelController::GetBezel(const gfx::PointF& location) { 83 BezelController::Bezel BezelController::GetBezel(const gfx::PointF& location) {
84 int screen_width = GetDisplay(container_).bounds().width();
65 if (location.x() < kBezelWidth) { 85 if (location.x() < kBezelWidth) {
66 return BEZEL_LEFT; 86 return BEZEL_LEFT;
67 } else if (location.x() > 87 } else if (location.x() > screen_width - kBezelWidth) {
68 container_->GetBoundsInScreen().width() - kBezelWidth) {
69 return BEZEL_RIGHT; 88 return BEZEL_RIGHT;
70 } else { 89 } else {
71 return BEZEL_NONE; 90 return BEZEL_NONE;
72 } 91 }
73 } 92 }
74 93
75 void BezelController::OnGestureEvent(ui::GestureEvent* event) { 94 void BezelController::OnGestureEvent(ui::GestureEvent* event) {
76 // TODO (mfomitchev): Currently we aren't retargetting or consuming any of the 95 // 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 96 // 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 97 // 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 98 // is hosting our own gesture recognizer or retargetting touch events at the
80 // bezel. 99 // bezel.
81 100
82 if (!left_right_delegate_) 101 if (!left_right_delegate_)
83 return; 102 return;
84 103
85 ui::EventType type = event->type(); 104 ui::EventType type = event->type();
86 if (!ShouldProcessGesture(type)) 105 if (!ShouldProcessGesture(type))
87 return; 106 return;
88 107
89 if (scroll_target_ && event->target() != scroll_target_) 108 if (scroll_target_ && event->target() != scroll_target_)
90 return; 109 return;
91 110
92 const gfx::PointF& event_location = event->location_f(); 111 const gfx::PointF& event_location = event->location_f();
93 const ui::GestureEventDetails& event_details = event->details(); 112 const ui::GestureEventDetails& event_details = event->details();
94 int num_touch_points = event_details.touch_points(); 113 int num_touch_points = event_details.touch_points();
114 float scroll_delta = kScrollDeltaNone;
115 if (scroll_bezel_ != BEZEL_NONE) {
116 aura::Window* target_window = static_cast<aura::Window*>(event->target());
117 scroll_delta = GetDistance(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
« no previous file with comments | « athena/wm/bezel_controller.h ('k') | athena/wm/mru_window_tracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698