Chromium Code Reviews| 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/common/wm/workspace/workspace_layout_manager.h" | 5 #include "ash/common/wm/workspace/workspace_layout_manager.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "ash/common/session/session_state_delegate.h" | 9 #include "ash/common/session/session_state_delegate.h" | 
| 10 #include "ash/common/shelf/wm_shelf.h" | 10 #include "ash/common/shelf/wm_shelf.h" | 
| 11 #include "ash/common/shell_window_ids.h" | 11 #include "ash/common/shell_window_ids.h" | 
| 12 #include "ash/common/wm/always_on_top_controller.h" | 12 #include "ash/common/wm/always_on_top_controller.h" | 
| 13 #include "ash/common/wm/fullscreen_window_finder.h" | 13 #include "ash/common/wm/fullscreen_window_finder.h" | 
| 14 #include "ash/common/wm/window_positioner.h" | 14 #include "ash/common/wm/window_positioner.h" | 
| 15 #include "ash/common/wm/window_state.h" | 15 #include "ash/common/wm/window_state.h" | 
| 16 #include "ash/common/wm/wm_event.h" | 16 #include "ash/common/wm/wm_event.h" | 
| 17 #include "ash/common/wm/wm_screen_util.h" | 17 #include "ash/common/wm/wm_screen_util.h" | 
| 18 #include "ash/common/wm/workspace/workspace_layout_manager_backdrop_delegate.h" | 18 #include "ash/common/wm/workspace/workspace_layout_manager_backdrop_delegate.h" | 
| 19 #include "ash/common/wm_root_window_controller.h" | 19 #include "ash/common/wm_root_window_controller.h" | 
| 20 #include "ash/common/wm_shell.h" | 20 #include "ash/common/wm_shell.h" | 
| 21 #include "ash/common/wm_window.h" | 21 #include "ash/common/wm_window.h" | 
| 22 #include "ash/common/wm_window_property.h" | 22 #include "ash/common/wm_window_property.h" | 
| 23 #include "base/command_line.h" | 23 #include "base/command_line.h" | 
| 24 #include "ui/base/ui_base_switches.h" | 24 #include "ui/base/ui_base_switches.h" | 
| 25 #include "ui/compositor/layer.h" | 25 #include "ui/compositor/layer.h" | 
| 26 #include "ui/display/display.h" | |
| 27 #include "ui/display/screen.h" | |
| 26 #include "ui/keyboard/keyboard_controller.h" | 28 #include "ui/keyboard/keyboard_controller.h" | 
| 27 #include "ui/keyboard/keyboard_controller_observer.h" | 29 #include "ui/keyboard/keyboard_controller_observer.h" | 
| 28 | 30 | 
| 29 namespace ash { | 31 namespace ash { | 
| 30 | 32 | 
| 31 WorkspaceLayoutManager::WorkspaceLayoutManager(WmWindow* window) | 33 WorkspaceLayoutManager::WorkspaceLayoutManager(WmWindow* window) | 
| 32 : window_(window), | 34 : window_(window), | 
| 33 root_window_(window->GetRootWindow()), | 35 root_window_(window->GetRootWindow()), | 
| 34 root_window_controller_(root_window_->GetRootWindowController()), | 36 root_window_controller_(root_window_->GetRootWindowController()), | 
| 35 shell_(window_->GetShell()), | 37 shell_(window_->GetShell()), | 
| 36 work_area_in_parent_(wm::GetDisplayWorkAreaBounds(window_)), | 38 work_area_in_parent_(wm::GetDisplayWorkAreaBounds(window_)), | 
| 37 is_fullscreen_(wm::GetWindowForFullscreenMode(window) != nullptr) { | 39 is_fullscreen_(wm::GetWindowForFullscreenMode(window) != nullptr) { | 
| 38 shell_->AddShellObserver(this); | 40 shell_->AddShellObserver(this); | 
| 39 shell_->AddActivationObserver(this); | 41 shell_->AddActivationObserver(this); | 
| 40 root_window_->AddObserver(this); | 42 root_window_->AddObserver(this); | 
| 41 root_window_controller_->AddObserver(this); | 43 display::Screen::GetScreen()->AddObserver(this); | 
| 42 DCHECK(window->GetBoolProperty( | 44 DCHECK(window->GetBoolProperty( | 
| 43 WmWindowProperty::SNAP_CHILDREN_TO_PIXEL_BOUNDARY)); | 45 WmWindowProperty::SNAP_CHILDREN_TO_PIXEL_BOUNDARY)); | 
| 44 } | 46 } | 
| 45 | 47 | 
| 46 WorkspaceLayoutManager::~WorkspaceLayoutManager() { | 48 WorkspaceLayoutManager::~WorkspaceLayoutManager() { | 
| 47 if (root_window_) | 49 if (root_window_) | 
| 48 root_window_->RemoveObserver(this); | 50 root_window_->RemoveObserver(this); | 
| 49 for (WmWindow* window : windows_) { | 51 for (WmWindow* window : windows_) { | 
| 50 wm::WindowState* window_state = window->GetWindowState(); | 52 wm::WindowState* window_state = window->GetWindowState(); | 
| 51 window_state->RemoveObserver(this); | 53 window_state->RemoveObserver(this); | 
| 52 window->RemoveObserver(this); | 54 window->RemoveObserver(this); | 
| 53 } | 55 } | 
| 54 root_window_->GetRootWindowController()->RemoveObserver(this); | 56 display::Screen::GetScreen()->RemoveObserver(this); | 
| 55 shell_->RemoveActivationObserver(this); | 57 shell_->RemoveActivationObserver(this); | 
| 56 shell_->RemoveShellObserver(this); | 58 shell_->RemoveShellObserver(this); | 
| 57 } | 59 } | 
| 58 | 60 | 
| 59 void WorkspaceLayoutManager::SetMaximizeBackdropDelegate( | 61 void WorkspaceLayoutManager::SetMaximizeBackdropDelegate( | 
| 60 std::unique_ptr<WorkspaceLayoutManagerBackdropDelegate> delegate) { | 62 std::unique_ptr<WorkspaceLayoutManagerBackdropDelegate> delegate) { | 
| 61 backdrop_delegate_.reset(delegate.release()); | 63 backdrop_delegate_.reset(delegate.release()); | 
| 62 } | 64 } | 
| 63 | 65 | 
| 64 ////////////////////////////////////////////////////////////////////////////// | 66 ////////////////////////////////////////////////////////////////////////////// | 
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 } else if (window_state->HasRestoreBounds()) { | 169 } else if (window_state->HasRestoreBounds()) { | 
| 168 // Keyboard hidden, restore original bounds if they exist. If the user has | 170 // Keyboard hidden, restore original bounds if they exist. If the user has | 
| 169 // resized or dragged the window in the meantime, WorkspaceWindowResizer | 171 // resized or dragged the window in the meantime, WorkspaceWindowResizer | 
| 170 // will have cleared the restore bounds and this code will not accidentally | 172 // will have cleared the restore bounds and this code will not accidentally | 
| 171 // override user intent. | 173 // override user intent. | 
| 172 window_state->SetAndClearRestoreBounds(); | 174 window_state->SetAndClearRestoreBounds(); | 
| 173 } | 175 } | 
| 174 } | 176 } | 
| 175 | 177 | 
| 176 ////////////////////////////////////////////////////////////////////////////// | 178 ////////////////////////////////////////////////////////////////////////////// | 
| 177 // WorkspaceLayoutManager, WmRootWindowControllerObserver implementation: | |
| 178 | |
| 179 void WorkspaceLayoutManager::OnWorkAreaChanged() { | |
| 180 const gfx::Rect work_area(wm::GetDisplayWorkAreaBounds(window_)); | |
| 181 if (work_area != work_area_in_parent_) { | |
| 182 const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); | |
| 183 AdjustAllWindowsBoundsForWorkAreaChange(&event); | |
| 184 } | |
| 185 if (backdrop_delegate_) | |
| 186 backdrop_delegate_->OnDisplayWorkAreaInsetsChanged(); | |
| 187 } | |
| 188 | |
| 189 ////////////////////////////////////////////////////////////////////////////// | |
| 190 // WorkspaceLayoutManager, aura::WindowObserver implementation: | 179 // WorkspaceLayoutManager, aura::WindowObserver implementation: | 
| 191 | 180 | 
| 192 void WorkspaceLayoutManager::OnWindowTreeChanged( | 181 void WorkspaceLayoutManager::OnWindowTreeChanged( | 
| 193 WmWindow* window, | 182 WmWindow* window, | 
| 194 const WmWindowObserver::TreeChangeParams& params) { | 183 const WmWindowObserver::TreeChangeParams& params) { | 
| 195 if (!params.target->GetWindowState()->IsActive()) | 184 if (!params.target->GetWindowState()->IsActive()) | 
| 196 return; | 185 return; | 
| 197 // If the window is already tracked by the workspace this update would be | 186 // If the window is already tracked by the workspace this update would be | 
| 198 // redundant as the fullscreen and shelf state would have been handled in | 187 // redundant as the fullscreen and shelf state would have been handled in | 
| 199 // OnWindowAddedToLayout. | 188 // OnWindowAddedToLayout. | 
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 275 old_type == wm::WINDOW_STATE_TYPE_FULLSCREEN) { | 264 old_type == wm::WINDOW_STATE_TYPE_FULLSCREEN) { | 
| 276 UpdateFullscreenState(); | 265 UpdateFullscreenState(); | 
| 277 } | 266 } | 
| 278 | 267 | 
| 279 UpdateShelfVisibility(); | 268 UpdateShelfVisibility(); | 
| 280 if (backdrop_delegate_) | 269 if (backdrop_delegate_) | 
| 281 backdrop_delegate_->OnPostWindowStateTypeChange(window_state, old_type); | 270 backdrop_delegate_->OnPostWindowStateTypeChange(window_state, old_type); | 
| 282 } | 271 } | 
| 283 | 272 | 
| 284 ////////////////////////////////////////////////////////////////////////////// | 273 ////////////////////////////////////////////////////////////////////////////// | 
| 274 // WorkspaceLayoutManager, display::DisplayObserver implementation: | |
| 275 | |
| 276 void WorkspaceLayoutManager::OnDisplayMetricsChanged( | |
| 277 const display::Display& display, | |
| 278 uint32_t changed_metrics) { | |
| 279 const gfx::Rect work_area(wm::GetDisplayWorkAreaBounds(window_)); | |
| 
 
sky
2016/08/31 16:04:30
Similar comment here about checking ids.
 
msw
2016/08/31 17:07:32
Done.
 
 | |
| 280 if (work_area != work_area_in_parent_) { | |
| 281 const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); | |
| 282 AdjustAllWindowsBoundsForWorkAreaChange(&event); | |
| 283 } | |
| 284 if (backdrop_delegate_) | |
| 285 backdrop_delegate_->OnDisplayWorkAreaInsetsChanged(); | |
| 286 } | |
| 287 | |
| 288 ////////////////////////////////////////////////////////////////////////////// | |
| 285 // WorkspaceLayoutManager, ShellObserver implementation: | 289 // WorkspaceLayoutManager, ShellObserver implementation: | 
| 286 | 290 | 
| 287 void WorkspaceLayoutManager::OnFullscreenStateChanged(bool is_fullscreen, | 291 void WorkspaceLayoutManager::OnFullscreenStateChanged(bool is_fullscreen, | 
| 288 WmWindow* root_window) { | 292 WmWindow* root_window) { | 
| 289 if (root_window != root_window_ || is_fullscreen_ == is_fullscreen) | 293 if (root_window != root_window_ || is_fullscreen_ == is_fullscreen) | 
| 290 return; | 294 return; | 
| 291 | 295 | 
| 292 is_fullscreen_ = is_fullscreen; | 296 is_fullscreen_ = is_fullscreen; | 
| 293 if (WmShell::Get()->IsPinned()) { | 297 if (WmShell::Get()->IsPinned()) { | 
| 294 // If this is in pinned mode, then this event does not trigger the | 298 // If this is in pinned mode, then this event does not trigger the | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 for (auto* window : windows) { | 372 for (auto* window : windows) { | 
| 369 wm::WindowState* window_state = window->GetWindowState(); | 373 wm::WindowState* window_state = window->GetWindowState(); | 
| 370 if (window_on_top) | 374 if (window_on_top) | 
| 371 window_state->DisableAlwaysOnTop(window_on_top); | 375 window_state->DisableAlwaysOnTop(window_on_top); | 
| 372 else | 376 else | 
| 373 window_state->RestoreAlwaysOnTop(); | 377 window_state->RestoreAlwaysOnTop(); | 
| 374 } | 378 } | 
| 375 } | 379 } | 
| 376 | 380 | 
| 377 } // namespace ash | 381 } // namespace ash | 
| OLD | NEW |