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

Unified Diff: ash/display/display_controller.cc

Issue 10909043: Cancel drag if display configuration changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win fix, adjust test screen size Created 8 years, 3 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
Index: ash/display/display_controller.cc
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc
index 16ee88ca900717390d58ab4d824ed5df8faf5193..5cc96e7771b33a9a76318c9301eda177ef8cb541 100644
--- a/ash/display/display_controller.cc
+++ b/ash/display/display_controller.cc
@@ -180,6 +180,14 @@ void DisplayController::InitSecondaryDisplays() {
UpdateDisplayBoundsForLayout();
}
+void DisplayController::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void DisplayController::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
aura::RootWindow* DisplayController::GetPrimaryRootWindow() {
DCHECK(!root_windows_.empty());
aura::DisplayManager* display_manager =
@@ -233,14 +241,23 @@ DisplayController::GetAllRootWindowControllers() {
}
void DisplayController::SetDefaultDisplayLayout(const DisplayLayout& layout) {
- default_display_layout_ = layout;
- UpdateDisplayBoundsForLayout();
+ if (default_display_layout_.position != layout.position ||
+ default_display_layout_.offset != layout.offset) {
+ default_display_layout_ = layout;
+ NotifyDisplayConfigurationChanging();
+ UpdateDisplayBoundsForLayout();
+ }
}
void DisplayController::SetLayoutForDisplayName(const std::string& name,
const DisplayLayout& layout) {
- secondary_layouts_[name] = layout;
- UpdateDisplayBoundsForLayout();
+ DisplayLayout& display_for_name = secondary_layouts_[name];
+ if (display_for_name.position != layout.position ||
+ display_for_name.offset != layout.offset) {
+ secondary_layouts_[name] = layout;
+ NotifyDisplayConfigurationChanging();
+ UpdateDisplayBoundsForLayout();
+ }
}
const DisplayLayout& DisplayController::GetLayoutForDisplayName(
@@ -254,12 +271,14 @@ const DisplayLayout& DisplayController::GetLayoutForDisplayName(
}
void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) {
+ NotifyDisplayConfigurationChanging();
root_windows_[display.id()]->SetHostBounds(display.bounds_in_pixel());
UpdateDisplayBoundsForLayout();
}
void DisplayController::OnDisplayAdded(const gfx::Display& display) {
DCHECK(!root_windows_.empty());
+ NotifyDisplayConfigurationChanging();
aura::RootWindow* root = AddRootWindowForDisplay(display);
Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root);
UpdateDisplayBoundsForLayout();
@@ -270,18 +289,19 @@ void DisplayController::OnDisplayRemoved(const gfx::Display& display) {
DCHECK(root);
// Primary display should never be removed by DisplayManager.
DCHECK(root != GetPrimaryRootWindow());
+ NotifyDisplayConfigurationChanging();
// Display for root window will be deleted when the Primary RootWindow
// is deleted by the Shell.
if (root != GetPrimaryRootWindow()) {
root_windows_.erase(display.id());
internal::RootWindowController* controller =
GetRootWindowController(root);
- if (controller) {
- controller->MoveWindowsTo(GetPrimaryRootWindow());
- delete controller;
- } else {
- delete root;
- }
+ DCHECK(controller);
+ controller->MoveWindowsTo(GetPrimaryRootWindow());
+ // Delete most of root window related objects, but don't delete
+ // root window itself yet because the stak may be using it.
+ controller->Shutdown();
+ MessageLoop::current()->DeleteSoon(FROM_HERE, controller);
}
}
@@ -357,4 +377,8 @@ void DisplayController::UpdateDisplayBoundsForLayout() {
secondary_display->UpdateWorkAreaFromInsets(insets);
}
+void DisplayController::NotifyDisplayConfigurationChanging() {
+ FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging());
+}
+
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698