diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 17:54:43 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 17:54:43 +0000 |
commit | 4ef14de573bc757bb7d4043963c9d64f4c74439b (patch) | |
tree | d9120c98923122ba0e166d0f8f79827139ef3fe6 /ash/display/display_controller.cc | |
parent | a27ef629458d52f24a7c5ee50eb9bb01fbfcecfd (diff) | |
download | chromium_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.cc | 44 |
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 |