summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-14 18:16:43 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-14 18:16:43 +0000
commitd0064727f1a2a6b01e693ae956553a9b9f52d22c (patch)
treed1becfbbdc45df788f4cbb25bd3d247836b4fdae /ash
parent48d36b1d7f0eed6dcc5bbb4b3f10680ab37cd167 (diff)
downloadchromium_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.cc14
-rw-r--r--ash/display/display_manager.cc47
-rw-r--r--ash/display/display_manager.h17
-rw-r--r--ash/display/display_manager_unittest.cc52
-rw-r--r--ash/extended_desktop_unittest.cc2
-rw-r--r--ash/wm/window_cycle_controller_unittest.cc2
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());