summaryrefslogtreecommitdiff
path: root/chromium/ash/display/display_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/display/display_controller.cc')
-rw-r--r--chromium/ash/display/display_controller.cc61
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());
}