| OLD | NEW |
| 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 "chrome/browser/ui/window_sizer/window_sizer.h" | 5 #include "chrome/browser/ui/window_sizer/window_sizer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
| 16 #include "chrome/browser/ui/browser_list.h" | 16 #include "chrome/browser/ui/browser_list.h" |
| 17 #include "chrome/browser/ui/browser_window.h" | 17 #include "chrome/browser/ui/browser_window.h" |
| 18 #include "chrome/browser/ui/browser_window_state.h" | 18 #include "chrome/browser/ui/browser_window_state.h" |
| 19 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
| 20 #include "components/prefs/pref_service.h" | 20 #include "components/prefs/pref_service.h" |
| 21 #include "ui/base/ui_base_switches.h" | 21 #include "ui/base/ui_base_switches.h" |
| 22 #include "ui/gfx/screen.h" | 22 #include "ui/display/screen.h" |
| 23 | 23 |
| 24 #if defined(USE_ASH) | 24 #if defined(USE_ASH) |
| 25 #include "ash/shell.h" | 25 #include "ash/shell.h" |
| 26 #include "ash/wm/common/window_positioner.h" | 26 #include "ash/wm/common/window_positioner.h" |
| 27 #include "chrome/browser/ui/ash/ash_util.h" | 27 #include "chrome/browser/ui/ash/ash_util.h" |
| 28 #endif | 28 #endif |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 // Minimum height of the visible part of a window. | 32 // Minimum height of the visible part of a window. |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 // If set, is used as the reference browser for GetLastActiveWindowState. | 144 // If set, is used as the reference browser for GetLastActiveWindowState. |
| 145 const Browser* browser_; | 145 const Browser* browser_; |
| 146 DISALLOW_COPY_AND_ASSIGN(DefaultStateProvider); | 146 DISALLOW_COPY_AND_ASSIGN(DefaultStateProvider); |
| 147 }; | 147 }; |
| 148 | 148 |
| 149 class DefaultTargetDisplayProvider : public WindowSizer::TargetDisplayProvider { | 149 class DefaultTargetDisplayProvider : public WindowSizer::TargetDisplayProvider { |
| 150 public: | 150 public: |
| 151 DefaultTargetDisplayProvider() {} | 151 DefaultTargetDisplayProvider() {} |
| 152 ~DefaultTargetDisplayProvider() override {} | 152 ~DefaultTargetDisplayProvider() override {} |
| 153 | 153 |
| 154 gfx::Display GetTargetDisplay(const gfx::Screen* screen, | 154 display::Display GetTargetDisplay(const display::Screen* screen, |
| 155 const gfx::Rect& bounds) const override { | 155 const gfx::Rect& bounds) const override { |
| 156 #if defined(USE_ASH) | 156 #if defined(USE_ASH) |
| 157 // Use the target display on ash. | 157 // Use the target display on ash. |
| 158 if (chrome::ShouldOpenAshOnStartup()) { | 158 if (chrome::ShouldOpenAshOnStartup()) { |
| 159 aura::Window* target = ash::Shell::GetTargetRootWindow(); | 159 aura::Window* target = ash::Shell::GetTargetRootWindow(); |
| 160 return screen->GetDisplayNearestWindow(target); | 160 return screen->GetDisplayNearestWindow(target); |
| 161 } | 161 } |
| 162 #endif | 162 #endif |
| 163 // Find the size of the work area of the monitor that intersects the bounds | 163 // Find the size of the work area of the monitor that intersects the bounds |
| 164 // of the anchor window. | 164 // of the anchor window. |
| 165 return screen->GetDisplayMatching(bounds); | 165 return screen->GetDisplayMatching(bounds); |
| 166 } | 166 } |
| 167 | 167 |
| 168 private: | 168 private: |
| 169 DISALLOW_COPY_AND_ASSIGN(DefaultTargetDisplayProvider); | 169 DISALLOW_COPY_AND_ASSIGN(DefaultTargetDisplayProvider); |
| 170 }; | 170 }; |
| 171 | 171 |
| 172 } // namespace | 172 } // namespace |
| 173 | 173 |
| 174 /////////////////////////////////////////////////////////////////////////////// | 174 /////////////////////////////////////////////////////////////////////////////// |
| 175 // WindowSizer, public: | 175 // WindowSizer, public: |
| 176 | 176 |
| 177 WindowSizer::WindowSizer( | 177 WindowSizer::WindowSizer( |
| 178 std::unique_ptr<StateProvider> state_provider, | 178 std::unique_ptr<StateProvider> state_provider, |
| 179 std::unique_ptr<TargetDisplayProvider> target_display_provider, | 179 std::unique_ptr<TargetDisplayProvider> target_display_provider, |
| 180 const Browser* browser) | 180 const Browser* browser) |
| 181 : state_provider_(std::move(state_provider)), | 181 : state_provider_(std::move(state_provider)), |
| 182 target_display_provider_(std::move(target_display_provider)), | 182 target_display_provider_(std::move(target_display_provider)), |
| 183 screen_(gfx::Screen::GetScreen()), | 183 screen_(display::Screen::GetScreen()), |
| 184 browser_(browser) {} | 184 browser_(browser) {} |
| 185 | 185 |
| 186 WindowSizer::WindowSizer( | 186 WindowSizer::WindowSizer( |
| 187 std::unique_ptr<StateProvider> state_provider, | 187 std::unique_ptr<StateProvider> state_provider, |
| 188 std::unique_ptr<TargetDisplayProvider> target_display_provider, | 188 std::unique_ptr<TargetDisplayProvider> target_display_provider, |
| 189 gfx::Screen* screen, | 189 display::Screen* screen, |
| 190 const Browser* browser) | 190 const Browser* browser) |
| 191 : state_provider_(std::move(state_provider)), | 191 : state_provider_(std::move(state_provider)), |
| 192 target_display_provider_(std::move(target_display_provider)), | 192 target_display_provider_(std::move(target_display_provider)), |
| 193 screen_(screen), | 193 screen_(screen), |
| 194 browser_(browser) { | 194 browser_(browser) { |
| 195 DCHECK(screen_); | 195 DCHECK(screen_); |
| 196 } | 196 } |
| 197 | 197 |
| 198 WindowSizer::~WindowSizer() { | 198 WindowSizer::~WindowSizer() { |
| 199 } | 199 } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 !state_provider_->GetPersistentState(bounds, | 285 !state_provider_->GetPersistentState(bounds, |
| 286 &saved_work_area, | 286 &saved_work_area, |
| 287 show_state)) | 287 show_state)) |
| 288 return false; | 288 return false; |
| 289 AdjustBoundsToBeVisibleOnDisplay(GetTargetDisplay(*bounds), | 289 AdjustBoundsToBeVisibleOnDisplay(GetTargetDisplay(*bounds), |
| 290 saved_work_area, | 290 saved_work_area, |
| 291 bounds); | 291 bounds); |
| 292 return true; | 292 return true; |
| 293 } | 293 } |
| 294 | 294 |
| 295 void WindowSizer::GetDefaultWindowBounds(const gfx::Display& display, | 295 void WindowSizer::GetDefaultWindowBounds(const display::Display& display, |
| 296 gfx::Rect* default_bounds) const { | 296 gfx::Rect* default_bounds) const { |
| 297 DCHECK(default_bounds); | 297 DCHECK(default_bounds); |
| 298 #if defined(USE_ASH) | 298 #if defined(USE_ASH) |
| 299 // TODO(beng): insufficient but currently necessary. http://crbug.com/133312 | 299 // TODO(beng): insufficient but currently necessary. http://crbug.com/133312 |
| 300 if (chrome::ShouldOpenAshOnStartup()) { | 300 if (chrome::ShouldOpenAshOnStartup()) { |
| 301 *default_bounds = ash::WindowPositioner::GetDefaultWindowBounds(display); | 301 *default_bounds = ash::WindowPositioner::GetDefaultWindowBounds(display); |
| 302 return; | 302 return; |
| 303 } | 303 } |
| 304 #endif | 304 #endif |
| 305 gfx::Rect work_area = display.work_area(); | 305 gfx::Rect work_area = display.work_area(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 326 // kWindowTilePixels between screen edge and each other. | 326 // kWindowTilePixels between screen edge and each other. |
| 327 default_width = static_cast<int>(work_area.width() / 2. - | 327 default_width = static_cast<int>(work_area.width() / 2. - |
| 328 1.5 * kWindowTilePixels); | 328 1.5 * kWindowTilePixels); |
| 329 } | 329 } |
| 330 default_bounds->SetRect(kWindowTilePixels + work_area.x(), | 330 default_bounds->SetRect(kWindowTilePixels + work_area.x(), |
| 331 kWindowTilePixels + work_area.y(), | 331 kWindowTilePixels + work_area.y(), |
| 332 default_width, default_height); | 332 default_width, default_height); |
| 333 } | 333 } |
| 334 | 334 |
| 335 void WindowSizer::AdjustBoundsToBeVisibleOnDisplay( | 335 void WindowSizer::AdjustBoundsToBeVisibleOnDisplay( |
| 336 const gfx::Display& display, | 336 const display::Display& display, |
| 337 const gfx::Rect& saved_work_area, | 337 const gfx::Rect& saved_work_area, |
| 338 gfx::Rect* bounds) const { | 338 gfx::Rect* bounds) const { |
| 339 DCHECK(bounds); | 339 DCHECK(bounds); |
| 340 | 340 |
| 341 // If |bounds| is empty, reset to the default size. | 341 // If |bounds| is empty, reset to the default size. |
| 342 if (bounds->IsEmpty()) { | 342 if (bounds->IsEmpty()) { |
| 343 gfx::Rect default_bounds; | 343 gfx::Rect default_bounds; |
| 344 GetDefaultWindowBounds(display, &default_bounds); | 344 GetDefaultWindowBounds(display, &default_bounds); |
| 345 if (bounds->height() <= 0) | 345 if (bounds->height() <= 0) |
| 346 bounds->set_height(default_bounds.height()); | 346 bounds->set_height(default_bounds.height()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 // ensure that at least kMinVisibleWidth * kMinVisibleHeight is visible. | 396 // ensure that at least kMinVisibleWidth * kMinVisibleHeight is visible. |
| 397 const int min_y = work_area.y() + kMinVisibleHeight - bounds->height(); | 397 const int min_y = work_area.y() + kMinVisibleHeight - bounds->height(); |
| 398 const int min_x = work_area.x() + kMinVisibleWidth - bounds->width(); | 398 const int min_x = work_area.x() + kMinVisibleWidth - bounds->width(); |
| 399 const int max_y = work_area.bottom() - kMinVisibleHeight; | 399 const int max_y = work_area.bottom() - kMinVisibleHeight; |
| 400 const int max_x = work_area.right() - kMinVisibleWidth; | 400 const int max_x = work_area.right() - kMinVisibleWidth; |
| 401 bounds->set_y(std::max(min_y, std::min(max_y, bounds->y()))); | 401 bounds->set_y(std::max(min_y, std::min(max_y, bounds->y()))); |
| 402 bounds->set_x(std::max(min_x, std::min(max_x, bounds->x()))); | 402 bounds->set_x(std::max(min_x, std::min(max_x, bounds->x()))); |
| 403 #endif // defined(OS_MACOSX) | 403 #endif // defined(OS_MACOSX) |
| 404 } | 404 } |
| 405 | 405 |
| 406 gfx::Display WindowSizer::GetTargetDisplay(const gfx::Rect& bounds) const { | 406 display::Display WindowSizer::GetTargetDisplay(const gfx::Rect& bounds) const { |
| 407 return target_display_provider_->GetTargetDisplay(screen_, bounds); | 407 return target_display_provider_->GetTargetDisplay(screen_, bounds); |
| 408 } | 408 } |
| 409 | 409 |
| 410 ui::WindowShowState WindowSizer::GetWindowDefaultShowState() const { | 410 ui::WindowShowState WindowSizer::GetWindowDefaultShowState() const { |
| 411 if (!browser_) | 411 if (!browser_) |
| 412 return ui::SHOW_STATE_DEFAULT; | 412 return ui::SHOW_STATE_DEFAULT; |
| 413 | 413 |
| 414 // Only tabbed browsers use the command line or preference state, with the | 414 // Only tabbed browsers use the command line or preference state, with the |
| 415 // exception of devtools. | 415 // exception of devtools. |
| 416 bool show_state = !browser_->is_type_tabbed() && !browser_->is_devtools(); | 416 bool show_state = !browser_->is_type_tabbed() && !browser_->is_devtools(); |
| 417 | 417 |
| 418 #if defined(USE_AURA) | 418 #if defined(USE_AURA) |
| 419 // We use the apps save state on aura. | 419 // We use the apps save state on aura. |
| 420 show_state &= !browser_->is_app(); | 420 show_state &= !browser_->is_app(); |
| 421 #endif | 421 #endif |
| 422 | 422 |
| 423 if (show_state) | 423 if (show_state) |
| 424 return browser_->initial_show_state(); | 424 return browser_->initial_show_state(); |
| 425 | 425 |
| 426 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 426 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 427 switches::kStartMaximized)) | 427 switches::kStartMaximized)) |
| 428 return ui::SHOW_STATE_MAXIMIZED; | 428 return ui::SHOW_STATE_MAXIMIZED; |
| 429 | 429 |
| 430 if (browser_->initial_show_state() != ui::SHOW_STATE_DEFAULT) | 430 if (browser_->initial_show_state() != ui::SHOW_STATE_DEFAULT) |
| 431 return browser_->initial_show_state(); | 431 return browser_->initial_show_state(); |
| 432 | 432 |
| 433 // Otherwise we use the default which can be overridden later on. | 433 // Otherwise we use the default which can be overridden later on. |
| 434 return ui::SHOW_STATE_DEFAULT; | 434 return ui::SHOW_STATE_DEFAULT; |
| 435 } | 435 } |
| OLD | NEW |