Index: ash/display/display_controller.cc |
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc |
index 304b9270eca9de43fcde4cd0620c9eb655e396fb..2aa2fc692c0133d44c7ae02998692b4175d7aaaa 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( |
@@ -181,12 +180,11 @@ aura::Window* GetWindow(AshWindowTreeHost* ash_host) { |
class FocusActivationStore { |
public: |
FocusActivationStore() |
- : activation_client_(NULL), |
- capture_client_(NULL), |
- focus_client_(NULL), |
- focused_(NULL), |
- active_(NULL) { |
- } |
+ : activation_client_(nullptr), |
+ capture_client_(nullptr), |
+ focus_client_(nullptr), |
+ focused_(nullptr), |
+ active_(nullptr) {} |
void Store(bool clear_focus) { |
if (!activation_client_) { |
@@ -207,13 +205,13 @@ class FocusActivationStore { |
activation_client_->DeactivateWindow(active_); |
// Release capture if any. |
- capture_client_->SetCapture(NULL); |
+ capture_client_->SetCapture(nullptr); |
// Clear the focused window if any. This is necessary because a |
// window may be deleted when losing focus (fullscreen flash for |
// example). If the focused window is still alive after move, it'll |
// be re-focused below. |
if (clear_focus) |
- focus_client_->FocusWindow(NULL); |
+ focus_client_->FocusWindow(nullptr); |
} |
void Restore() { |
@@ -227,8 +225,8 @@ class FocusActivationStore { |
tracker_.Remove(focused_); |
if (active_) |
tracker_.Remove(active_); |
- focused_ = NULL; |
- active_ = NULL; |
+ focused_ = nullptr; |
+ active_ = nullptr; |
} |
private: |
@@ -263,7 +261,7 @@ bool DisplayController::DisplayChangeLimiter::IsThrottled() const { |
// DisplayController |
DisplayController::DisplayController() |
- : primary_tree_host_for_replace_(NULL), |
+ : primary_tree_host_for_replace_(nullptr), |
focus_activation_store_(new FocusActivationStore()), |
cursor_window_controller_(new CursorWindowController()), |
mirror_window_controller_(new MirrorWindowController()), |
@@ -289,7 +287,7 @@ void DisplayController::Start() { |
void DisplayController::Shutdown() { |
// Unset the display manager's delegate here because |
// DisplayManager outlives DisplayController. |
- Shell::GetInstance()->display_manager()->set_delegate(NULL); |
+ Shell::GetInstance()->display_manager()->set_delegate(nullptr); |
cursor_window_controller_.reset(); |
mirror_window_controller_.reset(); |
@@ -302,7 +300,7 @@ void DisplayController::Shutdown() { |
// delete the primary root window controller. |
aura::Window::Windows root_windows = DisplayController::GetAllRootWindows(); |
std::vector<RootWindowController*> to_delete; |
- RootWindowController* primary_rwc = NULL; |
+ RootWindowController* primary_rwc = nullptr; |
for (aura::Window::Windows::iterator iter = root_windows.begin(); |
iter != root_windows.end(); |
++iter) { |
@@ -330,7 +328,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 +360,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(); |
@@ -546,7 +548,7 @@ void DisplayController::UpdateMouseLocationAfterDisplayChange() { |
int64 closest_distance_squared = -1; |
DisplayManager* display_manager = GetDisplayManager(); |
- aura::Window* dst_root_window = NULL; |
+ aura::Window* dst_root_window = nullptr; |
for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { |
const gfx::Display& display = display_manager->GetDisplayAt(i); |
const DisplayInfo display_info = |
@@ -629,13 +631,30 @@ bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow( |
} |
void DisplayController::OnDisplayAdded(const gfx::Display& display) { |
- if (primary_tree_host_for_replace_) { |
+ if (GetDisplayManager()->IsInUnifiedMode()) { |
+ if (primary_display_id == gfx::Display::kInvalidDisplayID) |
+ primary_display_id = display.id(); |
+ 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_ = nullptr; |
+ DeleteHost(to_delete); |
+ // the host has already been removed from the window_tree_host_. |
+ } |
+ } |
+ // TODO(oshima): It should be possible to consolidate logic for |
+ // unified and non unified, but I'm keeping them separated to minimize |
+ // the risk in M44. I'll consolidate this in M45. |
+ else 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; |
+ primary_tree_host_for_replace_ = nullptr; |
const DisplayInfo& display_info = |
GetDisplayManager()->GetDisplayInfo(display.id()); |
AshWindowTreeHost* ash_host = window_tree_hosts_[display.id()]; |
@@ -645,12 +664,24 @@ void DisplayController::OnDisplayAdded(const gfx::Display& display) { |
if (primary_display_id == gfx::Display::kInvalidDisplayID) |
primary_display_id = display.id(); |
DCHECK(!window_tree_hosts_.empty()); |
- AshWindowTreeHost* ash_host = AddWindowTreeHostForDisplay( |
- display, AshWindowTreeHostInitParams()); |
+ 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; |