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 #ifndef ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ | 5 #ifndef ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ |
6 #define ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ | 6 #define ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "ash/ash_export.h" | 12 #include "ash/ash_export.h" |
13 #include "ash/shell_observer.h" | 13 #include "ash/shell_observer.h" |
14 #include "ash/wm/workspace/base_workspace_manager.h" | 14 #include "ash/wm/workspace/base_workspace_manager.h" |
15 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
17 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
18 #include "base/time.h" | 18 #include "base/time.h" |
19 #include "base/timer.h" | 19 #include "base/timer.h" |
20 #include "ui/base/ui_base_types.h" | 20 #include "ui/base/ui_base_types.h" |
21 | 21 |
22 namespace aura { | 22 namespace aura { |
23 class Window; | 23 class Window; |
24 } | 24 } |
25 | 25 |
| 26 namespace base { |
| 27 class TimeDelta; |
| 28 } |
| 29 |
26 namespace gfx { | 30 namespace gfx { |
27 class Point; | 31 class Point; |
28 class Rect; | 32 class Rect; |
29 } | 33 } |
30 | 34 |
31 namespace ui { | 35 namespace ui { |
32 class Layer; | 36 class Layer; |
33 } | 37 } |
34 | 38 |
35 namespace ash { | 39 namespace ash { |
36 namespace internal { | 40 namespace internal { |
37 | 41 |
| 42 class DesktopBackgroundFadeController; |
38 class ShelfLayoutManager; | 43 class ShelfLayoutManager; |
39 class WorkspaceLayoutManager2; | 44 class WorkspaceLayoutManager2; |
40 class WorkspaceManagerTest2; | 45 class WorkspaceManagerTest2; |
41 class Workspace2; | 46 class Workspace2; |
42 | 47 |
43 // WorkspaceManager manages multiple workspaces in the desktop. Workspaces are | 48 // WorkspaceManager manages multiple workspaces in the desktop. Workspaces are |
44 // implicitly created as windows are maximized (or made fullscreen), and | 49 // implicitly created as windows are maximized (or made fullscreen), and |
45 // destroyed when maximized windows are closed or restored. There is always one | 50 // destroyed when maximized windows are closed or restored. There is always one |
46 // workspace for the desktop. | 51 // workspace for the desktop. |
47 // Internally WorkspaceManager2 creates a Window for each Workspace. As windows | 52 // Internally WorkspaceManager2 creates a Window for each Workspace. As windows |
(...skipping 22 matching lines...) Expand all Loading... |
70 virtual aura::Window* GetParentForNewWindow(aura::Window* window) OVERRIDE; | 75 virtual aura::Window* GetParentForNewWindow(aura::Window* window) OVERRIDE; |
71 virtual void DoInitialAnimation() OVERRIDE; | 76 virtual void DoInitialAnimation() OVERRIDE; |
72 | 77 |
73 // ShellObserver overrides: | 78 // ShellObserver overrides: |
74 virtual void OnAppTerminating() OVERRIDE; | 79 virtual void OnAppTerminating() OVERRIDE; |
75 | 80 |
76 private: | 81 private: |
77 friend class WorkspaceLayoutManager2; | 82 friend class WorkspaceLayoutManager2; |
78 friend class WorkspaceManager2Test; | 83 friend class WorkspaceManager2Test; |
79 | 84 |
80 class LayoutManager; | 85 class LayoutManagerImpl; |
81 | 86 |
82 typedef std::vector<Workspace2*> Workspaces; | 87 typedef std::vector<Workspace2*> Workspaces; |
83 | 88 |
84 // Describes which, if any, of the workspaces should animate. NEW is the | 89 // Reason for the workspace switch. Used to determine the characterstics of |
85 // workspace that is becoming active, and OLD the workspace that was active. | 90 // the animation. |
86 enum AnimateType { | 91 enum SwitchReason { |
87 ANIMATE_NONE, | 92 SWITCH_WINDOW_MADE_ACTIVE, |
| 93 SWITCH_WINDOW_REMOVED, |
| 94 SWITCH_VISIBILITY_CHANGED, |
| 95 SWITCH_MINIMIZED, |
| 96 SWITCH_MAXIMIZED_OR_RESTORED, |
| 97 SWITCH_TRACKED_BY_WORKSPACE_CHANGED, |
88 | 98 |
89 // Animates only the new workspace in. | 99 // Switch as the result of DoInitialAnimation(). This isn't a real switch, |
90 ANIMATE_NEW, | 100 // rather we run the animations as if a switch occurred. |
| 101 SWITCH_INITIAL, |
91 | 102 |
92 // Animates both the old and new workspaces. | 103 // Edge case. See comment in OnWorkspaceWindowShowStateChanged(). Don't |
93 ANIMATE_OLD_AND_NEW, | 104 // make other types randomly use this! |
| 105 SWITCH_OTHER, |
94 }; | 106 }; |
95 | 107 |
96 // Updates the visibility and whether any windows overlap the shelf. | 108 // Updates the visibility and whether any windows overlap the shelf. |
97 void UpdateShelfVisibility(); | 109 void UpdateShelfVisibility(); |
98 | 110 |
99 // Returns the workspace that contains |window|. | 111 // Returns the workspace that contains |window|. |
100 Workspace2* FindBy(aura::Window* window) const; | 112 Workspace2* FindBy(aura::Window* window) const; |
101 | 113 |
102 // Sets the active workspace. | 114 // Sets the active workspace. |
103 void SetActiveWorkspace(Workspace2* workspace, AnimateType animate_type); | 115 void SetActiveWorkspace(Workspace2* workspace, |
| 116 SwitchReason reason, |
| 117 base::TimeDelta duration); |
104 | 118 |
105 // Returns the bounds of the work area. | 119 // Returns the bounds of the work area. |
106 gfx::Rect GetWorkAreaBounds() const; | 120 gfx::Rect GetWorkAreaBounds() const; |
107 | 121 |
108 // Returns an iterator into |workspaces_| for |workspace|. | 122 // Returns an iterator into |workspaces_| for |workspace|. |
109 Workspaces::iterator FindWorkspace(Workspace2* workspace); | 123 Workspaces::iterator FindWorkspace(Workspace2* workspace); |
110 | 124 |
111 Workspace2* desktop_workspace() { return workspaces_[0]; } | 125 Workspace2* desktop_workspace() { return workspaces_[0]; } |
112 const Workspace2* desktop_workspace() const { return workspaces_[0]; } | 126 const Workspace2* desktop_workspace() const { return workspaces_[0]; } |
113 | 127 |
114 // Creates a new workspace. The Workspace is not added to anything and is | 128 // Creates a new workspace. The Workspace is not added to anything and is |
115 // owned by the caller. | 129 // owned by the caller. |
116 Workspace2* CreateWorkspace(bool maximized); | 130 Workspace2* CreateWorkspace(bool maximized); |
117 | 131 |
118 // Moves all the non-maximized child windows of |workspace| to the desktop | 132 // Moves all the non-maximized child windows of |workspace| to the desktop |
119 // stacked beneath |stack_beneath| (if non-NULL). After moving child windows | 133 // stacked beneath |stack_beneath| (if non-NULL). After moving child windows |
120 // if |workspace| contains no children it is deleted, otherwise it it moved to | 134 // if |workspace| contains no children it is deleted, otherwise it it moved to |
121 // |pending_workspaces_|. | 135 // |pending_workspaces_|. |
122 void MoveWorkspaceToPendingOrDelete(Workspace2* workspace, | 136 void MoveWorkspaceToPendingOrDelete(Workspace2* workspace, |
123 aura::Window* stack_beneath, | 137 aura::Window* stack_beneath, |
124 AnimateType animate_type); | 138 SwitchReason reason); |
125 | 139 |
126 // Moves the children of |window| to the desktop. This excludes certain | 140 // Moves the children of |window| to the desktop. This excludes certain |
127 // windows. If |stack_beneath| is non-NULL the windows are stacked beneath it. | 141 // windows. If |stack_beneath| is non-NULL the windows are stacked beneath it. |
128 void MoveChildrenToDesktop(aura::Window* window, aura::Window* stack_beneath); | 142 void MoveChildrenToDesktop(aura::Window* window, aura::Window* stack_beneath); |
129 | 143 |
130 // Selects the next workspace. | 144 // Selects the next workspace. |
131 void SelectNextWorkspace(AnimateType animate_type); | 145 void SelectNextWorkspace(SwitchReason reason); |
132 | 146 |
133 // Schedules |workspace| for deletion when it no longer contains any layers. | 147 // Schedules |workspace| for deletion when it no longer contains any layers. |
134 // See comments above |to_delete_| as to why we do this. | 148 // See comments above |to_delete_| as to why we do this. |
135 void ScheduleDelete(Workspace2* workspace); | 149 void ScheduleDelete(Workspace2* workspace); |
136 | 150 |
137 // Deletes any workspaces scheduled via ScheduleDelete() that don't contain | 151 // Deletes any workspaces scheduled via ScheduleDelete() that don't contain |
138 // any layers. | 152 // any layers. |
139 void ProcessDeletion(); | 153 void ProcessDeletion(); |
140 | 154 |
141 // Sets |unminimizing_workspace_| to |workspace|. | 155 // Sets |unminimizing_workspace_| to |workspace|. |
142 void SetUnminimizingWorkspace(Workspace2* workspace); | 156 void SetUnminimizingWorkspace(Workspace2* workspace); |
143 | 157 |
| 158 // Fades the desktop. This is only used when maximizing or restoring a |
| 159 // window. The actual fade is handled by |
| 160 // DesktopBackgroundFadeController. |window| is used when restoring and |
| 161 // indicates the window to stack the DesktopBackgroundFadeController's window |
| 162 // above. |
| 163 void FadeDesktop(aura::Window* window, base::TimeDelta duration); |
| 164 |
| 165 // Shows or hides the desktop Window |window|. |
| 166 void ShowOrHideDesktopBackground(aura::Window* window, |
| 167 SwitchReason reason, |
| 168 base::TimeDelta duration, |
| 169 bool show) const; |
| 170 |
| 171 // Shows/hides |workspace| animating as necessary. |
| 172 void ShowWorkspace(Workspace2* workspace, |
| 173 Workspace2* last_active, |
| 174 SwitchReason reason) const; |
| 175 void HideWorkspace(Workspace2* workspace, |
| 176 SwitchReason reason, |
| 177 bool is_unminimizing_maximized_window) const; |
| 178 |
144 // These methods are forwarded from the LayoutManager installed on the | 179 // These methods are forwarded from the LayoutManager installed on the |
145 // Workspace's window. | 180 // Workspace's window. |
146 void OnWindowAddedToWorkspace(Workspace2* workspace, aura::Window* child); | 181 void OnWindowAddedToWorkspace(Workspace2* workspace, aura::Window* child); |
147 void OnWillRemoveWindowFromWorkspace(Workspace2* workspace, | 182 void OnWillRemoveWindowFromWorkspace(Workspace2* workspace, |
148 aura::Window* child); | 183 aura::Window* child); |
149 void OnWindowRemovedFromWorkspace(Workspace2* workspace, aura::Window* child); | 184 void OnWindowRemovedFromWorkspace(Workspace2* workspace, aura::Window* child); |
150 void OnWorkspaceChildWindowVisibilityChanged(Workspace2* workspace, | 185 void OnWorkspaceChildWindowVisibilityChanged(Workspace2* workspace, |
151 aura::Window* child); | 186 aura::Window* child); |
152 void OnWorkspaceWindowChildBoundsChanged(Workspace2* workspace, | 187 void OnWorkspaceWindowChildBoundsChanged(Workspace2* workspace, |
153 aura::Window* child); | 188 aura::Window* child); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 231 |
197 // See comments in SetUnminimizingWorkspace() for details. | 232 // See comments in SetUnminimizingWorkspace() for details. |
198 Workspace2* unminimizing_workspace_; | 233 Workspace2* unminimizing_workspace_; |
199 | 234 |
200 // Set to true if the app is terminating. If true we don't animate the | 235 // Set to true if the app is terminating. If true we don't animate the |
201 // background, otherwise it can get stuck in the fading position when chrome | 236 // background, otherwise it can get stuck in the fading position when chrome |
202 // exits (as the last frame we draw before exiting is a frame from the | 237 // exits (as the last frame we draw before exiting is a frame from the |
203 // animation). | 238 // animation). |
204 bool app_terminating_; | 239 bool app_terminating_; |
205 | 240 |
206 // If non-empty this is the amount of time animating the desktop in/out. | 241 scoped_ptr<DesktopBackgroundFadeController> desktop_fade_controller_; |
207 base::TimeDelta switch_duration_; | 242 |
| 243 // Set to true while in the process of creating a |
| 244 // DesktopBackgroundFadeController. |
| 245 bool creating_fade_; |
208 | 246 |
209 DISALLOW_COPY_AND_ASSIGN(WorkspaceManager2); | 247 DISALLOW_COPY_AND_ASSIGN(WorkspaceManager2); |
210 }; | 248 }; |
211 | 249 |
212 } // namespace internal | 250 } // namespace internal |
213 } // namespace ash | 251 } // namespace ash |
214 | 252 |
215 #endif // ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ | 253 #endif // ASH_WM_WORKSPACE_WORKSPACE_MANAGER2_H_ |
OLD | NEW |