Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2622)

Unified Diff: ash/root_window_controller.cc

Issue 10830365: Initial crack at new workspace behavior. Each workspace now has its (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/display/screen_position_controller.cc ('k') | ash/shell/window_watcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)) {
« no previous file with comments | « ash/display/screen_position_controller.cc ('k') | ash/shell/window_watcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698