Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Unified Diff: ash/display/mirror_window_controller.cc

Issue 1133323002: Close mirroring window only when necessary (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/display/mirror_window_controller.h ('k') | ash/shell.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..529353713927e4d2679d91091c911f79fad74d6d 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,10 +267,23 @@ 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(
@@ -342,7 +356,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 +372,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>
« no previous file with comments | « ash/display/mirror_window_controller.h ('k') | ash/shell.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698