| Index: ash/wm/workspace/workspace_manager.cc
|
| diff --git a/ash/wm/workspace/workspace_manager.cc b/ash/wm/workspace/workspace_manager.cc
|
| index af598e8956af08951a6fcde93b6937a956cb944a..e7506fe6c3083f089ffc5543844418b5b3ceb6f2 100644
|
| --- a/ash/wm/workspace/workspace_manager.cc
|
| +++ b/ash/wm/workspace/workspace_manager.cc
|
| @@ -131,11 +131,14 @@ WorkspaceManager::~WorkspaceManager() {
|
| // destroyed.
|
| std::for_each(workspaces_.begin(), workspaces_.end(),
|
| std::mem_fun(&Workspace::ReleaseWindow));
|
| + std::for_each(hidden_workspaces_.begin(), hidden_workspaces_.end(),
|
| + std::mem_fun(&Workspace::ReleaseWindow));
|
| std::for_each(pending_workspaces_.begin(), pending_workspaces_.end(),
|
| std::mem_fun(&Workspace::ReleaseWindow));
|
| std::for_each(to_delete_.begin(), to_delete_.end(),
|
| std::mem_fun(&Workspace::ReleaseWindow));
|
| STLDeleteElements(&workspaces_);
|
| + STLDeleteElements(&hidden_workspaces_);
|
| STLDeleteElements(&pending_workspaces_);
|
| STLDeleteElements(&to_delete_);
|
| }
|
| @@ -264,6 +267,35 @@ Window* WorkspaceManager::GetParentForNewWindow(Window* window) {
|
| return desktop_workspace()->window();
|
| }
|
|
|
| +bool WorkspaceManager::CycleAwayFromCurrentlyActiveWorkspace() {
|
| + if (active_workspace_ == desktop_workspace())
|
| + return false;
|
| +
|
| + aura::Window* active_window = active_workspace_->GetActiveWindow();
|
| + MoveWorkspaceToHiddenOrDelete(active_workspace_, NULL, SWITCH_OTHER);
|
| +
|
| + // The activation controller will pick a window from the just activated
|
| + // workspace to activate as a result of DeactivateWindow().
|
| + if (active_window)
|
| + wm::DeactivateWindow(active_window);
|
| + return true;
|
| +}
|
| +
|
| +bool WorkspaceManager::CycleToNextHiddenWorkspace() {
|
| + if (hidden_workspaces_.empty())
|
| + return false;
|
| +
|
| + aura::Window* active_window = active_workspace_->GetActiveWindow();
|
| + SetActiveWorkspace(hidden_workspaces_.back(), SWITCH_OTHER,
|
| + base::TimeDelta());
|
| +
|
| + // The activation controller will pick a window from the just activated
|
| + // workspace to activate as a result of DeactivateWindow().
|
| + if (active_window)
|
| + wm::DeactivateWindow(active_window);
|
| + return true;
|
| +}
|
| +
|
| void WorkspaceManager::DoInitialAnimation() {
|
| if (active_workspace_->is_maximized()) {
|
| RootWindowController* root_controller = GetRootWindowController(
|
| @@ -279,6 +311,10 @@ void WorkspaceManager::DoInitialAnimation() {
|
| ShowWorkspace(active_workspace_, active_workspace_, SWITCH_INITIAL);
|
| }
|
|
|
| +aura::Window* WorkspaceManager::GetActiveWorkspaceWindow() const {
|
| + return active_workspace_->window();
|
| +}
|
| +
|
| void WorkspaceManager::OnAppTerminating() {
|
| app_terminating_ = true;
|
| }
|
| @@ -305,6 +341,10 @@ void WorkspaceManager::SetActiveWorkspace(Workspace* workspace,
|
| if (active_workspace_ == workspace)
|
| return;
|
|
|
| + Workspaces::iterator it = std::find(
|
| + hidden_workspaces_.begin(), hidden_workspaces_.end(), workspace);
|
| + if (it != hidden_workspaces_.end())
|
| + hidden_workspaces_.erase(it);
|
| pending_workspaces_.erase(workspace);
|
|
|
| // Adjust the z-order. No need to adjust the z-order for the desktop since
|
| @@ -371,7 +411,7 @@ Workspace* WorkspaceManager::CreateWorkspace(bool maximized) {
|
| return new Workspace(this, contents_view_, maximized);
|
| }
|
|
|
| -void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
|
| +void WorkspaceManager::MoveWorkspaceToHiddenOrDelete(
|
| Workspace* workspace,
|
| Window* stack_beneath,
|
| SwitchReason reason) {
|
| @@ -388,19 +428,26 @@ void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
|
|
|
| MoveChildrenToDesktop(workspace->window(), stack_beneath);
|
|
|
| + bool workspace_previously_active = false;
|
| {
|
| Workspaces::iterator workspace_i(FindWorkspace(workspace));
|
| - if (workspace_i != workspaces_.end())
|
| + if (workspace_i != workspaces_.end()) {
|
| workspaces_.erase(workspace_i);
|
| + workspace_previously_active = true;
|
| + }
|
| }
|
|
|
| if (workspace->window()->children().empty()) {
|
| if (workspace == unminimizing_workspace_)
|
| unminimizing_workspace_ = NULL;
|
| + Workspaces::iterator hidden_i = std::find(
|
| + hidden_workspaces_.begin(), hidden_workspaces_.end(), workspace);
|
| + if (hidden_i != hidden_workspaces_.end())
|
| + hidden_workspaces_.erase(hidden_i);
|
| pending_workspaces_.erase(workspace);
|
| ScheduleDelete(workspace);
|
| - } else {
|
| - pending_workspaces_.insert(workspace);
|
| + } else if (workspace_previously_active) {
|
| + hidden_workspaces_.push_back(workspace);
|
| }
|
| }
|
|
|
| @@ -620,15 +667,15 @@ void WorkspaceManager::OnWillRemoveWindowFromWorkspace(Workspace* workspace,
|
|
|
| void WorkspaceManager::OnWindowRemovedFromWorkspace(Workspace* workspace,
|
| Window* child) {
|
| - if (workspace->ShouldMoveToPending())
|
| - MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_WINDOW_REMOVED);
|
| + if (workspace->ShouldMoveToHidden())
|
| + MoveWorkspaceToHiddenOrDelete(workspace, NULL, SWITCH_WINDOW_REMOVED);
|
| }
|
|
|
| void WorkspaceManager::OnWorkspaceChildWindowVisibilityChanged(
|
| Workspace* workspace,
|
| Window* child) {
|
| - if (workspace->ShouldMoveToPending()) {
|
| - MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_VISIBILITY_CHANGED);
|
| + if (workspace->ShouldMoveToHidden()) {
|
| + MoveWorkspaceToHiddenOrDelete(workspace, NULL, SWITCH_VISIBILITY_CHANGED);
|
| } else {
|
| if (child->TargetVisibility())
|
| RearrangeVisibleWindowOnShow(child);
|
| @@ -654,8 +701,8 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
|
| // |child| better still be in |workspace| else things have gone wrong.
|
| DCHECK_EQ(workspace, child->GetProperty(kWorkspaceKey));
|
| if (wm::IsWindowMinimized(child)) {
|
| - if (workspace->ShouldMoveToPending())
|
| - MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_MINIMIZED);
|
| + if (workspace->ShouldMoveToHidden())
|
| + MoveWorkspaceToHiddenOrDelete(workspace, NULL, SWITCH_MINIMIZED);
|
| DCHECK(!old_layer);
|
| } else {
|
| // Set of cases to deal with:
|
| @@ -681,7 +728,7 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
|
| new_workspace = desktop_workspace();
|
| SetActiveWorkspace(new_workspace, SWITCH_MAXIMIZED_OR_RESTORED,
|
| duration);
|
| - MoveWorkspaceToPendingOrDelete(workspace, child,
|
| + MoveWorkspaceToHiddenOrDelete(workspace, child,
|
| SWITCH_MAXIMIZED_OR_RESTORED);
|
| if (FindWorkspace(workspace) == workspaces_.end())
|
| workspace = NULL;
|
|
|