| 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/display/display_controller.h" | 5 #include "ash/display/display_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
| 10 #include "ash/display/multi_display_manager.h" | 10 #include "ash/display/multi_display_manager.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 : secondary_display_layout_(RIGHT), | 36 : secondary_display_layout_(RIGHT), |
| 37 secondary_display_offset_(0), | 37 secondary_display_offset_(0), |
| 38 dont_warp_mouse_(false) { | 38 dont_warp_mouse_(false) { |
| 39 aura::Env::GetInstance()->display_manager()->AddObserver(this); | 39 aura::Env::GetInstance()->display_manager()->AddObserver(this); |
| 40 } | 40 } |
| 41 | 41 |
| 42 DisplayController::~DisplayController() { | 42 DisplayController::~DisplayController() { |
| 43 aura::Env::GetInstance()->display_manager()->RemoveObserver(this); | 43 aura::Env::GetInstance()->display_manager()->RemoveObserver(this); |
| 44 // Delete all root window controllers, which deletes root window | 44 // Delete all root window controllers, which deletes root window |
| 45 // from the last so that the primary root window gets deleted last. | 45 // from the last so that the primary root window gets deleted last. |
| 46 for (std::map<int, aura::RootWindow*>::const_reverse_iterator it = | 46 for (std::map<int64, aura::RootWindow*>::const_reverse_iterator it = |
| 47 root_windows_.rbegin(); it != root_windows_.rend(); ++it) { | 47 root_windows_.rbegin(); it != root_windows_.rend(); ++it) { |
| 48 internal::RootWindowController* controller = | 48 internal::RootWindowController* controller = |
| 49 GetRootWindowController(it->second); | 49 GetRootWindowController(it->second); |
| 50 // RootWindow may not have RootWindowController in non | 50 // RootWindow may not have RootWindowController in non |
| 51 // extended desktop mode. | 51 // extended desktop mode. |
| 52 if (controller) | 52 if (controller) |
| 53 delete controller; | 53 delete controller; |
| 54 else | 54 else |
| 55 delete it->second; | 55 delete it->second; |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 | 58 |
| 59 void DisplayController::InitPrimaryDisplay() { | 59 void DisplayController::InitPrimaryDisplay() { |
| 60 aura::DisplayManager* display_manager = | 60 aura::DisplayManager* display_manager = |
| 61 aura::Env::GetInstance()->display_manager(); | 61 aura::Env::GetInstance()->display_manager(); |
| 62 const gfx::Display* display = display_manager->GetDisplayAt(0); | 62 const gfx::Display* display = display_manager->GetDisplayAt(0); |
| 63 DCHECK_EQ(0, display->id()); | 63 aura::RootWindow* root = AddRootWindowForDisplay(*display, true); |
| 64 aura::RootWindow* root = AddRootWindowForDisplay(*display); | |
| 65 root->SetHostBounds(display->bounds_in_pixel()); | 64 root->SetHostBounds(display->bounds_in_pixel()); |
| 66 } | 65 } |
| 67 | 66 |
| 68 void DisplayController::InitSecondaryDisplays() { | 67 void DisplayController::InitSecondaryDisplays() { |
| 69 aura::DisplayManager* display_manager = | 68 aura::DisplayManager* display_manager = |
| 70 aura::Env::GetInstance()->display_manager(); | 69 aura::Env::GetInstance()->display_manager(); |
| 71 for (size_t i = 1; i < display_manager->GetNumDisplays(); ++i) { | 70 for (size_t i = 1; i < display_manager->GetNumDisplays(); ++i) { |
| 72 const gfx::Display* display = display_manager->GetDisplayAt(i); | 71 const gfx::Display* display = display_manager->GetDisplayAt(i); |
| 73 aura::RootWindow* root = AddRootWindowForDisplay(*display); | 72 aura::RootWindow* root = AddRootWindowForDisplay(*display, false); |
| 74 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); | 73 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); |
| 75 } | 74 } |
| 76 UpdateDisplayBoundsForLayout(); | 75 UpdateDisplayBoundsForLayout(); |
| 77 } | 76 } |
| 78 | 77 |
| 79 aura::RootWindow* DisplayController::GetPrimaryRootWindow() { | 78 aura::RootWindow* DisplayController::GetPrimaryRootWindow() { |
| 80 DCHECK(!root_windows_.empty()); | 79 DCHECK(!root_windows_.empty()); |
| 81 return root_windows_[0]; | 80 aura::DisplayManager* display_manager = |
| 81 aura::Env::GetInstance()->display_manager(); |
| 82 return root_windows_[display_manager->GetDisplayAt(0)->id()]; |
| 82 } | 83 } |
| 83 | 84 |
| 84 aura::RootWindow* DisplayController::GetRootWindowForDisplayId(int id) { | 85 aura::RootWindow* DisplayController::GetRootWindowForDisplayId(int id) { |
| 85 return root_windows_[id]; | 86 return root_windows_[id]; |
| 86 } | 87 } |
| 87 | 88 |
| 88 void DisplayController::CloseChildWindows() { | 89 void DisplayController::CloseChildWindows() { |
| 89 for (std::map<int, aura::RootWindow*>::const_iterator it = | 90 for (std::map<int64, aura::RootWindow*>::const_iterator it = |
| 90 root_windows_.begin(); it != root_windows_.end(); ++it) { | 91 root_windows_.begin(); it != root_windows_.end(); ++it) { |
| 91 aura::RootWindow* root_window = it->second; | 92 aura::RootWindow* root_window = it->second; |
| 92 internal::RootWindowController* controller = | 93 internal::RootWindowController* controller = |
| 93 GetRootWindowController(root_window); | 94 GetRootWindowController(root_window); |
| 94 if (controller) { | 95 if (controller) { |
| 95 controller->CloseChildWindows(); | 96 controller->CloseChildWindows(); |
| 96 } else { | 97 } else { |
| 97 while (!root_window->children().empty()) { | 98 while (!root_window->children().empty()) { |
| 98 aura::Window* child = root_window->children()[0]; | 99 aura::Window* child = root_window->children()[0]; |
| 99 delete child; | 100 delete child; |
| 100 } | 101 } |
| 101 } | 102 } |
| 102 } | 103 } |
| 103 } | 104 } |
| 104 | 105 |
| 105 std::vector<aura::RootWindow*> DisplayController::GetAllRootWindows() { | 106 std::vector<aura::RootWindow*> DisplayController::GetAllRootWindows() { |
| 106 std::vector<aura::RootWindow*> windows; | 107 std::vector<aura::RootWindow*> windows; |
| 107 for (std::map<int, aura::RootWindow*>::const_iterator it = | 108 for (std::map<int64, aura::RootWindow*>::const_iterator it = |
| 108 root_windows_.begin(); it != root_windows_.end(); ++it) { | 109 root_windows_.begin(); it != root_windows_.end(); ++it) { |
| 109 DCHECK(it->second); | 110 DCHECK(it->second); |
| 110 if (GetRootWindowController(it->second)) | 111 if (GetRootWindowController(it->second)) |
| 111 windows.push_back(it->second); | 112 windows.push_back(it->second); |
| 112 } | 113 } |
| 113 return windows; | 114 return windows; |
| 114 } | 115 } |
| 115 | 116 |
| 116 std::vector<internal::RootWindowController*> | 117 std::vector<internal::RootWindowController*> |
| 117 DisplayController::GetAllRootWindowControllers() { | 118 DisplayController::GetAllRootWindowControllers() { |
| 118 std::vector<internal::RootWindowController*> controllers; | 119 std::vector<internal::RootWindowController*> controllers; |
| 119 for (std::map<int, aura::RootWindow*>::const_iterator it = | 120 for (std::map<int64, aura::RootWindow*>::const_iterator it = |
| 120 root_windows_.begin(); it != root_windows_.end(); ++it) { | 121 root_windows_.begin(); it != root_windows_.end(); ++it) { |
| 121 internal::RootWindowController* controller = | 122 internal::RootWindowController* controller = |
| 122 GetRootWindowController(it->second); | 123 GetRootWindowController(it->second); |
| 123 if (controller) | 124 if (controller) |
| 124 controllers.push_back(controller); | 125 controllers.push_back(controller); |
| 125 } | 126 } |
| 126 return controllers; | 127 return controllers; |
| 127 } | 128 } |
| 128 | 129 |
| 129 void DisplayController::SetSecondaryDisplayLayout( | 130 void DisplayController::SetSecondaryDisplayLayout( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 return false; | 184 return false; |
| 184 } | 185 } |
| 185 | 186 |
| 186 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { | 187 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { |
| 187 root_windows_[display.id()]->SetHostBounds(display.bounds_in_pixel()); | 188 root_windows_[display.id()]->SetHostBounds(display.bounds_in_pixel()); |
| 188 UpdateDisplayBoundsForLayout(); | 189 UpdateDisplayBoundsForLayout(); |
| 189 } | 190 } |
| 190 | 191 |
| 191 void DisplayController::OnDisplayAdded(const gfx::Display& display) { | 192 void DisplayController::OnDisplayAdded(const gfx::Display& display) { |
| 192 if (root_windows_.empty()) { | 193 if (root_windows_.empty()) { |
| 193 DCHECK_EQ(0, display.id()); | |
| 194 root_windows_[display.id()] = Shell::GetPrimaryRootWindow(); | 194 root_windows_[display.id()] = Shell::GetPrimaryRootWindow(); |
| 195 Shell::GetPrimaryRootWindow()->SetHostBounds(display.bounds_in_pixel()); | 195 Shell::GetPrimaryRootWindow()->SetHostBounds(display.bounds_in_pixel()); |
| 196 return; | 196 return; |
| 197 } | 197 } |
| 198 aura::RootWindow* root = AddRootWindowForDisplay(display); | 198 aura::RootWindow* root = AddRootWindowForDisplay(display, false); |
| 199 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); | 199 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); |
| 200 UpdateDisplayBoundsForLayout(); | 200 UpdateDisplayBoundsForLayout(); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { | 203 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { |
| 204 aura::RootWindow* root = root_windows_[display.id()]; | 204 aura::RootWindow* root = root_windows_[display.id()]; |
| 205 DCHECK(root); | 205 DCHECK(root); |
| 206 // Primary display should never be removed by DisplayManager. | 206 // Primary display should never be removed by DisplayManager. |
| 207 DCHECK(root != Shell::GetPrimaryRootWindow()); | 207 DCHECK(root != Shell::GetPrimaryRootWindow()); |
| 208 // Display for root window will be deleted when the Primary RootWindow | 208 // Display for root window will be deleted when the Primary RootWindow |
| (...skipping 13 matching lines...) Expand all Loading... |
| 222 | 222 |
| 223 // static | 223 // static |
| 224 bool DisplayController::IsExtendedDesktopEnabled(){ | 224 bool DisplayController::IsExtendedDesktopEnabled(){ |
| 225 static bool extended_desktop_disabled = | 225 static bool extended_desktop_disabled = |
| 226 CommandLine::ForCurrentProcess()->HasSwitch( | 226 CommandLine::ForCurrentProcess()->HasSwitch( |
| 227 switches::kAshExtendedDesktopDisabled); | 227 switches::kAshExtendedDesktopDisabled); |
| 228 return !extended_desktop_disabled; | 228 return !extended_desktop_disabled; |
| 229 } | 229 } |
| 230 | 230 |
| 231 aura::RootWindow* DisplayController::AddRootWindowForDisplay( | 231 aura::RootWindow* DisplayController::AddRootWindowForDisplay( |
| 232 const gfx::Display& display) { | 232 const gfx::Display& display, bool is_primary) { |
| 233 aura::RootWindow* root = aura::Env::GetInstance()->display_manager()-> | 233 aura::RootWindow* root = aura::Env::GetInstance()->display_manager()-> |
| 234 CreateRootWindowForDisplay(display); | 234 CreateRootWindowForDisplay(display); |
| 235 root_windows_[display.id()] = root; | 235 root_windows_[display.id()] = root; |
| 236 // Confine the cursor within the window if | 236 // Confine the cursor within the window if |
| 237 // 1) Extended desktop is enabled or | 237 // 1) Extended desktop is enabled or |
| 238 // 2) the display is primary display and the host window | 238 // 2) the display is primary display and the host window |
| 239 // is set to be fullscreen (this is old behavior). | 239 // is set to be fullscreen (this is old behavior). |
| 240 if (IsExtendedDesktopEnabled() || | 240 if (IsExtendedDesktopEnabled() || |
| 241 (aura::DisplayManager::use_fullscreen_host_window() && | 241 (aura::DisplayManager::use_fullscreen_host_window() && is_primary)) { |
| 242 display.id() == 0)) { | |
| 243 root->ConfineCursorToWindow(); | 242 root->ConfineCursorToWindow(); |
| 244 } | 243 } |
| 245 return root; | 244 return root; |
| 246 } | 245 } |
| 247 | 246 |
| 248 void DisplayController::UpdateDisplayBoundsForLayout() { | 247 void DisplayController::UpdateDisplayBoundsForLayout() { |
| 249 if (!IsExtendedDesktopEnabled() || gfx::Screen::GetNumDisplays() <= 1) { | 248 if (!IsExtendedDesktopEnabled() || gfx::Screen::GetNumDisplays() <= 1) { |
| 250 return; | 249 return; |
| 251 } | 250 } |
| 252 DCHECK_EQ(2, gfx::Screen::GetNumDisplays()); | 251 DCHECK_EQ(2, gfx::Screen::GetNumDisplays()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 break; | 287 break; |
| 289 } | 288 } |
| 290 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); | 289 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); |
| 291 secondary_display->set_bounds( | 290 secondary_display->set_bounds( |
| 292 gfx::Rect(new_secondary_origin, secondary_bounds.size())); | 291 gfx::Rect(new_secondary_origin, secondary_bounds.size())); |
| 293 secondary_display->UpdateWorkAreaFromInsets(insets); | 292 secondary_display->UpdateWorkAreaFromInsets(insets); |
| 294 } | 293 } |
| 295 | 294 |
| 296 } // namespace internal | 295 } // namespace internal |
| 297 } // namespace ash | 296 } // namespace ash |
| OLD | NEW |