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

Side by Side Diff: ash/wm/workspace/workspace_layout_manager.cc

Issue 24108003: [Cleanup] Rename WindowSettings to WindowState (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase fix Created 7 years, 3 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
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/wm/workspace/workspace_layout_manager.h" 5 #include "ash/wm/workspace/workspace_layout_manager.h"
6 6
7 #include "ash/display/display_controller.h" 7 #include "ash/display/display_controller.h"
8 #include "ash/root_window_controller.h" 8 #include "ash/root_window_controller.h"
9 #include "ash/screen_ash.h" 9 #include "ash/screen_ash.h"
10 #include "ash/shelf/shelf_layout_manager.h" 10 #include "ash/shelf/shelf_layout_manager.h"
11 #include "ash/shell.h" 11 #include "ash/shell.h"
12 #include "ash/wm/always_on_top_controller.h" 12 #include "ash/wm/always_on_top_controller.h"
13 #include "ash/wm/base_layout_manager.h" 13 #include "ash/wm/base_layout_manager.h"
14 #include "ash/wm/frame_painter.h" 14 #include "ash/wm/frame_painter.h"
15 #include "ash/wm/window_animations.h" 15 #include "ash/wm/window_animations.h"
16 #include "ash/wm/window_properties.h" 16 #include "ash/wm/window_properties.h"
17 #include "ash/wm/window_settings.h" 17 #include "ash/wm/window_state.h"
18 #include "ash/wm/window_util.h" 18 #include "ash/wm/window_util.h"
19 #include "ash/wm/workspace/auto_window_management.h" 19 #include "ash/wm/workspace/auto_window_management.h"
20 #include "ui/aura/client/aura_constants.h" 20 #include "ui/aura/client/aura_constants.h"
21 #include "ui/aura/root_window.h" 21 #include "ui/aura/root_window.h"
22 #include "ui/aura/window.h" 22 #include "ui/aura/window.h"
23 #include "ui/aura/window_observer.h" 23 #include "ui/aura/window_observer.h"
24 #include "ui/base/ui_base_types.h" 24 #include "ui/base/ui_base_types.h"
25 #include "ui/events/event.h" 25 #include "ui/events/event.h"
26 #include "ui/views/corewm/window_util.h" 26 #include "ui/views/corewm/window_util.h"
27 27
28 using aura::Window; 28 using aura::Window;
29 29
30 namespace ash { 30 namespace ash {
31 31
32 namespace internal { 32 namespace internal {
33 33
34 namespace { 34 namespace {
35 35
36 // This specifies how much percent 30% of a window rect (width / height) 36 // This specifies how much percent 30% of a window rect (width / height)
37 // must be visible when the window is added to the workspace. 37 // must be visible when the window is added to the workspace.
38 const float kMinimumPercentOnScreenArea = 0.3f; 38 const float kMinimumPercentOnScreenArea = 0.3f;
39 39
40 bool IsMaximizedState(ui::WindowShowState state) { 40 void MoveToDisplayForRestore(wm::WindowState* window_state) {
41 return state == ui::SHOW_STATE_MAXIMIZED || 41 if (!window_state->HasRestoreBounds())
42 state == ui::SHOW_STATE_FULLSCREEN;
43 }
44
45 void MoveToDisplayForRestore(aura::Window* window) {
46 const gfx::Rect* restore_bounds = GetRestoreBoundsInScreen(window);
47 if (!restore_bounds)
48 return; 42 return;
43 const gfx::Rect& restore_bounds = window_state->GetRestoreBoundsInScreen();
49 44
50 // Move only if the restore bounds is outside of 45 // Move only if the restore bounds is outside of
51 // the display. There is no information about in which 46 // the display. There is no information about in which
52 // display it should be restored, so this is best guess. 47 // display it should be restored, so this is best guess.
53 // TODO(oshima): Restore information should contain the 48 // TODO(oshima): Restore information should contain the
54 // work area information like WindowResizer does for the 49 // work area information like WindowResizer does for the
55 // last window location. 50 // last window location.
56 gfx::Rect display_area = 51 gfx::Rect display_area = Shell::GetScreen()->GetDisplayNearestWindow(
57 Shell::GetScreen()->GetDisplayNearestWindow(window).bounds(); 52 window_state->window()).bounds();
58 53
59 if (!display_area.Intersects(*restore_bounds)) { 54 if (!display_area.Intersects(restore_bounds)) {
60 DisplayController* display_controller = 55 DisplayController* display_controller =
61 Shell::GetInstance()->display_controller(); 56 Shell::GetInstance()->display_controller();
62 const gfx::Display& display = 57 const gfx::Display& display =
63 display_controller->GetDisplayMatching(*restore_bounds); 58 display_controller->GetDisplayMatching(restore_bounds);
64 aura::RootWindow* new_root = 59 aura::RootWindow* new_root =
65 display_controller->GetRootWindowForDisplayId(display.id()); 60 display_controller->GetRootWindowForDisplayId(display.id());
66 if (new_root != window->GetRootWindow()) { 61 if (new_root != window_state->window()->GetRootWindow()) {
67 aura::Window* new_container = 62 aura::Window* new_container =
68 Shell::GetContainer(new_root, window->parent()->id()); 63 Shell::GetContainer(new_root, window_state->window()->parent()->id());
69 new_container->AddChild(window); 64 new_container->AddChild(window_state->window());
70 } 65 }
71 } 66 }
72 } 67 }
73 68
74 } // namespace 69 } // namespace
75 70
76 WorkspaceLayoutManager::WorkspaceLayoutManager(aura::Window* window) 71 WorkspaceLayoutManager::WorkspaceLayoutManager(aura::Window* window)
77 : BaseLayoutManager(window->GetRootWindow()), 72 : BaseLayoutManager(window->GetRootWindow()),
78 shelf_(NULL), 73 shelf_(NULL),
79 window_(window), 74 window_(window),
80 work_area_(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 75 work_area_(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
81 window->parent())) { 76 window->parent())) {
82 } 77 }
83 78
84 WorkspaceLayoutManager::~WorkspaceLayoutManager() { 79 WorkspaceLayoutManager::~WorkspaceLayoutManager() {
85 } 80 }
86 81
87 void WorkspaceLayoutManager::SetShelf(internal::ShelfLayoutManager* shelf) { 82 void WorkspaceLayoutManager::SetShelf(internal::ShelfLayoutManager* shelf) {
88 shelf_ = shelf; 83 shelf_ = shelf;
89 } 84 }
90 85
91 void WorkspaceLayoutManager::OnWindowAddedToLayout(Window* child) { 86 void WorkspaceLayoutManager::OnWindowAddedToLayout(Window* child) {
92 AdjustWindowBoundsWhenAdded(child); 87 AdjustWindowBoundsWhenAdded(wm::GetWindowState(child));
93 BaseLayoutManager::OnWindowAddedToLayout(child); 88 BaseLayoutManager::OnWindowAddedToLayout(child);
94 UpdateDesktopVisibility(); 89 UpdateDesktopVisibility();
95 RearrangeVisibleWindowOnShow(child); 90 RearrangeVisibleWindowOnShow(child);
96 } 91 }
97 92
98 void WorkspaceLayoutManager::OnWillRemoveWindowFromLayout(Window* child) { 93 void WorkspaceLayoutManager::OnWillRemoveWindowFromLayout(Window* child) {
99 BaseLayoutManager::OnWillRemoveWindowFromLayout(child); 94 BaseLayoutManager::OnWillRemoveWindowFromLayout(child);
100 if (child->TargetVisibility()) 95 if (child->TargetVisibility())
101 RearrangeVisibleWindowOnHideOrRemove(child); 96 RearrangeVisibleWindowOnHideOrRemove(child);
102 } 97 }
103 98
104 void WorkspaceLayoutManager::OnWindowRemovedFromLayout(Window* child) { 99 void WorkspaceLayoutManager::OnWindowRemovedFromLayout(Window* child) {
105 BaseLayoutManager::OnWindowRemovedFromLayout(child); 100 BaseLayoutManager::OnWindowRemovedFromLayout(child);
106 UpdateDesktopVisibility(); 101 UpdateDesktopVisibility();
107 } 102 }
108 103
109 void WorkspaceLayoutManager::OnChildWindowVisibilityChanged(Window* child, 104 void WorkspaceLayoutManager::OnChildWindowVisibilityChanged(Window* child,
110 bool visible) { 105 bool visible) {
111 BaseLayoutManager::OnChildWindowVisibilityChanged(child, visible); 106 BaseLayoutManager::OnChildWindowVisibilityChanged(child, visible);
112 if (child->TargetVisibility()) 107 if (child->TargetVisibility())
113 RearrangeVisibleWindowOnShow(child); 108 RearrangeVisibleWindowOnShow(child);
114 else 109 else
115 RearrangeVisibleWindowOnHideOrRemove(child); 110 RearrangeVisibleWindowOnHideOrRemove(child);
116 UpdateDesktopVisibility(); 111 UpdateDesktopVisibility();
117 } 112 }
118 113
119 void WorkspaceLayoutManager::SetChildBounds( 114 void WorkspaceLayoutManager::SetChildBounds(
120 Window* child, 115 Window* child,
121 const gfx::Rect& requested_bounds) { 116 const gfx::Rect& requested_bounds) {
122 if (!wm::GetWindowSettings(child)->tracked_by_workspace()) { 117 if (!wm::GetWindowState(child)->tracked_by_workspace()) {
123 SetChildBoundsDirect(child, requested_bounds); 118 SetChildBoundsDirect(child, requested_bounds);
124 return; 119 return;
125 } 120 }
126 gfx::Rect child_bounds(requested_bounds); 121 gfx::Rect child_bounds(requested_bounds);
127 // Some windows rely on this to set their initial bounds. 122 // Some windows rely on this to set their initial bounds.
128 if (!SetMaximizedOrFullscreenBounds(child)) { 123 if (!SetMaximizedOrFullscreenBounds(wm::GetWindowState(child))) {
129 // Non-maximized/full-screen windows have their size constrained to the 124 // Non-maximized/full-screen windows have their size constrained to the
130 // work-area. 125 // work-area.
131 child_bounds.set_width(std::min(work_area_.width(), child_bounds.width())); 126 child_bounds.set_width(std::min(work_area_.width(), child_bounds.width()));
132 child_bounds.set_height( 127 child_bounds.set_height(
133 std::min(work_area_.height(), child_bounds.height())); 128 std::min(work_area_.height(), child_bounds.height()));
134 SetChildBoundsDirect(child, child_bounds); 129 SetChildBoundsDirect(child, child_bounds);
135 } 130 }
136 UpdateDesktopVisibility(); 131 UpdateDesktopVisibility();
137 } 132 }
138 133
139 void WorkspaceLayoutManager::OnDisplayWorkAreaInsetsChanged() { 134 void WorkspaceLayoutManager::OnDisplayWorkAreaInsetsChanged() {
140 const gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 135 const gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
141 window_->parent())); 136 window_->parent()));
142 if (work_area != work_area_) { 137 if (work_area != work_area_) {
143 AdjustAllWindowsBoundsForWorkAreaChange( 138 AdjustAllWindowsBoundsForWorkAreaChange(
144 ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED); 139 ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED);
145 } 140 }
146 } 141 }
147 142
148 void WorkspaceLayoutManager::OnTrackedByWorkspaceChanged(Window* window, 143 void WorkspaceLayoutManager::OnTrackedByWorkspaceChanged(Window* window,
149 bool old){ 144 bool old){
150 if (wm::GetWindowSettings(window)->tracked_by_workspace()) 145 if (wm::GetWindowState(window)->tracked_by_workspace())
151 SetMaximizedOrFullscreenBounds(window); 146 SetMaximizedOrFullscreenBounds(wm::GetWindowState(window));
152 } 147 }
153 148
154 void WorkspaceLayoutManager::OnWindowPropertyChanged(Window* window, 149 void WorkspaceLayoutManager::OnWindowPropertyChanged(Window* window,
155 const void* key, 150 const void* key,
156 intptr_t old) { 151 intptr_t old) {
152 wm::WindowState* window_state = wm::GetWindowState(window);
157 if (key == aura::client::kShowStateKey) { 153 if (key == aura::client::kShowStateKey) {
158 ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old); 154 ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old);
159 ui::WindowShowState new_state = 155 ui::WindowShowState new_state = window_state->GetShowState();
160 window->GetProperty(aura::client::kShowStateKey);
161 if (old_state != ui::SHOW_STATE_MINIMIZED && 156 if (old_state != ui::SHOW_STATE_MINIMIZED &&
162 GetRestoreBoundsInScreen(window) == NULL && 157 !window_state->HasRestoreBounds() &&
163 IsMaximizedState(new_state) && 158 window_state->IsMaximizedOrFullscreen() &&
164 !IsMaximizedState(old_state)) { 159 !wm::WindowState::IsMaximizedOrFullscreenState(old_state)) {
165 SetRestoreBoundsInParent(window, window->bounds()); 160 window_state->SaveCurrentBoundsForRestore();
166 } 161 }
167 // When restoring from a minimized state, we want to restore to the 162 // When restoring from a minimized state, we want to restore to the
168 // previous (maybe L/R maximized) state. Since we do also want to keep the 163 // previous (maybe L/R maximized) state. Since we do also want to keep the
169 // restore rectangle, we set the restore rectangle to the rectangle we want 164 // restore rectangle, we set the restore rectangle to the rectangle we want
170 // to restore to and restore it after we switched so that it is preserved. 165 // to restore to and restore it after we switched so that it is preserved.
171 gfx::Rect restore; 166 gfx::Rect restore;
172 if (old_state == ui::SHOW_STATE_MINIMIZED && 167 if (old_state == ui::SHOW_STATE_MINIMIZED &&
173 (new_state == ui::SHOW_STATE_NORMAL || 168 (new_state == ui::SHOW_STATE_NORMAL ||
174 new_state == ui::SHOW_STATE_DEFAULT) && 169 new_state == ui::SHOW_STATE_DEFAULT) &&
175 GetRestoreBoundsInScreen(window) && 170 window_state->HasRestoreBounds() &&
176 !GetWindowAlwaysRestoresToRestoreBounds(window)) { 171 !window_state->always_restores_to_restore_bounds()) {
177 restore = *GetRestoreBoundsInScreen(window); 172 restore = window_state->GetRestoreBoundsInScreen();
178 SetRestoreBoundsInScreen(window, window->GetBoundsInScreen()); 173 window_state->SaveCurrentBoundsForRestore();
179 } 174 }
180 175
181 UpdateBoundsFromShowState(window, old_state); 176 UpdateBoundsFromShowState(window_state, old_state);
182 ShowStateChanged(window, old_state); 177 ShowStateChanged(window_state, old_state);
183 178
184 // Set the restore rectangle to the previously set restore rectangle. 179 // Set the restore rectangle to the previously set restore rectangle.
185 if (!restore.IsEmpty()) 180 if (!restore.IsEmpty())
186 SetRestoreBoundsInScreen(window, restore); 181 window_state->SetRestoreBoundsInScreen(restore);
187 } 182 }
188 183
189 if (key == aura::client::kAlwaysOnTopKey && 184 if (key == aura::client::kAlwaysOnTopKey &&
190 window->GetProperty(aura::client::kAlwaysOnTopKey)) { 185 window->GetProperty(aura::client::kAlwaysOnTopKey)) {
191 internal::AlwaysOnTopController* controller = 186 GetRootWindowController(window->GetRootWindow())->
192 GetRootWindowController(window->GetRootWindow())-> 187 always_on_top_controller()->GetContainer(window)->AddChild(window);
193 always_on_top_controller();
194 controller->GetContainer(window)->AddChild(window);
195 } 188 }
196 } 189 }
197 190
198 void WorkspaceLayoutManager::ShowStateChanged( 191 void WorkspaceLayoutManager::ShowStateChanged(
199 Window* window, 192 wm::WindowState* state,
200 ui::WindowShowState last_show_state) { 193 ui::WindowShowState last_show_state) {
201 BaseLayoutManager::ShowStateChanged(window, last_show_state); 194 BaseLayoutManager::ShowStateChanged(state, last_show_state);
202 UpdateDesktopVisibility(); 195 UpdateDesktopVisibility();
203 } 196 }
204 197
205 void WorkspaceLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange( 198 void WorkspaceLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(
206 AdjustWindowReason reason) { 199 AdjustWindowReason reason) {
207 work_area_ = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_->parent()); 200 work_area_ = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_->parent());
208 BaseLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(reason); 201 BaseLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(reason);
209 } 202 }
210 203
211 void WorkspaceLayoutManager::AdjustWindowBoundsForWorkAreaChange( 204 void WorkspaceLayoutManager::AdjustWindowBoundsForWorkAreaChange(
212 Window* window, 205 wm::WindowState* window_state,
213 AdjustWindowReason reason) { 206 AdjustWindowReason reason) {
214 if (!wm::GetWindowSettings(window)->tracked_by_workspace()) 207 if (!window_state->tracked_by_workspace())
215 return; 208 return;
216 209
217 // Do not cross fade here: the window's layer hierarchy may be messed up for 210 // Do not cross fade here: the window's layer hierarchy may be messed up for
218 // the transition between mirroring and extended. See also: crbug.com/267698 211 // the transition between mirroring and extended. See also: crbug.com/267698
219 // TODO(oshima): Differentiate display change and shelf visibility change, and 212 // TODO(oshima): Differentiate display change and shelf visibility change, and
220 // bring back CrossFade animation. 213 // bring back CrossFade animation.
221 if (wm::IsWindowMaximized(window) && 214 if (window_state->IsMaximized() &&
222 reason == ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED) { 215 reason == ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED) {
223 SetChildBoundsDirect(window, ScreenAsh::GetMaximizedWindowBoundsInParent( 216 SetChildBoundsDirect(window_state->window(),
224 window->parent()->parent())); 217 ScreenAsh::GetMaximizedWindowBoundsInParent(
218 window_state->window()->parent()->parent()));
225 return; 219 return;
226 } 220 }
227 221
228 if (SetMaximizedOrFullscreenBounds(window)) 222 if (SetMaximizedOrFullscreenBounds(window_state))
229 return; 223 return;
230 224
231 gfx::Rect bounds = window->bounds(); 225 gfx::Rect bounds = window_state->window()->bounds();
232 switch (reason) { 226 switch (reason) {
233 case ADJUST_WINDOW_DISPLAY_SIZE_CHANGED: 227 case ADJUST_WINDOW_DISPLAY_SIZE_CHANGED:
234 // The work area may be smaller than the full screen. Put as much of the 228 // The work area may be smaller than the full screen. Put as much of the
235 // window as possible within the display area. 229 // window as possible within the display area.
236 bounds.AdjustToFit(work_area_); 230 bounds.AdjustToFit(work_area_);
237 break; 231 break;
238 case ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED: 232 case ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED:
239 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds); 233 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds);
240 break; 234 break;
241 } 235 }
242 if (window->bounds() != bounds) 236 if (window_state->window()->bounds() != bounds)
243 window->SetBounds(bounds); 237 window_state->window()->SetBounds(bounds);
244 } 238 }
245 239
246 void WorkspaceLayoutManager::AdjustWindowBoundsWhenAdded( 240 void WorkspaceLayoutManager::AdjustWindowBoundsWhenAdded(
247 Window* window) { 241 wm::WindowState* window_state) {
248 // Don't adjust window bounds if the bounds are empty as this 242 // Don't adjust window bounds if the bounds are empty as this
249 // happens when a new views::Widget is created. 243 // happens when a new views::Widget is created.
250 // When a window is dragged and dropped onto a different 244 // When a window is dragged and dropped onto a different
251 // root window, the bounds will be updated after they are added 245 // root window, the bounds will be updated after they are added
252 // to the root window. 246 // to the root window.
253 if (window->bounds().IsEmpty()) 247 if (window_state->window()->bounds().IsEmpty())
254 return; 248 return;
255 249
256 if (!wm::GetWindowSettings(window)->tracked_by_workspace()) 250 if (!window_state->tracked_by_workspace())
257 return; 251 return;
258 252
259 if (SetMaximizedOrFullscreenBounds(window)) 253 if (SetMaximizedOrFullscreenBounds(window_state))
260 return; 254 return;
261 255
256 Window* window = window_state->window();
262 gfx::Rect bounds = window->bounds(); 257 gfx::Rect bounds = window->bounds();
263 int min_width = bounds.width() * kMinimumPercentOnScreenArea; 258 int min_width = bounds.width() * kMinimumPercentOnScreenArea;
264 int min_height = bounds.height() * kMinimumPercentOnScreenArea; 259 int min_height = bounds.height() * kMinimumPercentOnScreenArea;
265 // Use entire display instead of workarea because the workarea can 260 // Use entire display instead of workarea because the workarea can
266 // be further shrunk by the docked area. The logic ensures 30% 261 // be further shrunk by the docked area. The logic ensures 30%
267 // visibility which should be enough to see where the window gets 262 // visibility which should be enough to see where the window gets
268 // moved. 263 // moved.
269 gfx::Rect display_area = 264 gfx::Rect display_area =
270 Shell::GetScreen()->GetDisplayNearestWindow(window).bounds(); 265 Shell::GetScreen()->GetDisplayNearestWindow(window).bounds();
271 ash::wm::AdjustBoundsToEnsureWindowVisibility( 266 ash::wm::AdjustBoundsToEnsureWindowVisibility(
272 display_area, min_width, min_height, &bounds); 267 display_area, min_width, min_height, &bounds);
273 if (window->bounds() != bounds) 268 if (window->bounds() != bounds)
274 window->SetBounds(bounds); 269 window->SetBounds(bounds);
275 } 270 }
276 271
277 void WorkspaceLayoutManager::UpdateDesktopVisibility() { 272 void WorkspaceLayoutManager::UpdateDesktopVisibility() {
278 if (shelf_) 273 if (shelf_)
279 shelf_->UpdateVisibilityState(); 274 shelf_->UpdateVisibilityState();
280 FramePainter::UpdateSoloWindowHeader(window_->GetRootWindow()); 275 FramePainter::UpdateSoloWindowHeader(window_->GetRootWindow());
281 } 276 }
282 277
283 void WorkspaceLayoutManager::UpdateBoundsFromShowState( 278 void WorkspaceLayoutManager::UpdateBoundsFromShowState(
284 Window* window, 279 wm::WindowState* window_state,
285 ui::WindowShowState last_show_state) { 280 ui::WindowShowState last_show_state) {
281 aura::Window* window = window_state->window();
286 // See comment in SetMaximizedOrFullscreenBounds() as to why we use parent in 282 // See comment in SetMaximizedOrFullscreenBounds() as to why we use parent in
287 // these calculation. 283 // these calculation.
288 switch (window->GetProperty(aura::client::kShowStateKey)) { 284 switch (window_state->GetShowState()) {
289 case ui::SHOW_STATE_DEFAULT: 285 case ui::SHOW_STATE_DEFAULT:
290 case ui::SHOW_STATE_NORMAL: { 286 case ui::SHOW_STATE_NORMAL: {
291 const gfx::Rect* restore = GetRestoreBoundsInScreen(window);
292 // Make sure that the part of the window is always visible 287 // Make sure that the part of the window is always visible
293 // when restored. 288 // when restored.
294 gfx::Rect bounds_in_parent; 289 gfx::Rect bounds_in_parent;
295 if (restore) { 290 if (window_state->HasRestoreBounds()) {
296 bounds_in_parent = 291 bounds_in_parent = window_state->GetRestoreBoundsInParent();
297 ScreenAsh::ConvertRectFromScreen(window->parent()->parent(),
298 *restore);
299
300 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility( 292 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(
301 work_area_, &bounds_in_parent); 293 work_area_, &bounds_in_parent);
302 } else { 294 } else {
303 // Minimized windows have no restore bounds. 295 // Minimized windows have no restore bounds.
304 // Use the current bounds instead. 296 // Use the current bounds instead.
305 bounds_in_parent = window->bounds(); 297 bounds_in_parent = window->bounds();
306 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility( 298 ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(
307 work_area_, &bounds_in_parent); 299 work_area_, &bounds_in_parent);
308 // Don't start animation if the bounds didn't change. 300 // Don't start animation if the bounds didn't change.
309 if (bounds_in_parent == window->bounds()) 301 if (bounds_in_parent == window->bounds())
310 bounds_in_parent.SetRect(0, 0, 0, 0); 302 bounds_in_parent.SetRect(0, 0, 0, 0);
311 } 303 }
312 if (!bounds_in_parent.IsEmpty()) { 304 if (!bounds_in_parent.IsEmpty()) {
313 gfx::Rect new_bounds = BaseLayoutManager::BoundsWithScreenEdgeVisible( 305 gfx::Rect new_bounds = BaseLayoutManager::BoundsWithScreenEdgeVisible(
314 window->parent()->parent(), 306 window->parent()->parent(),
315 bounds_in_parent); 307 bounds_in_parent);
316 if (last_show_state == ui::SHOW_STATE_MINIMIZED) 308 if (last_show_state == ui::SHOW_STATE_MINIMIZED)
317 SetChildBoundsDirect(window, new_bounds); 309 SetChildBoundsDirect(window, new_bounds);
318 else 310 else
319 CrossFadeToBounds(window, new_bounds); 311 CrossFadeToBounds(window, new_bounds);
320 } 312 }
321 ClearRestoreBounds(window); 313 window_state->ClearRestoreBounds();
322 break; 314 break;
323 } 315 }
324 316
325 case ui::SHOW_STATE_MAXIMIZED: { 317 case ui::SHOW_STATE_MAXIMIZED: {
326 MoveToDisplayForRestore(window); 318 MoveToDisplayForRestore(window_state);
327 gfx::Rect new_bounds = ScreenAsh::GetMaximizedWindowBoundsInParent( 319 gfx::Rect new_bounds = ScreenAsh::GetMaximizedWindowBoundsInParent(
328 window->parent()->parent()); 320 window->parent()->parent());
329 // If the window is restored from minimized state, do not make the cross 321 // If the window is restored from minimized state, do not make the cross
330 // fade animation and set the child bounds directly. The restoring 322 // fade animation and set the child bounds directly. The restoring
331 // animation will be done by ash/wm/window_animations.cc. 323 // animation will be done by ash/wm/window_animations.cc.
332 if (last_show_state == ui::SHOW_STATE_MINIMIZED) 324 if (last_show_state == ui::SHOW_STATE_MINIMIZED)
333 SetChildBoundsDirect(window, new_bounds); 325 SetChildBoundsDirect(window, new_bounds);
334 else 326 else
335 CrossFadeToBounds(window, new_bounds); 327 CrossFadeToBounds(window, new_bounds);
336 break; 328 break;
337 } 329 }
338 330
339 case ui::SHOW_STATE_FULLSCREEN: { 331 case ui::SHOW_STATE_FULLSCREEN: {
340 MoveToDisplayForRestore(window); 332 MoveToDisplayForRestore(window_state);
341 gfx::Rect new_bounds = ScreenAsh::GetDisplayBoundsInParent( 333 gfx::Rect new_bounds = ScreenAsh::GetDisplayBoundsInParent(
342 window->parent()->parent()); 334 window->parent()->parent());
343 if (window->GetProperty(kAnimateToFullscreenKey) && 335 if (window->GetProperty(kAnimateToFullscreenKey) &&
344 last_show_state != ui::SHOW_STATE_MINIMIZED) { 336 last_show_state != ui::SHOW_STATE_MINIMIZED) {
345 CrossFadeToBounds(window, new_bounds); 337 CrossFadeToBounds(window, new_bounds);
346 } else { 338 } else {
347 SetChildBoundsDirect(window, new_bounds); 339 SetChildBoundsDirect(window, new_bounds);
348 } 340 }
349 break; 341 break;
350 } 342 }
351 343
352 default: 344 default:
353 break; 345 break;
354 } 346 }
355 } 347 }
356 348
357 bool WorkspaceLayoutManager::SetMaximizedOrFullscreenBounds( 349 bool WorkspaceLayoutManager::SetMaximizedOrFullscreenBounds(
358 aura::Window* window) { 350 wm::WindowState* window_state) {
359 if (!wm::GetWindowSettings(window)->tracked_by_workspace()) 351 if (!window_state->tracked_by_workspace())
360 return false; 352 return false;
361 353
362 // During animations there is a transform installed on the workspace 354 // During animations there is a transform installed on the workspace
363 // windows. For this reason this code uses the parent so that the transform is 355 // windows. For this reason this code uses the parent so that the transform is
364 // ignored. 356 // ignored.
365 if (wm::IsWindowMaximized(window)) { 357 if (window_state->IsMaximized()) {
366 SetChildBoundsDirect( 358 SetChildBoundsDirect(
367 window, ScreenAsh::GetMaximizedWindowBoundsInParent( 359 window_state->window(), ScreenAsh::GetMaximizedWindowBoundsInParent(
368 window->parent()->parent())); 360 window_state->window()->parent()->parent()));
369 return true; 361 return true;
370 } 362 }
371 if (wm::IsWindowFullscreen(window)) { 363 if (window_state->IsFullscreen()) {
372 SetChildBoundsDirect( 364 SetChildBoundsDirect(
373 window, 365 window_state->window(),
374 ScreenAsh::GetDisplayBoundsInParent(window->parent()->parent())); 366 ScreenAsh::GetDisplayBoundsInParent(
367 window_state->window()->parent()->parent()));
375 return true; 368 return true;
376 } 369 }
377 return false; 370 return false;
378 } 371 }
379 372
380 } // namespace internal 373 } // namespace internal
381 } // namespace ash 374 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/workspace/workspace_layout_manager.h ('k') | ash/wm/workspace/workspace_layout_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698