OLD | NEW |
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/wm/workspace/workspace_layout_manager.h" | 5 #include "ash/wm/workspace/workspace_layout_manager.h" |
6 | 6 |
7 #include "ash/root_window_controller.h" | 7 #include "ash/root_window_controller.h" |
8 #include "ash/screen_ash.h" | 8 #include "ash/screen_ash.h" |
9 #include "ash/session_state_delegate.h" | 9 #include "ash/session_state_delegate.h" |
10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 gfx::Rect restore; | 184 gfx::Rect restore; |
185 if (old_state == ui::SHOW_STATE_MINIMIZED && | 185 if (old_state == ui::SHOW_STATE_MINIMIZED && |
186 (new_state == ui::SHOW_STATE_NORMAL || | 186 (new_state == ui::SHOW_STATE_NORMAL || |
187 new_state == ui::SHOW_STATE_DEFAULT) && | 187 new_state == ui::SHOW_STATE_DEFAULT) && |
188 GetRestoreBoundsInScreen(window) && | 188 GetRestoreBoundsInScreen(window) && |
189 !GetWindowAlwaysRestoresToRestoreBounds(window)) { | 189 !GetWindowAlwaysRestoresToRestoreBounds(window)) { |
190 restore = *GetRestoreBoundsInScreen(window); | 190 restore = *GetRestoreBoundsInScreen(window); |
191 SetRestoreBoundsInScreen(window, window->GetBoundsInScreen()); | 191 SetRestoreBoundsInScreen(window, window->GetBoundsInScreen()); |
192 } | 192 } |
193 | 193 |
194 // If the new state requires |window| to be in a workspace, clone the layer. | |
195 // WorkspaceManager will use it (and take ownership of it) when animating. | |
196 // Ideally we could use that of BaseLayoutManager, but that proves | |
197 // problematic. In particular when restoring we need to animate on top of | |
198 // the workspace animating in. | |
199 ui::Layer* cloned_layer = NULL; | |
200 BoundsMap bounds_map; | |
201 if (wm::IsActiveWindow(window) && | |
202 ((new_state == ui::SHOW_STATE_FULLSCREEN && | |
203 wm::IsWindowStateNormal(old_state)) || | |
204 (new_state != ui::SHOW_STATE_FULLSCREEN && | |
205 old_state == ui::SHOW_STATE_FULLSCREEN && | |
206 new_state != ui::SHOW_STATE_MINIMIZED))) { | |
207 BuildWindowBoundsMap(window, &bounds_map); | |
208 cloned_layer = views::corewm::RecreateWindowLayers(window, false); | |
209 // Constrained windows don't get their bounds reset when we update the | |
210 // window bounds. Leaving them empty is unexpected, so we reset them now. | |
211 ResetConstrainedWindowBoundsIfNecessary(bounds_map, window); | |
212 } | |
213 UpdateBoundsFromShowState(window); | 194 UpdateBoundsFromShowState(window); |
214 | 195 ShowStateChanged(window, old_state); |
215 if (cloned_layer) { | |
216 // Even though we just set the bounds not all descendants may have valid | |
217 // bounds. For example, constrained windows don't resize with the parent. | |
218 // Ensure that all windows that had a bounds before we cloned the layer | |
219 // have a bounds now. | |
220 ResetBoundsIfNecessary(bounds_map, window); | |
221 } | |
222 | |
223 ShowStateChanged(window, old_state, cloned_layer); | |
224 | 196 |
225 // Set the restore rectangle to the previously set restore rectangle. | 197 // Set the restore rectangle to the previously set restore rectangle. |
226 if (!restore.IsEmpty()) | 198 if (!restore.IsEmpty()) |
227 SetRestoreBoundsInScreen(window, restore); | 199 SetRestoreBoundsInScreen(window, restore); |
228 } | 200 } |
229 | 201 |
230 if (key == internal::kWindowTrackedByWorkspaceKey && | 202 if (key == internal::kWindowTrackedByWorkspaceKey && |
231 GetTrackedByWorkspace(window)) { | 203 GetTrackedByWorkspace(window)) { |
232 workspace_manager()->OnTrackedByWorkspaceChanged(workspace_, window); | 204 workspace_manager()->OnTrackedByWorkspaceChanged(workspace_, window); |
233 if (wm::IsWindowMaximized(window)) | 205 SetMaximizedOrFullscreenBounds(window); |
234 SetMaximizedOrFullscreenBounds(window); | |
235 } | 206 } |
236 | 207 |
237 if (key == aura::client::kAlwaysOnTopKey && | 208 if (key == aura::client::kAlwaysOnTopKey && |
238 window->GetProperty(aura::client::kAlwaysOnTopKey)) { | 209 window->GetProperty(aura::client::kAlwaysOnTopKey)) { |
239 internal::AlwaysOnTopController* controller = | 210 internal::AlwaysOnTopController* controller = |
240 GetRootWindowController(window->GetRootWindow())-> | 211 GetRootWindowController(window->GetRootWindow())-> |
241 always_on_top_controller(); | 212 always_on_top_controller(); |
242 controller->GetContainer(window)->AddChild(window); | 213 controller->GetContainer(window)->AddChild(window); |
243 } | 214 } |
244 } | 215 } |
245 | 216 |
246 void WorkspaceLayoutManager::OnWindowDestroying(aura::Window* window) { | 217 void WorkspaceLayoutManager::OnWindowDestroying(aura::Window* window) { |
247 if (root_window_ == window) { | 218 if (root_window_ == window) { |
248 root_window_->RemoveObserver(this); | 219 root_window_->RemoveObserver(this); |
249 root_window_ = NULL; | 220 root_window_ = NULL; |
250 } | 221 } |
251 } | 222 } |
252 | 223 |
253 void WorkspaceLayoutManager::OnWindowBoundsChanged( | 224 void WorkspaceLayoutManager::OnWindowBoundsChanged( |
254 aura::Window* window, | 225 aura::Window* window, |
255 const gfx::Rect& old_bounds, | 226 const gfx::Rect& old_bounds, |
256 const gfx::Rect& new_bounds) { | 227 const gfx::Rect& new_bounds) { |
257 if (root_window_ == window) | 228 if (root_window_ == window) |
258 AdjustWindowSizesForScreenChange(ADJUST_WINDOW_SCREEN_SIZE_CHANGED); | 229 AdjustWindowSizesForScreenChange(ADJUST_WINDOW_SCREEN_SIZE_CHANGED); |
259 } | 230 } |
260 | 231 |
261 void WorkspaceLayoutManager::ShowStateChanged( | 232 void WorkspaceLayoutManager::ShowStateChanged( |
262 Window* window, | 233 Window* window, |
263 ui::WindowShowState last_show_state, | 234 ui::WindowShowState last_show_state) { |
264 ui::Layer* cloned_layer) { | |
265 if (wm::IsWindowMinimized(window)) { | 235 if (wm::IsWindowMinimized(window)) { |
266 DCHECK(!cloned_layer); | |
267 // Save the previous show state so that we can correctly restore it. | 236 // Save the previous show state so that we can correctly restore it. |
268 window->SetProperty(aura::client::kRestoreShowStateKey, last_show_state); | 237 window->SetProperty(aura::client::kRestoreShowStateKey, last_show_state); |
269 views::corewm::SetWindowVisibilityAnimationType( | 238 views::corewm::SetWindowVisibilityAnimationType( |
270 window, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); | 239 window, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
271 workspace_manager()->OnWorkspaceWindowShowStateChanged( | 240 workspace_manager()->OnWorkspaceWindowShowStateChanged( |
272 workspace_, window, last_show_state, NULL); | 241 workspace_, window, last_show_state); |
273 window->Hide(); | 242 window->Hide(); |
274 if (wm::IsActiveWindow(window)) | 243 if (wm::IsActiveWindow(window)) |
275 wm::DeactivateWindow(window); | 244 wm::DeactivateWindow(window); |
276 } else { | 245 } else { |
277 if ((window->TargetVisibility() || | 246 if ((window->TargetVisibility() || |
278 last_show_state == ui::SHOW_STATE_MINIMIZED) && | 247 last_show_state == ui::SHOW_STATE_MINIMIZED) && |
279 !window->layer()->visible()) { | 248 !window->layer()->visible()) { |
280 // The layer may be hidden if the window was previously minimized. Make | 249 // The layer may be hidden if the window was previously minimized. Make |
281 // sure it's visible. | 250 // sure it's visible. |
282 window->Show(); | 251 window->Show(); |
283 } | 252 } |
284 if (last_show_state == ui::SHOW_STATE_MINIMIZED && | 253 if (last_show_state == ui::SHOW_STATE_MINIMIZED && |
285 !wm::IsWindowMaximized(window) && | 254 !wm::IsWindowMaximized(window) && |
286 !wm::IsWindowFullscreen(window)) { | 255 !wm::IsWindowFullscreen(window)) { |
287 window->ClearProperty(internal::kWindowRestoresToRestoreBounds); | 256 window->ClearProperty(internal::kWindowRestoresToRestoreBounds); |
288 } | 257 } |
289 workspace_manager()->OnWorkspaceWindowShowStateChanged( | 258 workspace_manager()->OnWorkspaceWindowShowStateChanged( |
290 workspace_, window, last_show_state, cloned_layer); | 259 workspace_, window, last_show_state); |
291 } | 260 } |
292 } | 261 } |
293 | 262 |
294 void WorkspaceLayoutManager::AdjustWindowSizesForScreenChange( | 263 void WorkspaceLayoutManager::AdjustWindowSizesForScreenChange( |
295 AdjustWindowReason reason) { | 264 AdjustWindowReason reason) { |
296 // Don't do any adjustments of the insets while we are in screen locked mode. | 265 // Don't do any adjustments of the insets while we are in screen locked mode. |
297 // This would happen if the launcher was auto hidden before the login screen | 266 // This would happen if the launcher was auto hidden before the login screen |
298 // was shown and then gets shown when the login screen gets presented. | 267 // was shown and then gets shown when the login screen gets presented. |
299 if (reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED && | 268 if (reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED && |
300 Shell::GetInstance()->session_state_delegate()->IsScreenLocked()) | 269 Shell::GetInstance()->session_state_delegate()->IsScreenLocked()) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 } | 341 } |
373 ClearRestoreBounds(window); | 342 ClearRestoreBounds(window); |
374 break; | 343 break; |
375 } | 344 } |
376 | 345 |
377 case ui::SHOW_STATE_MAXIMIZED: | 346 case ui::SHOW_STATE_MAXIMIZED: |
378 CrossFadeToBounds(window, ScreenAsh::GetMaximizedWindowBoundsInParent( | 347 CrossFadeToBounds(window, ScreenAsh::GetMaximizedWindowBoundsInParent( |
379 window->parent()->parent())); | 348 window->parent()->parent())); |
380 break; | 349 break; |
381 case ui::SHOW_STATE_FULLSCREEN: | 350 case ui::SHOW_STATE_FULLSCREEN: |
382 SetMaximizedOrFullscreenBounds(window); | 351 CrossFadeToBounds(window, ScreenAsh::GetDisplayBoundsInParent( |
| 352 window->parent()->parent())); |
383 break; | 353 break; |
384 | 354 |
385 default: | 355 default: |
386 break; | 356 break; |
387 } | 357 } |
388 } | 358 } |
389 | 359 |
390 bool WorkspaceLayoutManager::SetMaximizedOrFullscreenBounds( | 360 bool WorkspaceLayoutManager::SetMaximizedOrFullscreenBounds( |
391 aura::Window* window) { | 361 aura::Window* window) { |
392 if (!GetTrackedByWorkspace(window)) | 362 if (!GetTrackedByWorkspace(window)) |
(...skipping 16 matching lines...) Expand all Loading... |
409 } | 379 } |
410 return false; | 380 return false; |
411 } | 381 } |
412 | 382 |
413 WorkspaceManager* WorkspaceLayoutManager::workspace_manager() { | 383 WorkspaceManager* WorkspaceLayoutManager::workspace_manager() { |
414 return workspace_->workspace_manager(); | 384 return workspace_->workspace_manager(); |
415 } | 385 } |
416 | 386 |
417 } // namespace internal | 387 } // namespace internal |
418 } // namespace ash | 388 } // namespace ash |
OLD | NEW |