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

Side by Side Diff: ash/shell.cc

Issue 9320076: Aura: Switch window mode when screen resolution changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: works even if --aura-window-mode on cmd line Created 8 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « ash/shell.h ('k') | ash/shell_unittest.cc » ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/shell.h" 5 #include "ash/shell.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "ash/accelerators/accelerator_controller.h" 9 #include "ash/accelerators/accelerator_controller.h"
10 #include "ash/accelerators/accelerator_filter.h" 10 #include "ash/accelerators/accelerator_filter.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 #include "ui/gfx/compositor/layer_animator.h" 51 #include "ui/gfx/compositor/layer_animator.h"
52 #include "ui/gfx/screen.h" 52 #include "ui/gfx/screen.h"
53 #include "ui/gfx/size.h" 53 #include "ui/gfx/size.h"
54 #include "ui/views/widget/native_widget_aura.h" 54 #include "ui/views/widget/native_widget_aura.h"
55 #include "ui/views/widget/widget.h" 55 #include "ui/views/widget/widget.h"
56 56
57 namespace ash { 57 namespace ash {
58 58
59 namespace { 59 namespace {
60 60
61 using aura::Window;
61 using views::Widget; 62 using views::Widget;
62 63
63 // Screen width at or below which we automatically start in compact window mode, 64 // Screen width at or below which we automatically start in compact window mode,
64 // in pixels. Should be at least 1366 pixels, the resolution of ChromeOS ZGB 65 // in pixels. Should be at least 1366 pixels, the resolution of ChromeOS ZGB
65 // device displays, as we traditionally used a single window on those devices. 66 // device displays, as we traditionally used a single window on those devices.
66 const int kCompactWindowModeWidthThreshold = 1366; 67 const int kCompactWindowModeWidthThreshold = 1366;
67 68
69 // Returns suggested window mode for a given monitor size.
70 Shell::WindowMode SuggestedWindowMode(const gfx::Size& monitor_size) {
71 // Developers often run the Aura shell in small windows on their desktop.
72 // Prefer overlapping mode for them.
73 if (!aura::RootWindow::use_fullscreen_host_window())
74 return Shell::MODE_OVERLAPPING;
75
76 // If the screen is narrow we prefer a single compact window display.
77 // We explicitly don't care about height, since users don't generally stack
78 // browser windows vertically.
79 if (monitor_size.width() <= kCompactWindowModeWidthThreshold)
80 return Shell::MODE_COMPACT;
81
82 return Shell::MODE_OVERLAPPING;
83 }
84
68 // Creates each of the special window containers that holds windows of various 85 // Creates each of the special window containers that holds windows of various
69 // types in the shell UI. They are added to |containers| from back to front in 86 // types in the shell UI. They are added to |containers| from back to front in
70 // the z-index. 87 // the z-index.
71 void CreateSpecialContainers(aura::Window::Windows* containers) { 88 void CreateSpecialContainers(aura::Window::Windows* containers) {
72 aura::Window* unparented_control_container = new aura::Window(NULL); 89 aura::Window* unparented_control_container = new aura::Window(NULL);
73 unparented_control_container->set_id( 90 unparented_control_container->set_id(
74 internal::kShellWindowId_UnparentedControlContainer); 91 internal::kShellWindowId_UnparentedControlContainer);
75 containers->push_back(unparented_control_container); 92 containers->push_back(unparented_control_container);
76 93
77 aura::Window* background_container = new aura::Window(NULL); 94 aura::Window* background_container = new aura::Window(NULL);
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 std::string mode = 360 std::string mode =
344 command_line->GetSwitchValueASCII(switches::kAuraWindowMode); 361 command_line->GetSwitchValueASCII(switches::kAuraWindowMode);
345 if (mode == switches::kAuraWindowModeCompact) 362 if (mode == switches::kAuraWindowModeCompact)
346 return MODE_COMPACT; 363 return MODE_COMPACT;
347 if (mode == switches::kAuraWindowModeManaged) 364 if (mode == switches::kAuraWindowModeManaged)
348 return MODE_MANAGED; 365 return MODE_MANAGED;
349 if (mode == switches::kAuraWindowModeOverlapping) 366 if (mode == switches::kAuraWindowModeOverlapping)
350 return MODE_OVERLAPPING; 367 return MODE_OVERLAPPING;
351 } 368 }
352 369
353 // Developers often run the Aura shell in small windows on their desktop. 370 // Without an explicit command line flag, guess based on the monitor size.
354 // Prefer overlapping mode for them. 371 return SuggestedWindowMode(monitor_size);
355 if (!aura::RootWindow::use_fullscreen_host_window())
356 return MODE_OVERLAPPING;
357
358 // If the screen is narrow we prefer a single compact window display.
359 // We explicitly don't care about height, since users don't generally stack
360 // browser windows vertically.
361 if (monitor_size.width() <= kCompactWindowModeWidthThreshold)
362 return MODE_COMPACT;
363
364 return MODE_OVERLAPPING;
365 } 372 }
366 373
367 aura::Window* Shell::GetContainer(int container_id) { 374 aura::Window* Shell::GetContainer(int container_id) {
368 return const_cast<aura::Window*>( 375 return const_cast<aura::Window*>(
369 const_cast<const Shell*>(this)->GetContainer(container_id)); 376 const_cast<const Shell*>(this)->GetContainer(container_id));
370 } 377 }
371 378
372 const aura::Window* Shell::GetContainer(int container_id) const { 379 const aura::Window* Shell::GetContainer(int container_id) const {
373 return aura::RootWindow::GetInstance()->GetChildById(container_id); 380 return aura::RootWindow::GetInstance()->GetChildById(container_id);
374 } 381 }
(...skipping 27 matching lines...) Expand all
402 409
403 void Shell::ChangeWindowMode(WindowMode mode) { 410 void Shell::ChangeWindowMode(WindowMode mode) {
404 if (mode == window_mode_) 411 if (mode == window_mode_)
405 return; 412 return;
406 // Window mode must be set before we resize/layout the windows. 413 // Window mode must be set before we resize/layout the windows.
407 window_mode_ = mode; 414 window_mode_ = mode;
408 if (window_mode_ == MODE_COMPACT) 415 if (window_mode_ == MODE_COMPACT)
409 SetupCompactWindowMode(); 416 SetupCompactWindowMode();
410 else 417 else
411 SetupNonCompactWindowMode(); 418 SetupNonCompactWindowMode();
412 // Force a layout. 419 }
413 aura::RootWindow::GetInstance()->layout_manager()->OnWindowResized(); 420
421 void Shell::SetWindowModeForMonitorSize(const gfx::Size& monitor_size) {
422 // Don't allow changes if we're locked in compact mode.
423 CommandLine* command_line = CommandLine::ForCurrentProcess();
424 if (command_line->HasSwitch(switches::kAuraForceCompactWindowMode))
425 return;
426
427 // If we're running on a device, a resolution change means the user plugged in
428 // or unplugged an external monitor. Change window mode to be appropriate for
429 // the new screen resolution.
430 WindowMode new_mode = SuggestedWindowMode(monitor_size);
431 ChangeWindowMode(new_mode);
414 } 432 }
415 433
416 bool Shell::IsScreenLocked() const { 434 bool Shell::IsScreenLocked() const {
417 const aura::Window* lock_screen_container = GetContainer( 435 const aura::Window* lock_screen_container = GetContainer(
418 internal::kShellWindowId_LockScreenContainer); 436 internal::kShellWindowId_LockScreenContainer);
419 return lock_screen_container->StopsEventPropagation(); 437 return lock_screen_container->StopsEventPropagation();
420 } 438 }
421 439
422 bool Shell::IsModalWindowOpen() const { 440 bool Shell::IsModalWindowOpen() const {
423 aura::Window* modal_container = 441 aura::Window* modal_container =
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 539
522 // Create the desktop background image. 540 // Create the desktop background image.
523 root_window_layout_->SetBackgroundWidget(internal::CreateDesktopBackground()); 541 root_window_layout_->SetBackgroundWidget(internal::CreateDesktopBackground());
524 } 542 }
525 543
526 void Shell::ResetLayoutManager(int container_id) { 544 void Shell::ResetLayoutManager(int container_id) {
527 GetContainer(container_id)->SetLayoutManager(NULL); 545 GetContainer(container_id)->SetLayoutManager(NULL);
528 } 546 }
529 547
530 } // namespace ash 548 } // namespace ash
OLDNEW
« no previous file with comments | « ash/shell.h ('k') | ash/shell_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698