Chromium Code Reviews| Index: ash/display/mirror_window_controller.cc |
| diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc |
| index a4d70a678f8cf0ed528fc959e9edd46859dbdc47..bbe2db8c2952b0e5674359ac39346b63fd6b7152 100644 |
| --- a/ash/display/mirror_window_controller.cc |
| +++ b/ash/display/mirror_window_controller.cc |
| @@ -136,12 +136,13 @@ MirrorWindowController::MirroringHostInfo::~MirroringHostInfo() { |
| } |
| MirrorWindowController::MirrorWindowController() |
| - : screen_position_client_(new MirroringScreenPositionClient(this)) { |
| + : multi_display_mode_(DisplayManager::EXTENDED), |
| + screen_position_client_(new MirroringScreenPositionClient(this)) { |
| } |
| MirrorWindowController::~MirrorWindowController() { |
| // Make sure the root window gets deleted before cursor_window_delegate. |
| - Close(); |
| + Close(false); |
| } |
| void MirrorWindowController::UpdateWindow( |
| @@ -247,7 +248,7 @@ void MirrorWindowController::UpdateWindow( |
| [iter](const DisplayInfo& info) { |
| return info.id() == iter->first; |
| }) == display_info_list.end()) { |
| - CloseAndDeleteHost(iter->second); |
| + CloseAndDeleteHost(iter->second, true); |
| iter = mirroring_host_info_map_.erase(iter); |
| } else { |
| ++iter; |
| @@ -266,16 +267,30 @@ void MirrorWindowController::UpdateWindow() { |
| UpdateWindow(display_info_list); |
| } |
| -void MirrorWindowController::Close() { |
| - for (auto& info : mirroring_host_info_map_) { |
| - CloseAndDeleteHost(info.second); |
| - } |
| +void MirrorWindowController::CloseIfNotNecessary() { |
| + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
| + |
| + DisplayManager::MultiDisplayMode new_mode = |
| + display_manager->IsInUnifiedMode() |
| + ? DisplayManager::UNIFIED |
| + : (display_manager->IsInMirrorMode() ? DisplayManager::MIRRORING |
| + : DisplayManager::EXTENDED); |
| + if (multi_display_mode_ != new_mode) |
| + Close(true); |
| + multi_display_mode_ = new_mode; |
| +} |
| + |
| +void MirrorWindowController::Close(bool delay_host_deletion) { |
| + for (auto& info : mirroring_host_info_map_) |
| + CloseAndDeleteHost(info.second, delay_host_deletion); |
| + |
| mirroring_host_info_map_.clear(); |
| if (reflector_) { |
| aura::Env::GetInstance()->context_factory()->RemoveReflector( |
| reflector_.get()); |
| reflector_.reset(); |
| } |
| + multi_display_mode_ = DisplayManager::EXTENDED; |
|
Jun Mukai
2015/05/13 17:43:12
Can you remove this line?
Close() is called only f
oshima
2015/05/13 23:04:25
Done.
|
| } |
| void MirrorWindowController::OnHostResized(const aura::WindowTreeHost* host) { |
| @@ -342,7 +357,8 @@ aura::Window::Windows MirrorWindowController::GetAllRootWindows() const { |
| return root_windows; |
| } |
| -void MirrorWindowController::CloseAndDeleteHost(MirroringHostInfo* host_info) { |
| +void MirrorWindowController::CloseAndDeleteHost(MirroringHostInfo* host_info, |
| + bool delay_host_deletion) { |
| aura::WindowTreeHost* host = host_info->ash_host->AsWindowTreeHost(); |
| aura::client::SetScreenPositionClient(host->window(), nullptr); |
| @@ -357,7 +373,13 @@ void MirrorWindowController::CloseAndDeleteHost(MirroringHostInfo* host_info) { |
| host_info->ash_host->PrepareForShutdown(); |
| reflector_->RemoveMirroringLayer(host_info->mirror_window->layer()); |
| - delete host_info; |
| + // EventProcessor may be accessed after this call if the mirroring window |
| + // was deleted as a result of input event (e.g. shortcut), so don't delete |
| + // now. |
| + if (delay_host_deletion) |
| + base::MessageLoop::current()->DeleteSoon(FROM_HERE, host_info); |
| + else |
| + delete host_info; |
| } |
| scoped_ptr<RootWindowTransformer> |