OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/window_state.h" | 5 #include "ash/wm/window_state.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.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/shell_window_ids.h" | 10 #include "ash/shell_window_ids.h" |
11 #include "ash/wm/window_properties.h" | 11 #include "ash/wm/window_properties.h" |
12 #include "ash/wm/window_state_delegate.h" | 12 #include "ash/wm/window_state_delegate.h" |
13 #include "ash/wm/window_state_observer.h" | 13 #include "ash/wm/window_state_observer.h" |
14 #include "ash/wm/window_util.h" | 14 #include "ash/wm/window_util.h" |
15 #include "ash/wm/wm_types.h" | 15 #include "ash/wm/wm_types.h" |
16 #include "base/auto_reset.h" | |
16 #include "base/command_line.h" | 17 #include "base/command_line.h" |
17 #include "ui/aura/client/aura_constants.h" | 18 #include "ui/aura/client/aura_constants.h" |
18 #include "ui/aura/window.h" | 19 #include "ui/aura/window.h" |
19 #include "ui/aura/window_delegate.h" | 20 #include "ui/aura/window_delegate.h" |
20 #include "ui/gfx/display.h" | 21 #include "ui/gfx/display.h" |
21 #include "ui/views/corewm/window_util.h" | 22 #include "ui/views/corewm/window_util.h" |
22 | 23 |
23 namespace ash { | 24 namespace ash { |
24 namespace wm { | 25 namespace wm { |
25 | 26 |
(...skipping 10 matching lines...) Expand all Loading... | |
36 panel_attached_(true), | 37 panel_attached_(true), |
37 continue_drag_after_reparent_(false), | 38 continue_drag_after_reparent_(false), |
38 ignored_by_shelf_(false), | 39 ignored_by_shelf_(false), |
39 can_consume_system_keys_(false), | 40 can_consume_system_keys_(false), |
40 top_row_keys_are_function_keys_(false), | 41 top_row_keys_are_function_keys_(false), |
41 window_resizer_(NULL), | 42 window_resizer_(NULL), |
42 always_restores_to_restore_bounds_(false), | 43 always_restores_to_restore_bounds_(false), |
43 hide_shelf_when_fullscreen_(true), | 44 hide_shelf_when_fullscreen_(true), |
44 animate_to_fullscreen_(true), | 45 animate_to_fullscreen_(true), |
45 minimum_visibility_(false), | 46 minimum_visibility_(false), |
47 in_set_window_show_type_(false), | |
46 window_show_type_(ToWindowShowType(GetShowState())) { | 48 window_show_type_(ToWindowShowType(GetShowState())) { |
47 window_->AddObserver(this); | 49 window_->AddObserver(this); |
48 | 50 |
49 #if defined(OS_CHROMEOS) | 51 #if defined(OS_CHROMEOS) |
50 // NOTE(pkotwicz): Animating to immersive fullscreen does not look good. When | 52 // NOTE(pkotwicz): Animating to immersive fullscreen does not look good. When |
51 // the kAshEnableImmersiveFullscreenForAllWindows flag is set most windows | 53 // the kAshEnableImmersiveFullscreenForAllWindows flag is set most windows |
52 // can be put into immersive fullscreen. It is not worth the added complexity | 54 // can be put into immersive fullscreen. It is not worth the added complexity |
53 // to only animate to fullscreen if the window is put into immersive | 55 // to only animate to fullscreen if the window is put into immersive |
54 // fullscreen. | 56 // fullscreen. |
55 animate_to_fullscreen_ = !CommandLine::ForCurrentProcess()->HasSwitch( | 57 animate_to_fullscreen_ = !CommandLine::ForCurrentProcess()->HasSwitch( |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 | 174 |
173 void WindowState::Activate() { | 175 void WindowState::Activate() { |
174 ActivateWindow(window_); | 176 ActivateWindow(window_); |
175 } | 177 } |
176 | 178 |
177 void WindowState::Deactivate() { | 179 void WindowState::Deactivate() { |
178 DeactivateWindow(window_); | 180 DeactivateWindow(window_); |
179 } | 181 } |
180 | 182 |
181 void WindowState::Restore() { | 183 void WindowState::Restore() { |
182 // Set |window_show_type_| to SHOW_TYPE_NORMAL now so that an observer | |
183 // observing kShowStateKey gets the correct value when querying IsSnapped(). | |
184 window_show_type_ = SHOW_TYPE_NORMAL; | |
185 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); | 184 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
186 } | 185 } |
187 | 186 |
188 void WindowState::ToggleMaximized() { | 187 void WindowState::ToggleMaximized() { |
189 if (IsMaximized()) | 188 if (IsMaximized()) |
190 Restore(); | 189 Restore(); |
191 else if (CanMaximize()) | 190 else if (CanMaximize()) |
192 Maximize(); | 191 Maximize(); |
193 } | 192 } |
194 | 193 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
255 } | 254 } |
256 | 255 |
257 void WindowState::RemoveObserver(WindowStateObserver* observer) { | 256 void WindowState::RemoveObserver(WindowStateObserver* observer) { |
258 observer_list_.RemoveObserver(observer); | 257 observer_list_.RemoveObserver(observer); |
259 } | 258 } |
260 | 259 |
261 void WindowState::OnWindowPropertyChanged(aura::Window* window, | 260 void WindowState::OnWindowPropertyChanged(aura::Window* window, |
262 const void* key, | 261 const void* key, |
263 intptr_t old) { | 262 intptr_t old) { |
264 DCHECK_EQ(window, window_); | 263 DCHECK_EQ(window, window_); |
265 if (key == aura::client::kShowStateKey) { | 264 if (key == aura::client::kShowStateKey) |
266 window_show_type_ = ToWindowShowType(GetShowState()); | 265 SetWindowShowType(ToWindowShowType(GetShowState())); |
267 ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old); | |
268 // TODO(oshima): Notify only when the state has changed. | |
269 // Doing so break a few tests now. | |
270 FOR_EACH_OBSERVER( | |
271 WindowStateObserver, observer_list_, | |
272 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); | |
273 } | |
274 } | 266 } |
275 | 267 |
276 void WindowState::SnapWindow(WindowShowType left_or_right, | 268 void WindowState::SnapWindow(WindowShowType left_or_right, |
277 const gfx::Rect& bounds) { | 269 const gfx::Rect& bounds) { |
270 if (window_show_type_ == left_or_right) { | |
271 window_->SetBounds(bounds); | |
272 return; | |
273 } | |
274 | |
278 // Compute the bounds that the window will restore to. If the window does not | 275 // Compute the bounds that the window will restore to. If the window does not |
279 // already have restore bounds, it will be restored (when un-snapped) to the | 276 // already have restore bounds, it will be restored (when un-snapped) to the |
280 // last bounds that it had before getting snapped. | 277 // last bounds that it had before getting snapped. |
281 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ? | 278 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ? |
282 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen()); | 279 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen()); |
283 // Set the window's restore bounds so that WorkspaceLayoutManager knows | 280 // Set the window's restore bounds so that WorkspaceLayoutManager knows |
284 // which width to use when the snapped window is moved to the edge. | 281 // which width to use when the snapped window is moved to the edge. |
285 SetRestoreBoundsInParent(bounds); | 282 SetRestoreBoundsInParent(bounds); |
286 | 283 |
287 bool was_maximized = IsMaximizedOrFullscreen(); | |
288 // Before we can set the bounds we need to restore the window. | |
289 // Restoring the window will set the window to its restored bounds set above. | |
290 // Restore will cause OnWindowPropertyChanged() so it needs to be done | |
291 // before notifying that the WindowShowType has changed to |left_or_right|. | |
292 if (was_maximized) | |
293 Restore(); | |
294 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || | 284 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || |
295 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); | 285 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); |
296 WindowShowType old_type = window_show_type_; | 286 LOG(ERROR) << "Set show type " << bounds.ToString(); |
oshima
2013/12/10 22:02:24
remove log
| |
297 window_show_type_ = left_or_right; | 287 SetWindowShowType(left_or_right); |
298 FOR_EACH_OBSERVER( | |
299 WindowStateObserver, observer_list_, | |
300 OnWindowShowTypeChanged(this, old_type)); | |
301 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon | 288 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon |
302 // observing the WindowShowType change. | 289 // observing the WindowShowType change. |
303 // If the window is a child of kShellWindowId_DockedContainer such as during | 290 // If the window is a child of kShellWindowId_DockedContainer such as during |
304 // a drag, the window's bounds are not set in | 291 // a drag, the window's bounds are not set in |
305 // WorkspaceLayoutManager::OnWindowShowTypeChanged(). Set them here. Skip | 292 // WorkspaceLayoutManager::OnWindowShowTypeChanged(). Set them here. Skip |
306 // setting the bounds otherwise to avoid stopping the slide animation which | 293 // setting the bounds otherwise to avoid stopping the slide animation which |
307 // was started as a result of OnWindowShowTypeChanged(). | 294 // was started as a result of OnWindowShowTypeChanged(). |
308 if (IsDocked()) | 295 if (IsDocked()) |
309 window_->SetBounds(bounds); | 296 window_->SetBounds(bounds); |
310 SetRestoreBoundsInScreen(restore_bounds_in_screen); | 297 SetRestoreBoundsInScreen(restore_bounds_in_screen); |
311 } | 298 } |
312 | 299 |
300 void WindowState::SetWindowShowType(WindowShowType new_window_show_type) { | |
301 if (in_set_window_show_type_) | |
302 return; | |
303 base::AutoReset<bool> resetter(&in_set_window_show_type_, true); | |
304 | |
305 ui::WindowShowState new_window_state = | |
306 ToWindowShowState(new_window_show_type); | |
307 if (new_window_state != GetShowState()) | |
308 window_->SetProperty(aura::client::kShowStateKey, new_window_state); | |
309 WindowShowType old_window_show_type = window_show_type_; | |
310 window_show_type_ = new_window_show_type; | |
311 if (old_window_show_type != window_show_type_) { | |
312 FOR_EACH_OBSERVER(WindowStateObserver, observer_list_, | |
313 OnWindowShowTypeChanged(this, old_window_show_type)); | |
314 } | |
315 } | |
316 | |
313 WindowState* GetActiveWindowState() { | 317 WindowState* GetActiveWindowState() { |
314 aura::Window* active = GetActiveWindow(); | 318 aura::Window* active = GetActiveWindow(); |
315 return active ? GetWindowState(active) : NULL; | 319 return active ? GetWindowState(active) : NULL; |
316 } | 320 } |
317 | 321 |
318 WindowState* GetWindowState(aura::Window* window) { | 322 WindowState* GetWindowState(aura::Window* window) { |
319 if (!window) | 323 if (!window) |
320 return NULL; | 324 return NULL; |
321 WindowState* settings = window->GetProperty(internal::kWindowStateKey); | 325 WindowState* settings = window->GetProperty(internal::kWindowStateKey); |
322 if(!settings) { | 326 if(!settings) { |
323 settings = new WindowState(window); | 327 settings = new WindowState(window); |
324 window->SetProperty(internal::kWindowStateKey, settings); | 328 window->SetProperty(internal::kWindowStateKey, settings); |
325 } | 329 } |
326 return settings; | 330 return settings; |
327 } | 331 } |
328 | 332 |
329 const WindowState* GetWindowState(const aura::Window* window) { | 333 const WindowState* GetWindowState(const aura::Window* window) { |
330 return GetWindowState(const_cast<aura::Window*>(window)); | 334 return GetWindowState(const_cast<aura::Window*>(window)); |
331 } | 335 } |
332 | 336 |
333 } // namespace wm | 337 } // namespace wm |
334 } // namespace ash | 338 } // namespace ash |
OLD | NEW |