summaryrefslogtreecommitdiffstats
path: root/ash/display/display_controller.cc
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-10 17:54:43 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-10 17:54:43 +0000
commit4ef14de573bc757bb7d4043963c9d64f4c74439b (patch)
treed9120c98923122ba0e166d0f8f79827139ef3fe6 /ash/display/display_controller.cc
parenta27ef629458d52f24a7c5ee50eb9bb01fbfcecfd (diff)
downloadchromium_src-4ef14de573bc757bb7d4043963c9d64f4c74439b.zip
chromium_src-4ef14de573bc757bb7d4043963c9d64f4c74439b.tar.gz
chromium_src-4ef14de573bc757bb7d4043963c9d64f4c74439b.tar.bz2
Cancel drag if display configuration changes.
* Removed debug specific shortcut to emulate display change. * fixed ui_controls to use the correct position * a few minor clean ups (removing unnecessary namesapce, rename Monitor -> Display) BUG=14457 TEST=covered by test Review URL: https://chromiumcodereview.appspot.com/10909043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155762 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/display/display_controller.cc')
-rw-r--r--ash/display/display_controller.cc44
1 files changed, 34 insertions, 10 deletions
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc
index 16ee88c..5cc96e7 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