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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/display/screen_position_controller.cc ('k') | ash/shell/window_watcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/root_window_controller.h" 5 #include "ash/root_window_controller.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "ash/desktop_background/desktop_background_widget_controller.h" 9 #include "ash/desktop_background/desktop_background_widget_controller.h"
10 #include "ash/display/display_controller.h" 10 #include "ash/display/display_controller.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 aura::Window* container = new aura::Window(NULL); 43 aura::Window* container = new aura::Window(NULL);
44 container->set_id(window_id); 44 container->set_id(window_id);
45 container->SetName(name); 45 container->SetName(name);
46 container->Init(ui::LAYER_NOT_DRAWN); 46 container->Init(ui::LAYER_NOT_DRAWN);
47 parent->AddChild(container); 47 parent->AddChild(container);
48 if (window_id != internal::kShellWindowId_UnparentedControlContainer) 48 if (window_id != internal::kShellWindowId_UnparentedControlContainer)
49 container->Show(); 49 container->Show();
50 return container; 50 return container;
51 } 51 }
52 52
53 void MoveAllWindows(aura::RootWindow* src, 53 // Returns all the children of the workspace windows, eg the standard top-level
54 aura::RootWindow* dst) { 54 // windows.
55 // Windows move only from secondary displays to the primary 55 std::vector<aura::Window*> GetWorkspaceWindows(aura::RootWindow* root) {
56 // display, so no need to move windows in the containers that are 56 using aura::Window;
57 // available only in the primary display (launcher, panels etc) 57
58 std::vector<Window*> windows;
59 Window* container = Shell::GetContainer(
60 root, internal::kShellWindowId_DefaultContainer);
61 for (Window::Windows::const_reverse_iterator i =
62 container->children().rbegin();
63 i != container->children().rend(); ++i) {
64 Window* workspace_window = *i;
65 if (workspace_window->id() == internal::kShellWindowId_WorkspaceContainer) {
66 windows.insert(windows.end(), workspace_window->children().begin(),
67 workspace_window->children().end());
68 }
69 }
70 return windows;
71 }
72
73 // Reparents |window| to |new_parent|.
74 void ReparentWindow(aura::Window* window, aura::Window* new_parent) {
75 // Update the restore bounds to make it relative to the display.
76 gfx::Rect restore_bounds(GetRestoreBoundsInParent(window));
77 new_parent->AddChild(window);
78 if (!restore_bounds.IsEmpty())
79 SetRestoreBoundsInParent(window, restore_bounds);
80 }
81
82 // Reparents the appropriate set of windows from |src| to |dst|.
83 void ReparentAllWindows(aura::RootWindow* src, aura::RootWindow* dst) {
84 // Set of windows to move.
58 const int kContainerIdsToMove[] = { 85 const int kContainerIdsToMove[] = {
59 internal::kShellWindowId_DefaultContainer, 86 internal::kShellWindowId_DefaultContainer,
60 internal::kShellWindowId_AlwaysOnTopContainer, 87 internal::kShellWindowId_AlwaysOnTopContainer,
61 internal::kShellWindowId_SystemModalContainer, 88 internal::kShellWindowId_SystemModalContainer,
62 internal::kShellWindowId_LockSystemModalContainer, 89 internal::kShellWindowId_LockSystemModalContainer,
63 }; 90 };
91 // For Workspace2 we need to manually reparent the windows. This way
92 // Workspace2 can move the windows to the appropriate workspace.
93 if (internal::WorkspaceController::IsWorkspace2Enabled()) {
94 std::vector<aura::Window*> windows(GetWorkspaceWindows(src));
95 internal::WorkspaceController* workspace_controller =
96 GetRootWindowController(dst)->workspace_controller();
97 for (size_t i = 0; i < windows.size(); ++i) {
98 aura::Window* new_parent =
99 workspace_controller->GetParentForNewWindow(windows[i]);
100 ReparentWindow(windows[i], new_parent);
101 }
102 }
64 for (size_t i = 0; i < arraysize(kContainerIdsToMove); i++) { 103 for (size_t i = 0; i < arraysize(kContainerIdsToMove); i++) {
65 int id = kContainerIdsToMove[i]; 104 int id = kContainerIdsToMove[i];
105 if (id == internal::kShellWindowId_DefaultContainer &&
106 internal::WorkspaceController::IsWorkspace2Enabled())
107 continue;
108
66 aura::Window* src_container = Shell::GetContainer(src, id); 109 aura::Window* src_container = Shell::GetContainer(src, id);
67 aura::Window* dst_container = Shell::GetContainer(dst, id); 110 aura::Window* dst_container = Shell::GetContainer(dst, id);
68 aura::Window::Windows children = src_container->children(); 111 aura::Window::Windows children = src_container->children();
69 for (aura::Window::Windows::iterator iter = children.begin(); 112 for (aura::Window::Windows::iterator iter = children.begin();
70 iter != children.end(); ++iter) { 113 iter != children.end(); ++iter) {
71 aura::Window* window = *iter; 114 aura::Window* window = *iter;
72 // Don't move modal screen. 115 // Don't move modal screen.
73 if (internal::SystemModalContainerLayoutManager::IsModalScreen(window)) 116 if (internal::SystemModalContainerLayoutManager::IsModalScreen(window))
74 continue; 117 continue;
75 118
76 // Update the restore bounds to make it relative to the display. 119 ReparentWindow(window, dst_container);
77 gfx::Rect restore_bounds(GetRestoreBoundsInParent(window));
78 dst_container->AddChild(window);
79 if (!restore_bounds.IsEmpty())
80 SetRestoreBoundsInParent(window, restore_bounds);
81 } 120 }
82 } 121 }
83 } 122 }
84 123
85 // Mark the container window so that a widget added to this container will 124 // Mark the container window so that a widget added to this container will
86 // use the virtual screeen coordinates instead of parent. 125 // use the virtual screeen coordinates instead of parent.
87 void SetUsesScreenCoordinates(aura::Window* container) { 126 void SetUsesScreenCoordinates(aura::Window* container) {
88 container->SetProperty(internal::kUsesScreenCoordinatesKey, true); 127 container->SetProperty(internal::kUsesScreenCoordinatesKey, true);
89 } 128 }
90 129
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 activation_client->DeactivateWindow(active); 351 activation_client->DeactivateWindow(active);
313 // Release capture if any. 352 // Release capture if any.
314 aura::client::GetCaptureClient(root_window_.get())-> 353 aura::client::GetCaptureClient(root_window_.get())->
315 SetCapture(NULL); 354 SetCapture(NULL);
316 aura::WindowTracker tracker; 355 aura::WindowTracker tracker;
317 if (focused) 356 if (focused)
318 tracker.Add(focused); 357 tracker.Add(focused);
319 if (active && focused != active) 358 if (active && focused != active)
320 tracker.Add(active); 359 tracker.Add(active);
321 360
322 MoveAllWindows(root_window_.get(), dst); 361 ReparentAllWindows(root_window_.get(), dst);
323 362
324 // Restore focused or active window if it's still alive. 363 // Restore focused or active window if it's still alive.
325 if (focused && tracker.Contains(focused) && dst->Contains(focused)) { 364 if (focused && tracker.Contains(focused) && dst->Contains(focused)) {
326 dst->GetFocusManager()->SetFocusedWindow(focused, NULL); 365 dst->GetFocusManager()->SetFocusedWindow(focused, NULL);
327 } else if (active && tracker.Contains(active) && dst->Contains(active)) { 366 } else if (active && tracker.Contains(active) && dst->Contains(active)) {
328 activation_client->ActivateWindow(active); 367 activation_client->ActivateWindow(active);
329 } 368 }
330 } 369 }
331 370
332 } // namespace internal 371 } // namespace internal
333 } // namespace ash 372 } // namespace ash
OLDNEW
« 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