| Index: ash/root_window_controller.cc
|
| diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
|
| index 15fba6b576d0d02381e576ad0bd48c6d49d53f1a..6cb6c087169b8e8eed110d61fad7a3ea0bcb600c 100644
|
| --- a/ash/root_window_controller.cc
|
| +++ b/ash/root_window_controller.cc
|
| @@ -50,19 +50,62 @@ aura::Window* CreateContainer(int window_id,
|
| return container;
|
| }
|
|
|
| -void MoveAllWindows(aura::RootWindow* src,
|
| - aura::RootWindow* dst) {
|
| - // Windows move only from secondary displays to the primary
|
| - // display, so no need to move windows in the containers that are
|
| - // available only in the primary display (launcher, panels etc)
|
| +// Returns all the children of the workspace windows, eg the standard top-level
|
| +// windows.
|
| +std::vector<aura::Window*> GetWorkspaceWindows(aura::RootWindow* root) {
|
| + using aura::Window;
|
| +
|
| + std::vector<Window*> windows;
|
| + Window* container = Shell::GetContainer(
|
| + root, internal::kShellWindowId_DefaultContainer);
|
| + for (Window::Windows::const_reverse_iterator i =
|
| + container->children().rbegin();
|
| + i != container->children().rend(); ++i) {
|
| + Window* workspace_window = *i;
|
| + if (workspace_window->id() == internal::kShellWindowId_WorkspaceContainer) {
|
| + windows.insert(windows.end(), workspace_window->children().begin(),
|
| + workspace_window->children().end());
|
| + }
|
| + }
|
| + return windows;
|
| +}
|
| +
|
| +// Reparents |window| to |new_parent|.
|
| +void ReparentWindow(aura::Window* window, aura::Window* new_parent) {
|
| + // Update the restore bounds to make it relative to the display.
|
| + gfx::Rect restore_bounds(GetRestoreBoundsInParent(window));
|
| + new_parent->AddChild(window);
|
| + if (!restore_bounds.IsEmpty())
|
| + SetRestoreBoundsInParent(window, restore_bounds);
|
| +}
|
| +
|
| +// Reparents the appropriate set of windows from |src| to |dst|.
|
| +void ReparentAllWindows(aura::RootWindow* src, aura::RootWindow* dst) {
|
| + // Set of windows to move.
|
| const int kContainerIdsToMove[] = {
|
| internal::kShellWindowId_DefaultContainer,
|
| internal::kShellWindowId_AlwaysOnTopContainer,
|
| internal::kShellWindowId_SystemModalContainer,
|
| internal::kShellWindowId_LockSystemModalContainer,
|
| };
|
| + // For Workspace2 we need to manually reparent the windows. This way
|
| + // Workspace2 can move the windows to the appropriate workspace.
|
| + if (internal::WorkspaceController::IsWorkspace2Enabled()) {
|
| + std::vector<aura::Window*> windows(GetWorkspaceWindows(src));
|
| + internal::WorkspaceController* workspace_controller =
|
| + GetRootWindowController(dst)->workspace_controller();
|
| + for (size_t i = 0; i < windows.size(); ++i) {
|
| + aura::Window* new_parent =
|
| + workspace_controller->GetParentForNewWindow(windows[i]);
|
| + ReparentWindow(windows[i], new_parent);
|
| + }
|
| + }
|
| for (size_t i = 0; i < arraysize(kContainerIdsToMove); i++) {
|
| int id = kContainerIdsToMove[i];
|
| + if (id == internal::kShellWindowId_DefaultContainer &&
|
| + internal::WorkspaceController::IsWorkspace2Enabled())
|
| + continue;
|
| +
|
| aura::Window* src_container = Shell::GetContainer(src, id);
|
| aura::Window* dst_container = Shell::GetContainer(dst, id);
|
| aura::Window::Windows children = src_container->children();
|
| @@ -73,11 +116,7 @@ void MoveAllWindows(aura::RootWindow* src,
|
| if (internal::SystemModalContainerLayoutManager::IsModalScreen(window))
|
| continue;
|
|
|
| - // Update the restore bounds to make it relative to the display.
|
| - gfx::Rect restore_bounds(GetRestoreBoundsInParent(window));
|
| - dst_container->AddChild(window);
|
| - if (!restore_bounds.IsEmpty())
|
| - SetRestoreBoundsInParent(window, restore_bounds);
|
| + ReparentWindow(window, dst_container);
|
| }
|
| }
|
| }
|
| @@ -319,7 +358,7 @@ void RootWindowController::MoveWindowsTo(aura::RootWindow* dst) {
|
| if (active && focused != active)
|
| tracker.Add(active);
|
|
|
| - MoveAllWindows(root_window_.get(), dst);
|
| + ReparentAllWindows(root_window_.get(), dst);
|
|
|
| // Restore focused or active window if it's still alive.
|
| if (focused && tracker.Contains(focused) && dst->Contains(focused)) {
|
|
|