Chromium Code Reviews| Index: athena/wm/window_manager_impl.cc |
| diff --git a/athena/wm/window_manager_impl.cc b/athena/wm/window_manager_impl.cc |
| index 9797422ecba0da460f1de66b1ac7a9956fba91dc..68f5118e052ab0846da83d127a8b0550bad1d28f 100644 |
| --- a/athena/wm/window_manager_impl.cc |
| +++ b/athena/wm/window_manager_impl.cc |
| @@ -14,6 +14,7 @@ |
| #include "athena/wm/title_drag_controller.h" |
| #include "athena/wm/window_list_provider_impl.h" |
| #include "athena/wm/window_overview_mode.h" |
| +#include "base/auto_reset.h" |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "ui/aura/layout_manager.h" |
| @@ -101,7 +102,9 @@ void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) { |
| aura::Window::Windows list = instance->window_list_provider_->GetWindowList(); |
| if (std::find(list.begin(), list.end(), child) == list.end()) |
| return; |
| - if (instance->split_view_controller_->IsSplitViewModeActive()) { |
| + |
| + if (instance->split_view_controller_->IsSplitViewModeActive() && |
| + !instance->IsOverviewModeActive()) { |
| instance->split_view_controller_->ReplaceWindow( |
| instance->split_view_controller_->left_window(), child); |
| } else { |
| @@ -109,6 +112,12 @@ void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) { |
| gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); |
| child->SetBounds(gfx::Rect(size)); |
| } |
| + |
| + if (instance->IsOverviewModeActive()) { |
| + // TODO(pkotwicz|oshima). Creating a new window should only exit overview |
| + // mode if the new window is activated. |
| + instance->OnSelectWindow(child); |
| + } |
| } |
| void AthenaContainerLayoutManager::OnWillRemoveWindowFromLayout( |
| @@ -131,7 +140,7 @@ void AthenaContainerLayoutManager::SetChildBounds( |
| SetChildBoundsDirect(child, requested_bounds); |
| } |
| -WindowManagerImpl::WindowManagerImpl() { |
| +WindowManagerImpl::WindowManagerImpl() : selecting_window_(false) { |
| ScreenManager::ContainerParams params("DefaultContainer", CP_DEFAULT); |
| params.can_activate_children = true; |
| container_.reset(ScreenManager::Get()->CreateDefaultContainer(params)); |
| @@ -179,6 +188,23 @@ void WindowManagerImpl::SetInOverview(bool active) { |
| if (active == in_overview) |
| return; |
| + if (!active && !selecting_window_) { |
| + const aura::Window::Windows& windows = |
| + window_list_provider_->GetWindowList(); |
|
sadrul
2014/09/12 04:42:06
Just const Windows windows = ...;
|
| + if (!windows.empty()) { |
| + if (split_view_controller_->IsSplitViewModeActive()) { |
| + DCHECK(windows.back() == split_view_controller_->left_window() || |
| + windows.back() == split_view_controller_->right_window()); |
| + OnSelectSplitViewWindow(split_view_controller_->left_window(), |
| + split_view_controller_->right_window(), |
| + windows.back()); |
| + } else { |
| + OnSelectWindow(windows.back()); |
| + } |
| + return; |
|
sadrul
2014/09/12 04:42:06
I think |overview_|, bezel-controller's delegate e
|
| + } |
| + } |
| + |
| bezel_controller_->set_left_right_delegate( |
| active ? NULL : split_view_controller_.get()); |
| if (active) { |
| @@ -223,12 +249,16 @@ WindowListProvider* WindowManagerImpl::GetWindowListProvider() { |
| } |
| void WindowManagerImpl::OnSelectWindow(aura::Window* window) { |
| + base::AutoReset<bool> selecting_window(&selecting_window_, true); |
| + SetInOverview(false); |
| + |
| + window->Show(); |
| + wm::ActivateWindow(window); |
| + |
| if (split_view_controller_->IsSplitViewModeActive()) { |
| split_view_controller_->DeactivateSplitMode(); |
| FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); |
| } |
| - wm::ActivateWindow(window); |
| - SetInOverview(false); |
| // If |window| does not have the size of the work-area, then make sure it is |
| // resized. |
| const gfx::Size work_area = |
| @@ -241,7 +271,6 @@ void WindowManagerImpl::OnSelectWindow(aura::Window* window) { |
| desired_bounds.y() - window_bounds.y()); |
| transform.Scale(desired_bounds.width() / window_bounds.width(), |
| desired_bounds.height() / window_bounds.height()); |
| - window->layer()->GetAnimator()->AbortAllAnimations(); |
| ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
| settings.SetPreemptionStrategy( |
| ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| @@ -254,18 +283,14 @@ void WindowManagerImpl::OnSelectWindow(aura::Window* window) { |
| } |
| } |
| -void WindowManagerImpl::OnSplitViewMode(aura::Window* left, |
| - aura::Window* right) { |
| +void WindowManagerImpl::OnSelectSplitViewWindow(aura::Window* left, |
| + aura::Window* right, |
| + aura::Window* to_activate) { |
| + base::AutoReset<bool> selecting_window(&selecting_window_, true); |
| SetInOverview(false); |
| FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeEnter()); |
| split_view_controller_->ActivateSplitMode(left, right); |
| -} |
| - |
| -void WindowManagerImpl::OnWindowAdded(aura::Window* new_window) { |
| - // TODO(oshima): Creating a new window should updates the ovewview mode |
| - // instead of exitting. |
| - if (new_window->type() == ui::wm::WINDOW_TYPE_NORMAL) |
| - SetInOverview(false); |
| + wm::ActivateWindow(to_activate); |
| } |
| void WindowManagerImpl::OnWindowDestroying(aura::Window* window) { |