Chromium Code Reviews| Index: ash/wm/workspace/workspace_layout_manager.cc |
| diff --git a/ash/wm/workspace/workspace_layout_manager.cc b/ash/wm/workspace/workspace_layout_manager.cc |
| index 21aa08c604db7848611f2dbdebfab779e1613ee6..24346d2d1fb490da2de840619d4289c2780ae8d9 100644 |
| --- a/ash/wm/workspace/workspace_layout_manager.cc |
| +++ b/ash/wm/workspace/workspace_layout_manager.cc |
| @@ -32,9 +32,9 @@ namespace internal { |
| namespace { |
| -// This specifies how much percent (2/3=66%) of a window must be visible when |
| -// the window is added to the workspace. |
| -const float kMinimumPercentOnScreenArea = 0.66f; |
| +// This specifies how much percent 30% of a window rect (width / height) |
| +// must be visible when the window is added to the workspace. |
| +const float kMinimumPercentOnScreenArea = 0.3f; |
| bool IsMaximizedState(ui::WindowShowState state) { |
| return state == ui::SHOW_STATE_MAXIMIZED || |
| @@ -59,8 +59,14 @@ void WorkspaceLayoutManager::SetShelf(internal::ShelfLayoutManager* shelf) { |
| } |
| void WorkspaceLayoutManager::OnWindowAddedToLayout(Window* child) { |
| - // Adjust window bounds in case that the new child is out of the workspace. |
| - AdjustWindowSizeForScreenChange(child, ADJUST_WINDOW_WINDOW_ADDED); |
| + // Adjust window bounds in case that the new child is given the bounds that |
| + // is out of the workspace. Exclude the case where bounds is empty |
| + // (this happens when a views::Widget is created), or the window |
| + // is added with the bounds because a user explicitly moved to |
| + // this position (drag and drop for example). |
| + if (!child->bounds().IsEmpty() && |
| + !wm::HasUserChangedWindowPositionOrSize(child)) |
| + AdjustWindowBounds(child, ADJUST_WINDOW_WINDOW_ADDED); |
| BaseLayoutManager::OnWindowAddedToLayout(child); |
| UpdateDesktopVisibility(); |
| RearrangeVisibleWindowOnShow(child); |
| @@ -110,8 +116,10 @@ void WorkspaceLayoutManager::SetChildBounds( |
| void WorkspaceLayoutManager::OnDisplayWorkAreaInsetsChanged() { |
| const gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( |
| window_->parent())); |
| - if (work_area != work_area_) |
| - AdjustWindowSizesForScreenChange(ADJUST_WINDOW_DISPLAY_INSETS_CHANGED); |
| + if (work_area != work_area_) { |
| + AdjustWindowsBoundsForWorkAreaChange( |
| + ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED); |
| + } |
| } |
| void WorkspaceLayoutManager::OnWindowPropertyChanged(Window* window, |
| @@ -148,7 +156,7 @@ void WorkspaceLayoutManager::OnWindowPropertyChanged(Window* window, |
| if (!restore.IsEmpty()) |
| SetRestoreBoundsInScreen(window, restore); |
| } |
| - |
| + oom |
|
Mr4D (OOO till 08-26)
2013/08/06 23:48:50
I guess this does not belong here.
|
| if (key == internal::kWindowTrackedByWorkspaceKey && |
| GetTrackedByWorkspace(window)) { |
| SetMaximizedOrFullscreenBounds(window); |
| @@ -170,13 +178,13 @@ void WorkspaceLayoutManager::ShowStateChanged( |
| UpdateDesktopVisibility(); |
| } |
| -void WorkspaceLayoutManager::AdjustWindowSizesForScreenChange( |
| +void WorkspaceLayoutManager::AdjustWindowsBoundsForWorkAreaChange( |
| AdjustWindowReason reason) { |
| work_area_ = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_->parent()); |
| - BaseLayoutManager::AdjustWindowSizesForScreenChange(reason); |
| + BaseLayoutManager::AdjustWindowsBoundsForWorkAreaChange(reason); |
| } |
| -void WorkspaceLayoutManager::AdjustWindowSizeForScreenChange( |
| +void WorkspaceLayoutManager::AdjustWindowBounds( |
| Window* window, |
| AdjustWindowReason reason) { |
| if (!GetTrackedByWorkspace(window)) |
| @@ -190,7 +198,7 @@ void WorkspaceLayoutManager::AdjustWindowSizeForScreenChange( |
| // cross fade. I think this is better, but should reconsider if someone |
| // raises voice for this. |
| if (wm::IsWindowMaximized(window) && |
| - reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED) { |
| + reason == ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED) { |
| CrossFadeToBounds(window, ScreenAsh::GetMaximizedWindowBoundsInParent( |
| window->parent()->parent())); |
| return; |
| @@ -200,17 +208,22 @@ void WorkspaceLayoutManager::AdjustWindowSizeForScreenChange( |
| return; |
| gfx::Rect bounds = window->bounds(); |
| - if (reason == ADJUST_WINDOW_SCREEN_SIZE_CHANGED) { |
| - // The work area may be smaller than the full screen. Put as much of the |
| - // window as possible within the display area. |
| - bounds.AdjustToFit(work_area_); |
| - } else if (reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED) { |
| - ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds); |
| - } else if (reason == ADJUST_WINDOW_WINDOW_ADDED) { |
| - int min_width = bounds.width() * kMinimumPercentOnScreenArea; |
| - int min_height = bounds.height() * kMinimumPercentOnScreenArea; |
| - ash::wm::AdjustBoundsToEnsureWindowVisibility( |
| - work_area_, min_width, min_height, &bounds); |
| + switch (reason) { |
| + case ADJUST_WINDOW_DISPLAY_SIZE_CHANGED: |
| + // The work area may be smaller than the full screen. Put as much of the |
| + // window as possible within the display area. |
| + bounds.AdjustToFit(work_area_); |
| + break; |
| + case ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED: |
| + ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds); |
| + break; |
| + case ADJUST_WINDOW_WINDOW_ADDED: { |
| + int min_width = bounds.width() * kMinimumPercentOnScreenArea; |
| + int min_height = bounds.height() * kMinimumPercentOnScreenArea; |
| + ash::wm::AdjustBoundsToEnsureWindowVisibility( |
| + work_area_, min_width, min_height, &bounds); |
| + break; |
| + } |
| } |
| if (window->bounds() != bounds) |
| window->SetBounds(bounds); |
| @@ -229,10 +242,27 @@ void WorkspaceLayoutManager::UpdateBoundsFromShowState(Window* window) { |
| case ui::SHOW_STATE_DEFAULT: |
| case ui::SHOW_STATE_NORMAL: { |
| const gfx::Rect* restore = GetRestoreBoundsInScreen(window); |
| + // Make sure that the part of the window is always visible |
| + // when restored. |
| + gfx::Rect bounds_in_parent; |
| if (restore) { |
| - gfx::Rect bounds_in_parent = |
| + bounds_in_parent = |
| ScreenAsh::ConvertRectFromScreen(window->parent()->parent(), |
| *restore); |
| + |
| + ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility( |
| + work_area_, &bounds_in_parent); |
| + } else { |
| + // Minimized windows have no restore bounds. |
| + // Use the current bounds instead. |
| + bounds_in_parent = window->bounds(); |
| + ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility( |
| + work_area_, &bounds_in_parent); |
| + // Don't start animation if the bounds didn't change. |
| + if (bounds_in_parent == window->bounds()) |
| + bounds_in_parent.SetRect(0, 0, 0, 0); |
| + } |
| + if (!bounds_in_parent.IsEmpty()) { |
| CrossFadeToBounds( |
| window, |
| BaseLayoutManager::BoundsWithScreenEdgeVisible( |