summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 22:05:02 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 22:05:02 +0000
commit417dc26d8fa131c514a823321ced1d213ca6498e (patch)
tree3fb9dbd528dadf7e683265c7e14b3178f6c19587 /ash
parent96eb4190c6003716b9995dd86b4b84550b0bafb3 (diff)
downloadchromium_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.cc33
-rw-r--r--ash/display/display_controller.h4
-rw-r--r--ash/display/display_manager_unittest.cc17
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();