diff options
Diffstat (limited to 'chromium/ash/display/display_controller.cc')
-rw-r--r-- | chromium/ash/display/display_controller.cc | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/chromium/ash/display/display_controller.cc b/chromium/ash/display/display_controller.cc index f0ac711e991..fce5a82ed46 100644 --- a/chromium/ash/display/display_controller.cc +++ b/chromium/ash/display/display_controller.cc @@ -288,14 +288,15 @@ int DisplayController::GetNumDisplays() { } void DisplayController::InitPrimaryDisplay() { - const gfx::Display& primary_candidate = + const gfx::Display* primary_candidate = GetDisplayManager()->GetPrimaryDisplayCandidate(); - primary_display_id = primary_candidate.id(); - AddRootWindowForDisplay(primary_candidate); + primary_display_id = primary_candidate->id(); + AddRootWindowForDisplay(*primary_candidate); } void DisplayController::InitSecondaryDisplays() { internal::DisplayManager* display_manager = GetDisplayManager(); + UpdateDisplayBoundsForLayout(); for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { const gfx::Display& display = display_manager->GetDisplayAt(i); if (primary_display_id != display.id()) { @@ -303,6 +304,13 @@ void DisplayController::InitSecondaryDisplays() { Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); } } + if (display_manager->GetNumDisplays() > 1) { + DisplayIdPair pair = GetCurrentDisplayIdPair(); + DisplayLayout layout = GetCurrentDisplayLayout(); + SetPrimaryDisplayId( + layout.primary_id == gfx::Display::kInvalidDisplayID ? + pair.first : layout.primary_id); + } UpdateHostWindowNames(); } @@ -379,7 +387,7 @@ void DisplayController::SetLayoutForCurrentDisplays( if (GetDisplayManager()->GetNumDisplays() < 2) return; const gfx::Display& primary = GetPrimaryDisplay(); - const DisplayIdPair pair = GetDisplayManager()->GetCurrentDisplayIdPair(); + const DisplayIdPair pair = GetCurrentDisplayIdPair(); // Invert if the primary was swapped. DisplayLayout to_set = pair.first == primary.id() ? layout_relative_to_primary : layout_relative_to_primary.Invert(); @@ -404,6 +412,40 @@ void DisplayController::SetLayoutForCurrentDisplays( } } +DisplayLayout DisplayController::GetCurrentDisplayLayout() { + DCHECK_EQ(2U, GetDisplayManager()->num_connected_displays()); + // Invert if the primary was swapped. + if (GetDisplayManager()->num_connected_displays() > 1) { + DisplayIdPair pair = GetCurrentDisplayIdPair(); + return GetDisplayManager()->layout_store()-> + ComputeDisplayLayoutForDisplayIdPair(pair); + } + NOTREACHED() << "DisplayLayout is requested for single display"; + // On release build, just fallback to default instead of blowing up. + DisplayLayout layout = + GetDisplayManager()->layout_store()->default_display_layout(); + layout.primary_id = primary_display_id; + return layout; +} + +DisplayIdPair DisplayController::GetCurrentDisplayIdPair() const { + internal::DisplayManager* display_manager = GetDisplayManager(); + const gfx::Display& primary = GetPrimaryDisplay(); + if (display_manager->IsMirrored()) { + return std::make_pair(primary.id(), + display_manager->mirrored_display().id()); + } + + const gfx::Display& secondary = ScreenAsh::GetSecondaryDisplay(); + if (primary.IsInternal() || + GetDisplayManager()->first_display_id() == primary.id()) { + return std::make_pair(primary.id(), secondary.id()); + } else { + // Display has been Swapped. + return std::make_pair(secondary.id(), primary.id()); + } +} + void DisplayController::ToggleMirrorMode() { internal::DisplayManager* display_manager = GetDisplayManager(); if (display_manager->num_connected_displays() <= 1) @@ -500,7 +542,7 @@ void DisplayController::SetPrimaryDisplay( primary_display_id = new_primary_display.id(); GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId( - display_manager->GetCurrentDisplayIdPair(), primary_display_id); + GetCurrentDisplayIdPair(), primary_display_id); UpdateWorkAreaOfDisplayNearestWindow( primary_root, old_primary_display.GetWorkAreaInsets()); @@ -741,7 +783,7 @@ void DisplayController::PostDisplayConfigurationChange() { internal::DisplayManager* display_manager = GetDisplayManager(); internal::DisplayLayoutStore* layout_store = display_manager->layout_store(); if (display_manager->num_connected_displays() > 1) { - DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair(); + DisplayIdPair pair = GetCurrentDisplayIdPair(); layout_store->UpdateMirrorStatus(pair, display_manager->IsMirrored()); DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair); @@ -795,15 +837,14 @@ aura::RootWindow* DisplayController::AddRootWindowForDisplay( } void DisplayController::UpdateDisplayBoundsForLayout() { - internal::DisplayManager* display_manager = GetDisplayManager(); if (Shell::GetScreen()->GetNumDisplays() < 2 || - display_manager->num_connected_displays() < 2) { + GetDisplayManager()->num_connected_displays() < 2) { return; } DCHECK_EQ(2, Shell::GetScreen()->GetNumDisplays()); - const DisplayLayout layout = display_manager->GetCurrentDisplayLayout(); - display_manager->UpdateDisplayBoundsForLayoutById( + const DisplayLayout layout = GetCurrentDisplayLayout(); + Shell::GetInstance()->display_manager()->UpdateDisplayBoundsForLayoutById( layout, GetPrimaryDisplay(), ScreenAsh::GetSecondaryDisplay().id()); } |