OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/wm/maximize_mode/maximize_mode_window_manager.h" | 5 #include "ash/wm/maximize_mode/maximize_mode_window_manager.h" |
6 | 6 |
| 7 #include "ash/root_window_controller.h" |
7 #include "ash/shell.h" | 8 #include "ash/shell.h" |
8 #include "ash/switchable_windows.h" | 9 #include "ash/shell_window_ids.h" |
| 10 #include "ash/wm/maximize_mode/workspace_backdrop_delegate.h" |
9 #include "ash/wm/mru_window_tracker.h" | 11 #include "ash/wm/mru_window_tracker.h" |
| 12 #include "ash/wm/workspace_controller.h" |
10 #include "ui/aura/window.h" | 13 #include "ui/aura/window.h" |
11 #include "ui/gfx/screen.h" | 14 #include "ui/gfx/screen.h" |
12 | 15 |
13 namespace ash { | 16 namespace ash { |
14 namespace internal { | 17 namespace internal { |
15 | 18 |
16 MaximizeModeWindowManager::~MaximizeModeWindowManager() { | 19 MaximizeModeWindowManager::~MaximizeModeWindowManager() { |
| 20 Shell::GetInstance()->RemoveShellObserver(this); |
17 Shell::GetScreen()->RemoveObserver(this); | 21 Shell::GetScreen()->RemoveObserver(this); |
| 22 EnableBackdropBehindTopWindowOnEachDisplay(false); |
18 RemoveWindowCreationObservers(); | 23 RemoveWindowCreationObservers(); |
19 RestoreAllWindows(); | 24 RestoreAllWindows(); |
20 } | 25 } |
21 | 26 |
22 int MaximizeModeWindowManager::GetNumberOfManagedWindows() { | 27 int MaximizeModeWindowManager::GetNumberOfManagedWindows() { |
23 return initial_state_type_.size(); | 28 return initial_state_type_.size(); |
24 } | 29 } |
25 | 30 |
| 31 void MaximizeModeWindowManager::OnOverviewModeStarted() { |
| 32 if (backdrops_hidden_) |
| 33 return; |
| 34 |
| 35 EnableBackdropBehindTopWindowOnEachDisplay(false); |
| 36 backdrops_hidden_ = true; |
| 37 } |
| 38 |
| 39 void MaximizeModeWindowManager::OnOverviewModeEnded() { |
| 40 if (!backdrops_hidden_) |
| 41 return; |
| 42 |
| 43 backdrops_hidden_ = false; |
| 44 EnableBackdropBehindTopWindowOnEachDisplay(true); |
| 45 } |
| 46 |
26 void MaximizeModeWindowManager::OnWindowDestroying(aura::Window* window) { | 47 void MaximizeModeWindowManager::OnWindowDestroying(aura::Window* window) { |
27 // If a known window gets destroyed we need to remove all knowledge about it. | 48 // If a known window gets destroyed we need to remove all knowledge about it. |
28 if (!IsContainerWindow(window)) | 49 if (!IsContainerWindow(window)) |
29 ForgetWindow(window); | 50 ForgetWindow(window); |
30 } | 51 } |
31 | 52 |
32 void MaximizeModeWindowManager::OnWindowAdded( | 53 void MaximizeModeWindowManager::OnWindowAdded( |
33 aura::Window* window) { | 54 aura::Window* window) { |
34 // A window can get removed and then re-added by a drag and drop operation. | 55 // A window can get removed and then re-added by a drag and drop operation. |
35 if (IsContainerWindow(window->parent()) && | 56 if (IsContainerWindow(window->parent()) && |
(...skipping 22 matching lines...) Expand all Loading... |
58 } | 79 } |
59 | 80 |
60 void MaximizeModeWindowManager::OnDisplayAdded(const gfx::Display& display) { | 81 void MaximizeModeWindowManager::OnDisplayAdded(const gfx::Display& display) { |
61 DisplayConfigurationChanged(); | 82 DisplayConfigurationChanged(); |
62 } | 83 } |
63 | 84 |
64 void MaximizeModeWindowManager::OnDisplayRemoved(const gfx::Display& display) { | 85 void MaximizeModeWindowManager::OnDisplayRemoved(const gfx::Display& display) { |
65 DisplayConfigurationChanged(); | 86 DisplayConfigurationChanged(); |
66 } | 87 } |
67 | 88 |
68 MaximizeModeWindowManager::MaximizeModeWindowManager() { | 89 MaximizeModeWindowManager::MaximizeModeWindowManager() |
| 90 : backdrops_hidden_(false) { |
| 91 // TODO(skuhne): Turn off the overview mode and full screen modes before |
| 92 // entering the MaximzieMode. |
69 MaximizeAllWindows(); | 93 MaximizeAllWindows(); |
70 AddWindowCreationObservers(); | 94 AddWindowCreationObservers(); |
| 95 EnableBackdropBehindTopWindowOnEachDisplay(true); |
71 Shell::GetScreen()->AddObserver(this); | 96 Shell::GetScreen()->AddObserver(this); |
| 97 Shell::GetInstance()->AddShellObserver(this); |
72 } | 98 } |
73 | 99 |
74 void MaximizeModeWindowManager::MaximizeAllWindows() { | 100 void MaximizeModeWindowManager::MaximizeAllWindows() { |
75 MruWindowTracker::WindowList windows = | 101 MruWindowTracker::WindowList windows = |
76 MruWindowTracker::BuildWindowList(false); | 102 MruWindowTracker::BuildWindowList(false); |
77 // Add all existing Mru windows. | 103 // Add all existing Mru windows. |
78 for (MruWindowTracker::WindowList::iterator window = windows.begin(); | 104 for (MruWindowTracker::WindowList::iterator window = windows.begin(); |
79 window != windows.end(); ++window) { | 105 window != windows.end(); ++window) { |
80 MaximizeAndTrackWindow(*window); | 106 MaximizeAndTrackWindow(*window); |
81 } | 107 } |
(...skipping 21 matching lines...) Expand all Loading... |
103 // This window type should not be able to have a restore state set (since | 129 // This window type should not be able to have a restore state set (since |
104 // it cannot maximize). | 130 // it cannot maximize). |
105 DCHECK(!window_state->HasRestoreBounds()); | 131 DCHECK(!window_state->HasRestoreBounds()); |
106 // Store the coordinates as restore coordinates. | 132 // Store the coordinates as restore coordinates. |
107 gfx::Rect initial_rect = window->bounds(); | 133 gfx::Rect initial_rect = window->bounds(); |
108 if (window->parent()) | 134 if (window->parent()) |
109 window_state->SetRestoreBoundsInParent(initial_rect); | 135 window_state->SetRestoreBoundsInParent(initial_rect); |
110 else | 136 else |
111 window_state->SetRestoreBoundsInScreen(initial_rect); | 137 window_state->SetRestoreBoundsInScreen(initial_rect); |
112 CenterWindow(window); | 138 CenterWindow(window); |
113 // TODO(skuhne): Add a background cover layer. | |
114 } else { | 139 } else { |
115 // Minimized windows can remain as they are. | 140 // Minimized windows can remain as they are. |
116 if (state != wm::WINDOW_STATE_TYPE_MINIMIZED) | 141 if (state != wm::WINDOW_STATE_TYPE_MINIMIZED) |
117 wm::GetWindowState(window)->Maximize(); | 142 wm::GetWindowState(window)->Maximize(); |
118 } | 143 } |
119 } | 144 } |
120 window_state->set_can_be_dragged(false); | 145 window_state->set_can_be_dragged(false); |
121 } | 146 } |
122 | 147 |
123 void MaximizeModeWindowManager::RestoreAndForgetWindow( | 148 void MaximizeModeWindowManager::RestoreAndForgetWindow( |
124 aura::Window* window) { | 149 aura::Window* window) { |
125 wm::WindowStateType state = ForgetWindow(window); | 150 wm::WindowStateType state = ForgetWindow(window); |
126 wm::WindowState* window_state = wm::GetWindowState(window); | 151 wm::WindowState* window_state = wm::GetWindowState(window); |
127 window_state->set_can_be_dragged(true); | 152 window_state->set_can_be_dragged(true); |
128 // Restore window if it can be restored. | 153 // Restore window if it can be restored. |
129 if (state != wm::WINDOW_STATE_TYPE_MAXIMIZED) { | 154 if (state != wm::WINDOW_STATE_TYPE_MAXIMIZED) { |
130 if (!CanMaximize(window)) { | 155 if (!CanMaximize(window)) { |
131 // TODO(skuhne): Remove the background cover layer. | |
132 if (window_state->HasRestoreBounds()) { | 156 if (window_state->HasRestoreBounds()) { |
133 // TODO(skuhne): If the system shuts down in maximized mode, the proper | 157 // TODO(skuhne): If the system shuts down in maximized mode, the proper |
134 // restore coordinates should get saved. | 158 // restore coordinates should get saved. |
135 gfx::Rect initial_bounds = | 159 gfx::Rect initial_bounds = |
136 window->parent() ? window_state->GetRestoreBoundsInParent() : | 160 window->parent() ? window_state->GetRestoreBoundsInParent() : |
137 window_state->GetRestoreBoundsInScreen(); | 161 window_state->GetRestoreBoundsInScreen(); |
138 window_state->ClearRestoreBounds(); | 162 window_state->ClearRestoreBounds(); |
139 // TODO(skuhne): The screen might have changed and we should make sure | 163 // TODO(skuhne): The screen might have changed and we should make sure |
140 // that the bounds are in a visible area. | 164 // that the bounds are in a visible area. |
141 window->SetBounds(initial_bounds); | 165 window->SetBounds(initial_bounds); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 work_area.x() + (work_area.width() - window_size.width()) / 2, | 204 work_area.x() + (work_area.width() - window_size.width()) / 2, |
181 work_area.y() + (work_area.height() - window_size.height()) / 2, | 205 work_area.y() + (work_area.height() - window_size.height()) / 2, |
182 window_size.width(), | 206 window_size.width(), |
183 window_size.height()); | 207 window_size.height()); |
184 | 208 |
185 window->SetBounds(window_bounds); | 209 window->SetBounds(window_bounds); |
186 } | 210 } |
187 | 211 |
188 void MaximizeModeWindowManager::AddWindowCreationObservers() { | 212 void MaximizeModeWindowManager::AddWindowCreationObservers() { |
189 DCHECK(observed_container_windows_.empty()); | 213 DCHECK(observed_container_windows_.empty()); |
190 // Observe window activations and switchable containers on all root windows | 214 // Observe window activations/creations in the default containers on all root |
191 // for newly created windows during overview. | 215 // windows. |
192 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 216 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
193 for (aura::Window::Windows::const_iterator iter = root_windows.begin(); | 217 for (aura::Window::Windows::const_iterator iter = root_windows.begin(); |
194 iter != root_windows.end(); ++iter) { | 218 iter != root_windows.end(); ++iter) { |
195 for (size_t i = 0; i < kSwitchableWindowContainerIdsLength; ++i) { | 219 aura::Window* container = Shell::GetContainer(*iter, |
196 aura::Window* container = Shell::GetContainer(*iter, | 220 internal::kShellWindowId_DefaultContainer); |
197 kSwitchableWindowContainerIds[i]); | 221 DCHECK(observed_container_windows_.find(container) == |
198 DCHECK(observed_container_windows_.find(container) == | 222 observed_container_windows_.end()); |
199 observed_container_windows_.end()); | 223 container->AddObserver(this); |
200 container->AddObserver(this); | 224 observed_container_windows_.insert(container); |
201 observed_container_windows_.insert(container); | |
202 } | |
203 } | 225 } |
204 } | 226 } |
205 | 227 |
206 void MaximizeModeWindowManager::RemoveWindowCreationObservers() { | 228 void MaximizeModeWindowManager::RemoveWindowCreationObservers() { |
207 for (std::set<aura::Window*>::iterator iter = | 229 for (std::set<aura::Window*>::iterator iter = |
208 observed_container_windows_.begin(); | 230 observed_container_windows_.begin(); |
209 iter != observed_container_windows_.end(); ++iter) { | 231 iter != observed_container_windows_.end(); ++iter) { |
210 (*iter)->RemoveObserver(this); | 232 (*iter)->RemoveObserver(this); |
211 } | 233 } |
212 observed_container_windows_.clear(); | 234 observed_container_windows_.clear(); |
213 } | 235 } |
214 | 236 |
215 void MaximizeModeWindowManager::DisplayConfigurationChanged() { | 237 void MaximizeModeWindowManager::DisplayConfigurationChanged() { |
| 238 EnableBackdropBehindTopWindowOnEachDisplay(false); |
216 RemoveWindowCreationObservers(); | 239 RemoveWindowCreationObservers(); |
217 AddWindowCreationObservers(); | 240 AddWindowCreationObservers(); |
| 241 EnableBackdropBehindTopWindowOnEachDisplay(true); |
218 } | 242 } |
219 | 243 |
220 bool MaximizeModeWindowManager::IsContainerWindow(aura::Window* window) { | 244 bool MaximizeModeWindowManager::IsContainerWindow(aura::Window* window) { |
221 return observed_container_windows_.find(window) != | 245 return observed_container_windows_.find(window) != |
222 observed_container_windows_.end(); | 246 observed_container_windows_.end(); |
223 } | 247 } |
224 | 248 |
| 249 void MaximizeModeWindowManager::EnableBackdropBehindTopWindowOnEachDisplay( |
| 250 bool enable) { |
| 251 if (backdrops_hidden_) |
| 252 return; |
| 253 // Inform the WorkspaceLayoutManager that we want to show a backdrop behind |
| 254 // the topmost window of its container. |
| 255 Shell::RootWindowControllerList controllers = |
| 256 Shell::GetAllRootWindowControllers(); |
| 257 for (Shell::RootWindowControllerList::iterator iter = controllers.begin(); |
| 258 iter != controllers.end(); ++iter) { |
| 259 RootWindowController* controller = *iter; |
| 260 aura::Window* container = Shell::GetContainer( |
| 261 controller->root_window(), |
| 262 internal::kShellWindowId_DefaultContainer); |
| 263 controller->workspace_controller()->SetMaximizeBackdropDelegate( |
| 264 scoped_ptr<WorkspaceLayoutManagerDelegate>( |
| 265 enable ? new WorkspaceBackdropDelegate(container) : NULL)); |
| 266 } |
| 267 } |
| 268 |
225 } // namespace internal | 269 } // namespace internal |
226 } // namespace ash | 270 } // namespace ash |
OLD | NEW |