diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 22:05:02 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 22:05:02 +0000 |
commit | 417dc26d8fa131c514a823321ced1d213ca6498e (patch) | |
tree | 3fb9dbd528dadf7e683265c7e14b3178f6c19587 /ash | |
parent | 96eb4190c6003716b9995dd86b4b84550b0bafb3 (diff) | |
download | chromium_src-417dc26d8fa131c514a823321ced1d213ca6498e.zip chromium_src-417dc26d8fa131c514a823321ced1d213ca6498e.tar.gz chromium_src-417dc26d8fa131c514a823321ced1d213ca6498e.tar.bz2 |
Temporarily remember the primary root window while replacing the display.
|root_windows_| map becomes empty while replacing display.
This CL remembers the primary root window temporarily and
use it when the display is added.
This is a bit ugly but less risky to merge to 25 branch.
For 26, I'll refactor and add "replace" protocol to
DisplayObserver.
BUG=166673
TEST=covered by test
Review URL: https://chromiumcodereview.appspot.com/11644012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174008 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/display/display_controller.cc | 33 | ||||
-rw-r--r-- | ash/display/display_controller.h | 4 | ||||
-rw-r--r-- | ash/display/display_manager_unittest.cc | 17 |
3 files changed, 46 insertions, 8 deletions
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc index 2fce25a..940ce88 100644 --- a/ash/display/display_controller.cc +++ b/ash/display/display_controller.cc @@ -161,7 +161,8 @@ void DisplayLayout::RegisterJSONConverter( } DisplayController::DisplayController() - : desired_primary_display_id_(gfx::Display::kInvalidDisplayID) { + : desired_primary_display_id_(gfx::Display::kInvalidDisplayID), + primary_root_window_for_replace_(NULL) { // Reset primary display to make sure that tests don't use // stale display info from previous tests. primary_display_id = gfx::Display::kInvalidDisplayID; @@ -467,14 +468,23 @@ void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { } void DisplayController::OnDisplayAdded(const gfx::Display& display) { - DCHECK(!root_windows_.empty()); NotifyDisplayConfigurationChanging(); - aura::RootWindow* root = AddRootWindowForDisplay(display); - UpdateDisplayBoundsForLayout(); - if (desired_primary_display_id_ == display.id()) - SetPrimaryDisplay(display); - - Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); + if (primary_root_window_for_replace_) { + DCHECK(root_windows_.empty()); + primary_display_id = display.id(); + root_windows_[display.id()] = primary_root_window_for_replace_; + primary_root_window_for_replace_->SetProperty( + internal::kDisplayIdKey, display.id()); + primary_root_window_for_replace_ = NULL; + UpdateDisplayBoundsForLayout(); + } else { + DCHECK(!root_windows_.empty()); + aura::RootWindow* root = AddRootWindowForDisplay(display); + UpdateDisplayBoundsForLayout(); + if (desired_primary_display_id_ == display.id()) + SetPrimaryDisplay(display); + Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); + } } void DisplayController::OnDisplayRemoved(const gfx::Display& display) { @@ -489,6 +499,13 @@ void DisplayController::OnDisplayRemoved(const gfx::Display& display) { // When the primary root window's display is removed, move the primary // root to the other display. if (primary_display_id == display.id()) { + // Temporarily store the primary root window in + // |primary_root_window_for_replace_| when replacing the display. + if (root_windows_.size() == 0) { + primary_display_id = gfx::Display::kInvalidDisplayID; + primary_root_window_for_replace_ = root_to_delete; + return; + } DCHECK_EQ(1U, root_windows_.size()); primary_display_id = GetSecondaryDisplay()->id(); aura::RootWindow* primary_root = root_to_delete; diff --git a/ash/display/display_controller.h b/ash/display/display_controller.h index 67df6d3..22d92bd 100644 --- a/ash/display/display_controller.h +++ b/ash/display/display_controller.h @@ -181,6 +181,10 @@ class ASH_EXPORT DisplayController : public gfx::DisplayObserver { ObserverList<Observer> observers_; + // Store the primary root window temporarily while replacing + // display. + aura::RootWindow* primary_root_window_for_replace_; + DISALLOW_COPY_AND_ASSIGN(DisplayController); }; diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index ddd20cf..b43944b 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc @@ -392,6 +392,23 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { EXPECT_EQ(2U, display_manager()->GetNumDisplays()); } +TEST_F(DisplayManagerTest, TestNativeDisplaysChangedNoInternal) { + EXPECT_EQ(1U, display_manager()->GetNumDisplays()); + + // Don't change the display info if all displays are disconnected. + std::vector<gfx::Display> displays; + display_manager()->OnNativeDisplaysChanged(displays); + EXPECT_EQ(1U, display_manager()->GetNumDisplays()); + + // Connect another display which will become primary. + const gfx::Display external_display(10, gfx::Rect(1, 1, 100, 100)); + displays.push_back(external_display); + display_manager()->OnNativeDisplaysChanged(displays); + EXPECT_EQ(1U, display_manager()->GetNumDisplays()); + EXPECT_EQ("1,1 100x100", + FindDisplayForId(10).bounds_in_pixel().ToString()); +} + TEST_F(DisplayManagerTest, EnsurePointerInDisplays) { UpdateDisplay("200x200,300x300"); Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |