diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 18:16:43 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 18:16:43 +0000 |
commit | d0064727f1a2a6b01e693ae956553a9b9f52d22c (patch) | |
tree | d1becfbbdc45df788f4cbb25bd3d247836b4fdae /ash | |
parent | 48d36b1d7f0eed6dcc5bbb4b3f10680ab37cd167 (diff) | |
download | chromium_src-d0064727f1a2a6b01e693ae956553a9b9f52d22c.zip chromium_src-d0064727f1a2a6b01e693ae956553a9b9f52d22c.tar.gz chromium_src-d0064727f1a2a6b01e693ae956553a9b9f52d22c.tar.bz2 |
Move mirror detection to DisplayManager
Remove obsolete code
Add tests for mirror & display names
TBR=mpcomplete@chromium.org,jamescook@chromium.org
BUG=none
TEST=covered by test
Review URL: https://codereview.chromium.org/12803005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/display/display_change_observer_x11.cc | 14 | ||||
-rw-r--r-- | ash/display/display_manager.cc | 47 | ||||
-rw-r--r-- | ash/display/display_manager.h | 17 | ||||
-rw-r--r-- | ash/display/display_manager_unittest.cc | 52 | ||||
-rw-r--r-- | ash/extended_desktop_unittest.cc | 2 | ||||
-rw-r--r-- | ash/wm/window_cycle_controller_unittest.cc | 2 |
6 files changed, 97 insertions, 37 deletions
diff --git a/ash/display/display_change_observer_x11.cc b/ash/display/display_change_observer_x11.cc index 1bbccaf..3f3f9bb 100644 --- a/ash/display/display_change_observer_x11.cc +++ b/ash/display/display_change_observer_x11.cc @@ -48,10 +48,6 @@ XRRModeInfo* FindMode(XRRScreenResources* screen_resources, XID current_mode) { return NULL; } -bool CompareDisplayY(const DisplayInfo& lhs, const DisplayInfo& rhs) { - return lhs.bounds_in_pixel().y() < rhs.bounds_in_pixel().y(); -} - // A list of bogus sizes in mm that X detects and should be ignored. // See crbug.com/136533. const unsigned long kInvalidDisplaySizeList[][2] = { @@ -145,7 +141,6 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() { } std::vector<DisplayInfo> displays; - std::set<int> y_coords; std::set<int64> ids; for (int output_index = 0; output_index < screen_resources->noutput; output_index++) { @@ -168,9 +163,6 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() { << output_index; continue; } - // Mirrored monitors have the same y coordinates. - if (y_coords.find(crtc_info->y) != y_coords.end()) - continue; float device_scale_factor = 1.0f; if (!ShouldIgnoreSize(output_info) && @@ -204,8 +196,6 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() { displays.push_back(DisplayInfo(id, name, has_overscan)); displays.back().set_device_scale_factor(device_scale_factor); displays.back().SetBounds(display_bounds); - - y_coords.insert(crtc_info->y); } // Free all allocated resources. @@ -215,10 +205,6 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() { } XRRFreeScreenResources(screen_resources); - // PowerManager lays out the outputs vertically. Sort them by Y - // coordinates. - std::sort(displays.begin(), displays.end(), CompareDisplayY); - // DisplayManager can be null during the boot. Shell::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays); } diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc index 8ac1c58..b0d43db 100644 --- a/ash/display/display_manager.cc +++ b/ash/display/display_manager.cc @@ -4,6 +4,7 @@ #include "ash/display/display_manager.h" +#include <set> #include <string> #include <vector> @@ -82,6 +83,8 @@ DEFINE_WINDOW_PROPERTY_KEY(int64, kDisplayIdKey, DisplayManager::DisplayManager() : first_display_id_(gfx::Display::kInvalidDisplayID), + mirrored_display_id_(gfx::Display::kInvalidDisplayID), + num_connected_displays_(0), force_bounds_changed_(false), change_display_upon_host_resize_(false) { #if defined(OS_CHROMEOS) @@ -204,17 +207,29 @@ void DisplayManager::OnNativeDisplaysChanged( return; } first_display_id_ = updated_displays[0].id(); - + std::set<int> y_coords; bool internal_display_connected = false; + num_connected_displays_ = updated_displays.size(); + mirrored_display_id_ = gfx::Display::kInvalidDisplayID; + DisplayInfoList new_display_info_list; for (DisplayInfoList::const_iterator iter = updated_displays.begin(); - iter != updated_displays.end() && !internal_display_connected; + iter != updated_displays.end(); ++iter) { - internal_display_connected = IsInternalDisplayId(iter->id()); - if (internal_display_connected) - internal_display_info_.reset(new DisplayInfo(*iter)); + if (!internal_display_connected) { + internal_display_connected = IsInternalDisplayId(iter->id()); + if (internal_display_connected) + internal_display_info_.reset(new DisplayInfo(*iter)); + } + // Mirrored monitors have the same y coordinates. + int y = iter->bounds_in_pixel().y(); + if (y_coords.find(y) != y_coords.end()) { + InsertAndUpdateDisplayInfo(*iter); + mirrored_display_id_ = iter->id(); + } else { + y_coords.insert(y); + new_display_info_list.push_back(*iter); + } } - DisplayInfoList new_display_info_list = updated_displays; - if (HasInternalDisplay() && !internal_display_connected) { if (!internal_display_info_.get()) { // TODO(oshima): Get has_custom value. @@ -225,8 +240,9 @@ void DisplayManager::OnNativeDisplaysChanged( internal_display_info_->SetBounds(gfx::Rect(0, 0, 800, 600)); } new_display_info_list.push_back(*internal_display_info_.get()); + // An internal display is always considered *connected*. + num_connected_displays_++; } - UpdateDisplays(new_display_info_list); } @@ -416,17 +432,15 @@ const DisplayInfo& DisplayManager::GetDisplayInfo( return iter->second; } -std::string DisplayManager::GetDisplayNameFor( - const gfx::Display& display) { - if (!display.is_valid()) +std::string DisplayManager::GetDisplayNameForId(int64 id) { + if (id == gfx::Display::kInvalidDisplayID) return l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); - std::map<int64, DisplayInfo>::const_iterator iter = - display_info_.find(display.id()); + std::map<int64, DisplayInfo>::const_iterator iter = display_info_.find(id); if (iter != display_info_.end() && !iter->second.name().empty()) return iter->second.name(); - return base::StringPrintf("Display %d", static_cast<int>(display.id())); + return base::StringPrintf("Display %d", static_cast<int>(id)); } void DisplayManager::OnRootWindowResized(const aura::RootWindow* root, @@ -457,6 +471,7 @@ void DisplayManager::Init() { if (displays_.empty()) AddDisplayFromSpec(std::string() /* default */); first_display_id_ = displays_[0].id(); + num_connected_displays_ = displays_.size(); } void DisplayManager::CycleDisplayImpl() { @@ -473,7 +488,7 @@ void DisplayManager::CycleDisplayImpl() { new_display_info_list.push_back(DisplayInfo::CreateFromSpec( StringPrintf("%d+%d-500x400", host_bounds.x(), host_bounds.bottom()))); } - OnNativeDisplaysChanged(new_display_info_list); + UpdateDisplays(new_display_info_list); } void DisplayManager::ScaleDisplayImpl() { @@ -486,7 +501,7 @@ void DisplayManager::ScaleDisplayImpl() { display_info.device_scale_factor() == 1.0f ? 2.0f : 1.0f); new_display_info_list.push_back(display_info); } - OnNativeDisplaysChanged(new_display_info_list); + UpdateDisplays(new_display_info_list); } gfx::Display& DisplayManager::FindDisplayForRootWindow( diff --git a/ash/display/display_manager.h b/ash/display/display_manager.h index f812be1..e154e6f 100644 --- a/ash/display/display_manager.h +++ b/ash/display/display_manager.h @@ -107,8 +107,16 @@ class ASH_EXPORT DisplayManager : public aura::RootWindowObserver { const gfx::Display* GetPrimaryDisplayCandidate() const; + // Returns the logical number of displays. This returns 1 + // when displays are mirrored. size_t GetNumDisplays() const; + // Returns the number of connected displays. This returns 2 + // when displays are mirrored. + size_t num_connected_displays() const { return num_connected_displays_; } + + int64 mirrored_display_id() const { return mirrored_display_id_; } + // Returns the display object nearest given |window|. const gfx::Display& GetDisplayNearestPoint( const gfx::Point& point) const; @@ -124,8 +132,8 @@ class ASH_EXPORT DisplayManager : public aura::RootWindowObserver { // Retuns the display info associated with |display|. const DisplayInfo& GetDisplayInfo(const gfx::Display& display) const; - // Returns the human-readable name for the display specified by |display|. - std::string GetDisplayNameFor(const gfx::Display& display); + // Returns the human-readable name for the display |id|. + std::string GetDisplayNameForId(int64 id); // RootWindowObserver overrides: virtual void OnRootWindowResized(const aura::RootWindow* root, @@ -174,8 +182,13 @@ class ASH_EXPORT DisplayManager : public aura::RootWindowObserver { int64 first_display_id_; + int64 mirrored_display_id_; + + // List of current active dispays. DisplayList displays_; + int num_connected_displays_; + // An internal display info cache used when the internal display is // disconnectd. scoped_ptr<DisplayInfo> internal_display_info_; diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 8f945f1..2b53645 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc @@ -356,21 +356,25 @@ TEST_F(DisplayManagerTest, TestDeviceScaleOnlyChange) { } DisplayInfo CreateDisplayInfo(int64 id, const gfx::Rect& bounds) { - DisplayInfo info(id, std::string(), false); + DisplayInfo info(id, StringPrintf("x-%d", static_cast<int>(id)), false); info.SetBounds(bounds); return info; } TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { - const int64 internal_display_id = + const int internal_display_id = test::DisplayManagerTestApi(display_manager()). SetFirstDisplayAsInternalDisplay(); + const int64 invalid_id = gfx::Display::kInvalidDisplayID; const DisplayInfo native_display_info = CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 500, 500)); const DisplayInfo external_display_info = CreateDisplayInfo(10, gfx::Rect(1, 1, 100, 100)); + const DisplayInfo mirrored_display_info = + CreateDisplayInfo(11, gfx::Rect(0, 0, 500, 500)); EXPECT_EQ(1U, display_manager()->GetNumDisplays()); + EXPECT_EQ(1U, display_manager()->num_connected_displays()); std::string default_bounds = display_manager()->GetDisplayAt(0)->bounds().ToString(); @@ -380,6 +384,8 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { EXPECT_EQ(1U, display_manager()->GetNumDisplays()); EXPECT_EQ(default_bounds, display_manager()->GetDisplayAt(0)->bounds().ToString()); + EXPECT_EQ(1U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // External connected while primary was disconnected. display_info_list.push_back(external_display_info); @@ -390,6 +396,8 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { FindDisplayForId(internal_display_id).bounds().ToString()); EXPECT_EQ("1,1 100x100", FindDisplayInfoForId(10).bounds_in_pixel().ToString()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // Primary connected, with different bounds. display_info_list.clear(); @@ -401,6 +409,10 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { FindDisplayForId(internal_display_id).bounds().ToString()); EXPECT_EQ("1,1 100x100", FindDisplayInfoForId(10).bounds_in_pixel().ToString()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); + EXPECT_EQ(StringPrintf("x-%d", internal_display_id), + display_manager()->GetDisplayNameForId(internal_display_id)); // Turn off primary. display_info_list.clear(); @@ -411,6 +423,8 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { FindDisplayForId(internal_display_id).bounds().ToString()); EXPECT_EQ("1,1 100x100", FindDisplayInfoForId(10).bounds_in_pixel().ToString()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // Emulate suspend. display_info_list.clear(); @@ -420,6 +434,10 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { FindDisplayForId(internal_display_id).bounds().ToString()); EXPECT_EQ("1,1 100x100", FindDisplayInfoForId(10).bounds_in_pixel().ToString()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); + EXPECT_EQ(StringPrintf("x-%d", internal_display_id), + display_manager()->GetDisplayNameForId(internal_display_id)); // External display has disconnected then resumed. display_info_list.push_back(native_display_info); @@ -427,22 +445,50 @@ TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) { EXPECT_EQ(1U, display_manager()->GetNumDisplays()); EXPECT_EQ("0,0 500x500", FindDisplayForId(internal_display_id).bounds().ToString()); + EXPECT_EQ(1U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // External display was changed during suspend. display_info_list.push_back(external_display_info); display_manager()->OnNativeDisplaysChanged(display_info_list); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // suspend... display_info_list.clear(); display_manager()->OnNativeDisplaysChanged(display_info_list); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); // and resume with different external display. display_info_list.push_back(native_display_info); - display_info_list.push_back(CreateDisplayInfo(11, gfx::Rect(1, 1, 100, 100))); + display_info_list.push_back(CreateDisplayInfo(12, gfx::Rect(1, 1, 100, 100))); display_manager()->OnNativeDisplaysChanged(display_info_list); EXPECT_EQ(2U, display_manager()->GetNumDisplays()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(invalid_id, display_manager()->mirrored_display_id()); + + // mirrored... + display_info_list.clear(); + display_info_list.push_back(native_display_info); + display_info_list.push_back(mirrored_display_info); + display_manager()->OnNativeDisplaysChanged(display_info_list); + EXPECT_EQ(1U, display_manager()->GetNumDisplays()); + EXPECT_EQ("0,0 500x500", + FindDisplayForId(internal_display_id).bounds().ToString()); + EXPECT_EQ(2U, display_manager()->num_connected_displays()); + EXPECT_EQ(11U, display_manager()->mirrored_display_id()); + + // Test display name. + EXPECT_EQ(StringPrintf("x-%d", internal_display_id), + display_manager()->GetDisplayNameForId(internal_display_id)); + EXPECT_EQ("x-10", display_manager()->GetDisplayNameForId(10)); + EXPECT_EQ("x-11", display_manager()->GetDisplayNameForId(11)); + EXPECT_EQ("x-12", display_manager()->GetDisplayNameForId(12)); + // Default name for the id that doesn't exist. + EXPECT_EQ("Display 100", display_manager()->GetDisplayNameForId(100)); } #if defined(OS_WIN) diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc index 45d01ed..941e83b 100644 --- a/ash/extended_desktop_unittest.cc +++ b/ash/extended_desktop_unittest.cc @@ -252,7 +252,7 @@ TEST_F(ExtendedDesktopTest, TestCursor) { } TEST_F(ExtendedDesktopTest, TestCursorLocation) { - UpdateDisplay("0+0-1000x600,1001+0-600x400"); + UpdateDisplay("1000x600,600x400"); Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); aura::test::WindowTestApi root_window0_test_api(root_windows[0]); aura::test::WindowTestApi root_window1_test_api(root_windows[1]); diff --git a/ash/wm/window_cycle_controller_unittest.cc b/ash/wm/window_cycle_controller_unittest.cc index 54b7891..fabd9d9 100644 --- a/ash/wm/window_cycle_controller_unittest.cc +++ b/ash/wm/window_cycle_controller_unittest.cc @@ -329,7 +329,7 @@ TEST_F(WindowCycleControllerTest, AlwaysOnTopMultiWindow) { TEST_F(WindowCycleControllerTest, MAYBE_AlwaysOnTopMultipleRootWindows) { // Set up a second root window - UpdateDisplay("0+0-1000x600,1001+0-600x400"); + UpdateDisplay("1000x600,600x400"); Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); ASSERT_EQ(2U, root_windows.size()); |