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

Side by Side Diff: ash/wm/maximize_mode/maximize_mode_controller.cc

Issue 303723003: Lock Rotation on user settings changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 6 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 "ash/wm/maximize_mode/maximize_mode_controller.h" 5 #include "ash/wm/maximize_mode/maximize_mode_controller.h"
6 6
7 #include "ash/accelerators/accelerator_controller.h" 7 #include "ash/accelerators/accelerator_controller.h"
8 #include "ash/accelerators/accelerator_table.h" 8 #include "ash/accelerators/accelerator_table.h"
9 #include "ash/accelerometer/accelerometer_controller.h" 9 #include "ash/accelerometer/accelerometer_controller.h"
10 #include "ash/ash_switches.h" 10 #include "ash/ash_switches.h"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 have_seen_accelerometer_data_(false), 138 have_seen_accelerometer_data_(false),
139 in_set_screen_rotation_(false), 139 in_set_screen_rotation_(false),
140 user_rotation_(gfx::Display::ROTATE_0) { 140 user_rotation_(gfx::Display::ROTATE_0) {
141 Shell::GetInstance()->accelerometer_controller()->AddObserver(this); 141 Shell::GetInstance()->accelerometer_controller()->AddObserver(this);
142 } 142 }
143 143
144 MaximizeModeController::~MaximizeModeController() { 144 MaximizeModeController::~MaximizeModeController() {
145 Shell::GetInstance()->accelerometer_controller()->RemoveObserver(this); 145 Shell::GetInstance()->accelerometer_controller()->RemoveObserver(this);
146 } 146 }
147 147
148 void MaximizeModeController::SetRotationLocked(bool rotation_locked) {
149 if (rotation_locked_ == rotation_locked)
150 return;
151 rotation_locked_ = rotation_locked;
152 FOR_EACH_OBSERVER(Observer, observers_, OnRotationLockChanged());
153 }
154
155 void MaximizeModeController::AddObserver(Observer* observer) {
156 observers_.AddObserver(observer);
157 }
158
159 void MaximizeModeController::RemoveObserver(Observer* observer) {
160 observers_.RemoveObserver(observer);
161 }
162
148 bool MaximizeModeController::CanEnterMaximizeMode() { 163 bool MaximizeModeController::CanEnterMaximizeMode() {
149 // If we have ever seen accelerometer data, then HandleHingeRotation may 164 // If we have ever seen accelerometer data, then HandleHingeRotation may
150 // trigger maximize mode at some point in the future. 165 // trigger maximize mode at some point in the future.
151 // The --enable-touch-view-testing switch can also mean that we may enter 166 // The --enable-touch-view-testing switch can also mean that we may enter
152 // maximize mode. 167 // maximize mode.
153 return have_seen_accelerometer_data_ || 168 return have_seen_accelerometer_data_ ||
154 CommandLine::ForCurrentProcess()->HasSwitch( 169 CommandLine::ForCurrentProcess()->HasSwitch(
155 switches::kAshEnableTouchViewTesting); 170 switches::kAshEnableTouchViewTesting);
156 } 171 }
157 172
(...skipping 12 matching lines...) Expand all
170 std::abs(lid_magnitude - 1.0f) > kDeviationFromGravityThreshold) { 185 std::abs(lid_magnitude - 1.0f) > kDeviationFromGravityThreshold) {
171 return; 186 return;
172 } 187 }
173 188
174 // Responding to the hinge rotation can change the maximize mode state which 189 // Responding to the hinge rotation can change the maximize mode state which
175 // affects screen rotation, so we handle hinge rotation first. 190 // affects screen rotation, so we handle hinge rotation first.
176 HandleHingeRotation(base, lid); 191 HandleHingeRotation(base, lid);
177 HandleScreenRotation(lid); 192 HandleScreenRotation(lid);
178 } 193 }
179 194
195 void MaximizeModeController::OnDisplayConfigurationChanged() {
196 if (rotation_locked_ || in_set_screen_rotation_)
197 return;
198 DisplayManager* display_manager = Shell::GetInstance()->display_manager();
199 user_rotation_ = display_manager->
flackr 2014/05/28 14:48:04 Updating the user_rotation_ might be an unexpected
jonross 2014/05/28 19:13:33 Done.
200 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
201 if (user_rotation_ != current_rotation_)
flackr 2014/05/28 14:48:04 nit: It would be helpful to have a comment here. P
jonross 2014/05/28 19:13:33 Done.
202 SetRotationLocked(true);
203 }
204
180 void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base, 205 void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base,
181 const gfx::Vector3dF& lid) { 206 const gfx::Vector3dF& lid) {
182 static const gfx::Vector3dF hinge_vector(0.0f, 1.0f, 0.0f); 207 static const gfx::Vector3dF hinge_vector(0.0f, 1.0f, 0.0f);
183 bool maximize_mode_engaged = 208 bool maximize_mode_engaged =
184 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled(); 209 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled();
185 // Ignore the component of acceleration parallel to the hinge for the purposes 210 // Ignore the component of acceleration parallel to the hinge for the purposes
186 // of hinge angle calculation. 211 // of hinge angle calculation.
187 gfx::Vector3dF base_flattened(base); 212 gfx::Vector3dF base_flattened(base);
188 gfx::Vector3dF lid_flattened(lid); 213 gfx::Vector3dF lid_flattened(lid);
189 base_flattened.set_y(0.0f); 214 base_flattened.set_y(0.0f);
(...skipping 22 matching lines...) Expand all
212 } else if (!maximize_mode_engaged && 237 } else if (!maximize_mode_engaged &&
213 angle > kEnterMaximizeModeAngle) { 238 angle > kEnterMaximizeModeAngle) {
214 EnterMaximizeMode(); 239 EnterMaximizeMode();
215 } 240 }
216 } 241 }
217 242
218 void MaximizeModeController::HandleScreenRotation(const gfx::Vector3dF& lid) { 243 void MaximizeModeController::HandleScreenRotation(const gfx::Vector3dF& lid) {
219 bool maximize_mode_engaged = 244 bool maximize_mode_engaged =
220 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled(); 245 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled();
221 246
222 if (!maximize_mode_engaged || rotation_locked_) 247 if (!maximize_mode_engaged || rotation_locked_)
flackr 2014/05/28 14:48:04 It might be useful to track accelerometer rotation
jonross 2014/05/28 19:13:33 Added todo
223 return; 248 return;
224 249
225 DisplayManager* display_manager = 250 DisplayManager* display_manager =
226 Shell::GetInstance()->display_manager(); 251 Shell::GetInstance()->display_manager();
227 gfx::Display::Rotation current_rotation = display_manager->GetDisplayInfo( 252 gfx::Display::Rotation current_rotation = display_manager->GetDisplayInfo(
228 gfx::Display::InternalDisplayId()).rotation(); 253 gfx::Display::InternalDisplayId()).rotation();
flackr 2014/05/28 14:48:04 This might be a local variable now. current_rotati
jonross 2014/05/28 19:13:33 This can be switched when we address the todo for
229 254
230 // After determining maximize mode state, determine if the screen should 255 // After determining maximize mode state, determine if the screen should
231 // be rotated. 256 // be rotated.
232 gfx::Vector3dF lid_flattened(lid.x(), lid.y(), 0.0f); 257 gfx::Vector3dF lid_flattened(lid.x(), lid.y(), 0.0f);
233 float lid_flattened_length = lid_flattened.Length(); 258 float lid_flattened_length = lid_flattened.Length();
234 // When the lid is close to being flat, don't change rotation as it is too 259 // When the lid is close to being flat, don't change rotation as it is too
235 // sensitive to slight movements. 260 // sensitive to slight movements.
236 if (lid_flattened_length < kMinimumAccelerationScreenRotation) 261 if (lid_flattened_length < kMinimumAccelerationScreenRotation)
237 return; 262 return;
238 263
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 299
275 if (new_rotation != current_rotation) 300 if (new_rotation != current_rotation)
276 SetDisplayRotation(display_manager, new_rotation); 301 SetDisplayRotation(display_manager, new_rotation);
277 } 302 }
278 303
279 void MaximizeModeController::SetDisplayRotation( 304 void MaximizeModeController::SetDisplayRotation(
280 DisplayManager* display_manager, 305 DisplayManager* display_manager,
281 gfx::Display::Rotation rotation) { 306 gfx::Display::Rotation rotation) {
282 base::AutoReset<bool> auto_in_set_screen_rotation( 307 base::AutoReset<bool> auto_in_set_screen_rotation(
283 &in_set_screen_rotation_, true); 308 &in_set_screen_rotation_, true);
309 current_rotation_ = rotation;
284 display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(), 310 display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(),
285 rotation); 311 rotation);
286 } 312 }
287 313
288 void MaximizeModeController::EnterMaximizeMode() { 314 void MaximizeModeController::EnterMaximizeMode() {
289 // TODO(jonross): Listen for display configuration changes. If the user
290 // causes a rotation change a rotation lock should be applied.
291 // https://crbug.com/369505
292 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 315 DisplayManager* display_manager = Shell::GetInstance()->display_manager();
293 user_rotation_ = display_manager-> 316 user_rotation_ = display_manager->
flackr 2014/05/28 14:48:04 nit: Just use current_rotation_ = user_rotation_ =
jonross 2014/05/28 19:13:33 Done.
294 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation(); 317 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
318 current_rotation_ = user_rotation_;
295 Shell::GetInstance()->EnableMaximizeModeWindowManager(true); 319 Shell::GetInstance()->EnableMaximizeModeWindowManager(true);
296 event_blocker_.reset(new MaximizeModeEventBlocker); 320 event_blocker_.reset(new MaximizeModeEventBlocker);
297 #if defined(OS_CHROMEOS) 321 #if defined(OS_CHROMEOS)
298 event_handler_.reset(new ScreenshotActionHandler); 322 event_handler_.reset(new ScreenshotActionHandler);
299 #endif 323 #endif
324 Shell::GetInstance()->display_controller()->AddObserver(this);
300 } 325 }
301 326
302 void MaximizeModeController::LeaveMaximizeMode() { 327 void MaximizeModeController::LeaveMaximizeMode() {
303 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 328 DisplayManager* display_manager = Shell::GetInstance()->display_manager();
304 DisplayInfo info = display_manager-> 329 gfx::Display::Rotation current_rotation = display_manager->
305 GetDisplayInfo(gfx::Display::InternalDisplayId()); 330 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
306 gfx::Display::Rotation current_rotation = info.rotation();
307 if (current_rotation != user_rotation_) 331 if (current_rotation != user_rotation_)
308 SetDisplayRotation(display_manager, user_rotation_); 332 SetDisplayRotation(display_manager, user_rotation_);
309 rotation_locked_ = false; 333 rotation_locked_ = false;
310 Shell::GetInstance()->EnableMaximizeModeWindowManager(false); 334 Shell::GetInstance()->EnableMaximizeModeWindowManager(false);
311 event_blocker_.reset(); 335 event_blocker_.reset();
312 event_handler_.reset(); 336 event_handler_.reset();
337 Shell::GetInstance()->display_controller()->RemoveObserver(this);
313 } 338 }
314 339
315 } // namespace ash 340 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698