Index: ash/monitor/monitor_controller.cc |
diff --git a/ash/monitor/monitor_controller.cc b/ash/monitor/monitor_controller.cc |
index 0e6288036efb56f0b88b3698b1f4b3ae53da7365..b97c9b22fd04ed1679d2d00b1e6b88284c988fe1 100644 |
--- a/ash/monitor/monitor_controller.cc |
+++ b/ash/monitor/monitor_controller.cc |
@@ -51,18 +51,18 @@ MonitorController::~MonitorController() { |
void MonitorController::InitPrimaryDisplay() { |
aura::MonitorManager* monitor_manager = |
aura::Env::GetInstance()->monitor_manager(); |
- const gfx::Display& display = monitor_manager->GetDisplayAt(0); |
- DCHECK_EQ(0, display.id()); |
- aura::RootWindow* root = AddRootWindowForDisplay(display); |
- root->SetHostBounds(display.bounds_in_pixel()); |
+ const gfx::Display* display = monitor_manager->GetDisplayAt(0); |
+ DCHECK_EQ(0, display->id()); |
+ aura::RootWindow* root = AddRootWindowForDisplay(*display); |
+ root->SetHostBounds(display->bounds_in_pixel()); |
} |
void MonitorController::InitSecondaryDisplays() { |
aura::MonitorManager* monitor_manager = |
aura::Env::GetInstance()->monitor_manager(); |
for (size_t i = 1; i < monitor_manager->GetNumDisplays(); ++i) { |
- const gfx::Display& display = monitor_manager->GetDisplayAt(i); |
- aura::RootWindow* root = AddRootWindowForDisplay(display); |
+ const gfx::Display* display = monitor_manager->GetDisplayAt(i); |
+ aura::RootWindow* root = AddRootWindowForDisplay(*display); |
Shell::GetInstance()->InitRootWindowForSecondaryMonitor(root); |
} |
} |
@@ -116,6 +116,7 @@ MonitorController::GetAllRootWindowControllers() { |
void MonitorController::SetSecondaryDisplayLayout( |
SecondaryDisplayLayout layout) { |
secondary_display_layout_ = layout; |
+ UpdateDisplayBoundsForLayout(); |
} |
bool MonitorController::WarpMouseCursorIfNecessary( |
@@ -191,6 +192,7 @@ bool MonitorController::WarpMouseCursorIfNecessary( |
void MonitorController::OnDisplayBoundsChanged(const gfx::Display& display) { |
root_windows_[display.id()]->SetHostBounds(display.bounds_in_pixel()); |
+ UpdateDisplayBoundsForLayout(); |
} |
void MonitorController::OnDisplayAdded(const gfx::Display& display) { |
@@ -202,6 +204,7 @@ void MonitorController::OnDisplayAdded(const gfx::Display& display) { |
} |
aura::RootWindow* root = AddRootWindowForDisplay(display); |
Shell::GetInstance()->InitRootWindowForSecondaryMonitor(root); |
+ UpdateDisplayBoundsForLayout(); |
} |
void MonitorController::OnDisplayRemoved(const gfx::Display& display) { |
@@ -236,9 +239,10 @@ void MonitorController::SetExtendedDesktopEnabled(bool enabled) { |
// static |
bool MonitorController::IsVirtualScreenCoordinatesEnabled() { |
- return virtual_screen_coordinates_enabled || |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kAshVirtualScreenCoordinates); |
+ return IsExtendedDesktopEnabled() && |
+ (virtual_screen_coordinates_enabled || |
+ CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kAshVirtualScreenCoordinates)); |
} |
// static |
@@ -263,5 +267,39 @@ aura::RootWindow* MonitorController::AddRootWindowForDisplay( |
return root; |
} |
+void MonitorController::UpdateDisplayBoundsForLayout() { |
+ if (!IsVirtualScreenCoordinatesEnabled() || |
+ gfx::Screen::GetNumDisplays() <= 1) { |
+ return; |
+ } |
+ DCHECK_EQ(2, gfx::Screen::GetNumDisplays()); |
+ aura::MonitorManager* monitor_manager = |
+ aura::Env::GetInstance()->monitor_manager(); |
+ const gfx::Rect& primary_bounds = monitor_manager->GetDisplayAt(0)->bounds(); |
+ gfx::Display* secondary_display = monitor_manager->GetDisplayAt(1); |
+ const gfx::Rect& secondary_bounds = secondary_display->bounds(); |
+ gfx::Point new_secondary_origin = primary_bounds.origin(); |
+ |
+ // TODO(oshima|mukai): Implement more flexible layout. |
+ switch (secondary_display_layout_) { |
+ case TOP: |
+ new_secondary_origin.Offset(0, -secondary_bounds.height()); |
+ break; |
+ case RIGHT: |
+ new_secondary_origin.Offset(primary_bounds.width(), 0); |
+ break; |
+ case BOTTOM: |
+ new_secondary_origin.Offset(0, primary_bounds.height()); |
+ break; |
+ case LEFT: |
+ new_secondary_origin.Offset(-secondary_bounds.width(), 0); |
+ break; |
+ } |
+ gfx::Insets insets = secondary_display->GetWorkAreaInsets(); |
+ secondary_display->set_bounds( |
+ gfx::Rect(new_secondary_origin, secondary_bounds.size())); |
+ secondary_display->UpdateWorkAreaFromInsets(insets); |
+} |
+ |
} // namespace internal |
} // namespace ash |