Index: ash/display/display_controller.cc |
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc |
index 304b9270eca9de43fcde4cd0620c9eb655e396fb..01b361c7505e2518847f6245ab31fef770cfaff3 100644 |
--- a/ash/display/display_controller.cc |
+++ b/ash/display/display_controller.cc |
@@ -160,8 +160,7 @@ void SetDisplayPropertiesOnHost(AshWindowTreeHost* ash_host, |
host->compositor()->ScheduleFullRedraw(); |
} |
-void ClearDisplayPropertiesOnHost(AshWindowTreeHost* ash_host, |
- const gfx::Display& display) { |
+void ClearDisplayPropertiesOnHost(AshWindowTreeHost* ash_host) { |
#if defined(OS_CHROMEOS) && defined(USE_OZONE) |
aura::WindowTreeHost* host = ash_host->AsWindowTreeHost(); |
ui::CursorController::GetInstance()->ClearCursorConfigForWindow( |
@@ -330,7 +329,6 @@ void DisplayController::CreatePrimaryHost( |
void DisplayController::InitDisplays() { |
RootWindowController::CreateForPrimaryDisplay( |
window_tree_hosts_[primary_display_id]); |
- |
DisplayManager* display_manager = GetDisplayManager(); |
for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { |
const gfx::Display& display = display_manager->GetDisplayAt(i); |
@@ -363,12 +361,17 @@ aura::Window* DisplayController::GetPrimaryRootWindow() { |
} |
aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) { |
- CHECK_EQ(1u, window_tree_hosts_.count(id)); |
- AshWindowTreeHost* host = window_tree_hosts_[id]; |
+ AshWindowTreeHost* host = GetAshWindowTreeHostForDisplayId(id); |
CHECK(host); |
return GetWindow(host); |
} |
+AshWindowTreeHost* DisplayController::GetAshWindowTreeHostForDisplayId( |
+ int64 id) { |
+ CHECK_EQ(1u, window_tree_hosts_.count(id)); |
+ return window_tree_hosts_[id]; |
+} |
+ |
void DisplayController::CloseChildWindows() { |
for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin(); |
it != window_tree_hosts_.end(); |
@@ -629,28 +632,56 @@ bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow( |
} |
void DisplayController::OnDisplayAdded(const gfx::Display& display) { |
- if (primary_tree_host_for_replace_) { |
- DCHECK(window_tree_hosts_.empty()); |
- primary_display_id = display.id(); |
- window_tree_hosts_[display.id()] = primary_tree_host_for_replace_; |
- GetRootWindowSettings(GetWindow(primary_tree_host_for_replace_)) |
- ->display_id = display.id(); |
- primary_tree_host_for_replace_ = NULL; |
- const DisplayInfo& display_info = |
- GetDisplayManager()->GetDisplayInfo(display.id()); |
- AshWindowTreeHost* ash_host = window_tree_hosts_[display.id()]; |
- ash_host->AsWindowTreeHost()->SetBounds(display_info.bounds_in_native()); |
- SetDisplayPropertiesOnHost(ash_host, display); |
- } else { |
+ // TODO(oshima): Consolidate these logic. |
+ if (GetDisplayManager()->IsInUnifiedMode()) { |
if (primary_display_id == gfx::Display::kInvalidDisplayID) |
primary_display_id = display.id(); |
- DCHECK(!window_tree_hosts_.empty()); |
AshWindowTreeHost* ash_host = AddWindowTreeHostForDisplay( |
display, AshWindowTreeHostInitParams()); |
RootWindowController::CreateForSecondaryDisplay(ash_host); |
+ |
+ if (primary_tree_host_for_replace_) { |
+ AshWindowTreeHost* to_delete = primary_tree_host_for_replace_; |
+ primary_tree_host_for_replace_ = NULL; |
Jun Mukai
2015/04/26 23:45:07
nullptr
oshima
2015/04/27 17:48:38
Done.
|
+ DeleteHost(to_delete); |
+ // the host has already been removed from the window_tree_host_. |
+ } |
+ } else { |
+ if (primary_tree_host_for_replace_) { |
Jun Mukai
2015/04/26 23:45:07
why not else if?
oshima
2015/04/27 17:48:38
Done.
|
+ DCHECK(window_tree_hosts_.empty()); |
+ primary_display_id = display.id(); |
+ window_tree_hosts_[display.id()] = primary_tree_host_for_replace_; |
+ GetRootWindowSettings(GetWindow(primary_tree_host_for_replace_)) |
+ ->display_id = display.id(); |
+ primary_tree_host_for_replace_ = NULL; |
Jun Mukai
2015/04/26 23:45:07
nullptr
oshima
2015/04/27 17:48:38
Done.
|
+ const DisplayInfo& display_info = |
+ GetDisplayManager()->GetDisplayInfo(display.id()); |
+ AshWindowTreeHost* ash_host = window_tree_hosts_[display.id()]; |
+ ash_host->AsWindowTreeHost()->SetBounds(display_info.bounds_in_native()); |
+ SetDisplayPropertiesOnHost(ash_host, display); |
+ } else { |
+ if (primary_display_id == gfx::Display::kInvalidDisplayID) |
+ primary_display_id = display.id(); |
+ DCHECK(!window_tree_hosts_.empty()); |
+ AshWindowTreeHost* ash_host = |
+ AddWindowTreeHostForDisplay(display, AshWindowTreeHostInitParams()); |
+ RootWindowController::CreateForSecondaryDisplay(ash_host); |
+ } |
} |
} |
+void DisplayController::DeleteHost(AshWindowTreeHost* host_to_delete) { |
+ ClearDisplayPropertiesOnHost(host_to_delete); |
+ RootWindowController* controller = |
+ GetRootWindowController(GetWindow(host_to_delete)); |
+ DCHECK(controller); |
+ controller->MoveWindowsTo(GetPrimaryRootWindow()); |
+ // Delete most of root window related objects, but don't delete |
+ // root window itself yet because the stack may be using it. |
+ controller->Shutdown(); |
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); |
+} |
+ |
void DisplayController::OnDisplayRemoved(const gfx::Display& display) { |
AshWindowTreeHost* host_to_delete = window_tree_hosts_[display.id()]; |
CHECK(host_to_delete) << display.ToString(); |
@@ -690,15 +721,8 @@ void DisplayController::OnDisplayRemoved(const gfx::Display& display) { |
GetDisplayManager()->GetDisplayForId(primary_display_id), |
DISPLAY_METRIC_BOUNDS); |
} |
- ClearDisplayPropertiesOnHost(host_to_delete, display); |
- RootWindowController* controller = |
- GetRootWindowController(GetWindow(host_to_delete)); |
- DCHECK(controller); |
- controller->MoveWindowsTo(GetPrimaryRootWindow()); |
- // Delete most of root window related objects, but don't delete |
- // root window itself yet because the stack may be using it. |
- controller->Shutdown(); |
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); |
+ |
+ DeleteHost(host_to_delete); |
// The window tree host should be erased at last because some handlers can |
// access to the host through GetRootWindowForDisplayId() during |
@@ -731,10 +755,11 @@ void DisplayController::OnHostResized(const aura::WindowTreeHost* host) { |
} |
void DisplayController::CreateOrUpdateMirroringDisplay( |
- const DisplayInfo& info) { |
- switch (GetDisplayManager()->second_display_mode()) { |
+ const DisplayInfoList& info_list) { |
+ switch (GetDisplayManager()->multi_display_mode()) { |
case DisplayManager::MIRRORING: |
- mirror_window_controller_->UpdateWindow(info); |
+ case DisplayManager::UNIFIED: |
+ mirror_window_controller_->UpdateWindow(info_list); |
cursor_window_controller_->UpdateContainer(); |
break; |
case DisplayManager::EXTENDED: |
@@ -780,9 +805,9 @@ void DisplayController::PostDisplayConfigurationChange() { |
if (display_manager->num_connected_displays() > 1) { |
DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair(); |
layout_store->UpdateMirrorStatus(pair, display_manager->IsInMirrorMode()); |
- DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair); |
if (Shell::GetScreen()->GetNumDisplays() > 1 ) { |
+ DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair); |
int64 primary_id = layout.primary_id; |
SetPrimaryDisplayId( |
primary_id == gfx::Display::kInvalidDisplayID ? |
@@ -807,10 +832,14 @@ AshWindowTreeHost* DisplayController::AddWindowTreeHostForDisplay( |
GetDisplayManager()->GetDisplayInfo(display.id()); |
AshWindowTreeHostInitParams params_with_bounds(init_params); |
params_with_bounds.initial_bounds = display_info.bounds_in_native(); |
+ params_with_bounds.offscreen = |
+ display.id() == DisplayManager::kUnifiedDisplayId; |
AshWindowTreeHost* ash_host = AshWindowTreeHost::Create(params_with_bounds); |
aura::WindowTreeHost* host = ash_host->AsWindowTreeHost(); |
- host->window()->SetName(base::StringPrintf("RootWindow-%d", host_count++)); |
+ host->window()->SetName(base::StringPrintf( |
+ "%sRootWindow-%d", params_with_bounds.offscreen ? "Offscreen" : "", |
+ host_count++)); |
host->window()->SetTitle(base::UTF8ToUTF16(display_info.name())); |
host->compositor()->SetBackgroundColor(SK_ColorBLACK); |
// No need to remove our observer observer because the DisplayController |
@@ -823,10 +852,7 @@ AshWindowTreeHost* DisplayController::AddWindowTreeHostForDisplay( |
SetDisplayPropertiesOnHost(ash_host, display); |
#if defined(OS_CHROMEOS) |
- static bool force_constrain_pointer_to_root = |
- base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kAshConstrainPointerToRoot); |
- if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root) |
+ if (switches::ConstrainPointerToRoot()) |
ash_host->ConfineCursorToRootWindow(); |
#endif |
return ash_host; |