| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/window_positioner.h" | 5 #include "ash/wm/window_positioner.h" |
| 6 | 6 |
| 7 #include "ash/screen_util.h" |
| 7 #include "ash/shell.h" | 8 #include "ash/shell.h" |
| 8 #include "ash/shell_port.h" | 9 #include "ash/shell_port.h" |
| 9 #include "ash/wm/mru_window_tracker.h" | 10 #include "ash/wm/mru_window_tracker.h" |
| 10 #include "ash/wm/window_positioning_utils.h" | 11 #include "ash/wm/window_positioning_utils.h" |
| 11 #include "ash/wm/window_state.h" | 12 #include "ash/wm/window_state.h" |
| 12 #include "ash/wm/window_util.h" | 13 #include "ash/wm/window_util.h" |
| 13 #include "ash/wm/wm_screen_util.h" | |
| 14 #include "ash/wm_window.h" | 14 #include "ash/wm_window.h" |
| 15 #include "ui/compositor/layer.h" | 15 #include "ui/compositor/layer.h" |
| 16 #include "ui/display/display.h" | 16 #include "ui/display/display.h" |
| 17 #include "ui/display/screen.h" | 17 #include "ui/display/screen.h" |
| 18 #include "ui/gfx/geometry/insets.h" | 18 #include "ui/gfx/geometry/insets.h" |
| 19 | 19 |
| 20 namespace ash { | 20 namespace ash { |
| 21 | 21 |
| 22 const int WindowPositioner::kMinimumWindowOffset = 32; | 22 const int WindowPositioner::kMinimumWindowOffset = 32; |
| 23 | 23 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 gfx::Rect old_bounds = window->GetTargetBounds(); | 127 gfx::Rect old_bounds = window->GetTargetBounds(); |
| 128 if (bounds == old_bounds) | 128 if (bounds == old_bounds) |
| 129 return; | 129 return; |
| 130 gfx::Vector2d offset(bounds.origin() - old_bounds.origin()); | 130 gfx::Vector2d offset(bounds.origin() - old_bounds.origin()); |
| 131 SetBoundsAndOffsetTransientChildren(window, bounds, work_area, offset); | 131 SetBoundsAndOffsetTransientChildren(window, bounds, work_area, offset); |
| 132 } | 132 } |
| 133 | 133 |
| 134 // Move |window| into the center of the screen - or restore it to the previous | 134 // Move |window| into the center of the screen - or restore it to the previous |
| 135 // position. | 135 // position. |
| 136 void AutoPlaceSingleWindow(WmWindow* window, bool animated) { | 136 void AutoPlaceSingleWindow(WmWindow* window, bool animated) { |
| 137 gfx::Rect work_area = wm::GetDisplayWorkAreaBoundsInParent(window); | 137 gfx::Rect work_area = |
| 138 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window()); |
| 138 gfx::Rect bounds = window->GetBounds(); | 139 gfx::Rect bounds = window->GetBounds(); |
| 139 const gfx::Rect* user_defined_area = | 140 const gfx::Rect* user_defined_area = |
| 140 window->GetWindowState()->pre_auto_manage_window_bounds(); | 141 window->GetWindowState()->pre_auto_manage_window_bounds(); |
| 141 if (user_defined_area) { | 142 if (user_defined_area) { |
| 142 bounds = *user_defined_area; | 143 bounds = *user_defined_area; |
| 143 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area, &bounds); | 144 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area, &bounds); |
| 144 } else { | 145 } else { |
| 145 // Center the window (only in x). | 146 // Center the window (only in x). |
| 146 bounds.set_x(work_area.x() + (work_area.width() - bounds.width()) / 2); | 147 bounds.set_x(work_area.x() + (work_area.width() - bounds.width()) / 2); |
| 147 } | 148 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 // static | 311 // static |
| 311 void WindowPositioner::RearrangeVisibleWindowOnShow(WmWindow* added_window) { | 312 void WindowPositioner::RearrangeVisibleWindowOnShow(WmWindow* added_window) { |
| 312 wm::WindowState* added_window_state = added_window->GetWindowState(); | 313 wm::WindowState* added_window_state = added_window->GetWindowState(); |
| 313 if (!added_window->GetTargetVisibility()) | 314 if (!added_window->GetTargetVisibility()) |
| 314 return; | 315 return; |
| 315 | 316 |
| 316 if (!UseAutoWindowManager(added_window) || | 317 if (!UseAutoWindowManager(added_window) || |
| 317 added_window_state->bounds_changed_by_user()) { | 318 added_window_state->bounds_changed_by_user()) { |
| 318 if (added_window_state->minimum_visibility()) { | 319 if (added_window_state->minimum_visibility()) { |
| 319 // Guarantee minimum visibility within the work area. | 320 // Guarantee minimum visibility within the work area. |
| 320 gfx::Rect work_area = wm::GetDisplayWorkAreaBoundsInParent(added_window); | 321 gfx::Rect work_area = ScreenUtil::GetDisplayWorkAreaBoundsInParent( |
| 322 added_window->aura_window()); |
| 321 gfx::Rect bounds = added_window->GetBounds(); | 323 gfx::Rect bounds = added_window->GetBounds(); |
| 322 gfx::Rect new_bounds = bounds; | 324 gfx::Rect new_bounds = bounds; |
| 323 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area, &new_bounds); | 325 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area, &new_bounds); |
| 324 if (new_bounds != bounds) | 326 if (new_bounds != bounds) |
| 325 added_window->SetBounds(new_bounds); | 327 added_window->SetBounds(new_bounds); |
| 326 } | 328 } |
| 327 return; | 329 return; |
| 328 } | 330 } |
| 329 // Find a single open managed window. | 331 // Find a single open managed window. |
| 330 bool single_window; | 332 bool single_window; |
| 331 WmWindow* other_shown_window = GetReferenceWindow( | 333 WmWindow* other_shown_window = GetReferenceWindow( |
| 332 added_window->GetRootWindow(), added_window, &single_window); | 334 added_window->GetRootWindow(), added_window, &single_window); |
| 333 | 335 |
| 334 if (!other_shown_window) { | 336 if (!other_shown_window) { |
| 335 // It could be that this window is the first window joining the workspace. | 337 // It could be that this window is the first window joining the workspace. |
| 336 if (!WindowPositionCanBeManaged(added_window) || other_shown_window) | 338 if (!WindowPositionCanBeManaged(added_window) || other_shown_window) |
| 337 return; | 339 return; |
| 338 // Since we might be going from 0 to 1 window, we have to arrange the new | 340 // Since we might be going from 0 to 1 window, we have to arrange the new |
| 339 // window to a good default. | 341 // window to a good default. |
| 340 AutoPlaceSingleWindow(added_window, false); | 342 AutoPlaceSingleWindow(added_window, false); |
| 341 return; | 343 return; |
| 342 } | 344 } |
| 343 | 345 |
| 344 gfx::Rect other_bounds = other_shown_window->GetBounds(); | 346 gfx::Rect other_bounds = other_shown_window->GetBounds(); |
| 345 gfx::Rect work_area = wm::GetDisplayWorkAreaBoundsInParent(added_window); | 347 gfx::Rect work_area = |
| 348 ScreenUtil::GetDisplayWorkAreaBoundsInParent(added_window->aura_window()); |
| 346 bool move_other_right = | 349 bool move_other_right = |
| 347 other_bounds.CenterPoint().x() > work_area.x() + work_area.width() / 2; | 350 other_bounds.CenterPoint().x() > work_area.x() + work_area.width() / 2; |
| 348 | 351 |
| 349 // Push the other window to the size only if there are two windows left. | 352 // Push the other window to the size only if there are two windows left. |
| 350 if (single_window) { | 353 if (single_window) { |
| 351 // When going from one to two windows both windows loose their | 354 // When going from one to two windows both windows loose their |
| 352 // "positioned by user" flags. | 355 // "positioned by user" flags. |
| 353 added_window_state->set_bounds_changed_by_user(false); | 356 added_window_state->set_bounds_changed_by_user(false); |
| 354 wm::WindowState* other_window_state = other_shown_window->GetWindowState(); | 357 wm::WindowState* other_window_state = other_shown_window->GetWindowState(); |
| 355 other_window_state->set_bounds_changed_by_user(false); | 358 other_window_state->set_bounds_changed_by_user(false); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 // If the alignment was pushing the window out of the screen, we ignore the | 558 // If the alignment was pushing the window out of the screen, we ignore the |
| 556 // alignment for that call. | 559 // alignment for that call. |
| 557 if (abs(pos.right() - work_area.right()) < grid) | 560 if (abs(pos.right() - work_area.right()) < grid) |
| 558 x = work_area.right() - w; | 561 x = work_area.right() - w; |
| 559 if (abs(pos.bottom() - work_area.bottom()) < grid) | 562 if (abs(pos.bottom() - work_area.bottom()) < grid) |
| 560 y = work_area.bottom() - h; | 563 y = work_area.bottom() - h; |
| 561 return gfx::Rect(x, y, w, h); | 564 return gfx::Rect(x, y, w, h); |
| 562 } | 565 } |
| 563 | 566 |
| 564 } // namespace ash | 567 } // namespace ash |
| OLD | NEW |