0

Ignore UI scaling when internal display isn't active (in docked mode, for example)

BUG=534171
R=mukai@chromium.org

Review URL: https://codereview.chromium.org/1361763003

Cr-Commit-Position: refs/heads/master@{#350276}
This commit is contained in:
oshima
2015-09-22 17:29:42 -07:00
committed by Commit bot
parent 1a55644c5b
commit 13ee7b8486
4 changed files with 60 additions and 1 deletions

@ -870,6 +870,13 @@ size_t DisplayManager::GetNumDisplays() const {
return active_display_list_.size();
}
bool DisplayManager::IsActiveDisplayId(int64 display_id) const {
return std::find_if(active_display_list_.begin(), active_display_list_.end(),
[display_id](const gfx::Display& display) {
return display.id() == display_id;
}) != active_display_list_.end();
}
bool DisplayManager::IsInMirrorMode() const {
return mirroring_display_id_ != gfx::Display::kInvalidDisplayID;
}

@ -240,6 +240,10 @@ class ASH_EXPORT DisplayManager
return active_display_list_;
}
// Returns true if the display specified by |display_id| is currently
// connected and active. (mirroring display isn't active, for example).
bool IsActiveDisplayId(int64 display_id) const;
// Returns the number of connected displays. This returns 2
// when displays are mirrored.
size_t num_connected_displays() const { return num_connected_displays_; }

@ -1792,6 +1792,47 @@ TEST_F(DisplayManagerTest, UnifiedWithDockWindows) {
EXPECT_EQ("0,0 250x253", docked->bounds().ToString());
}
TEST_F(DisplayManagerTest, DockMode) {
if (!SupportsMultipleDisplays())
return;
const int64 internal_id = 1;
const int64 external_id = 2;
const DisplayInfo internal_display_info =
CreateDisplayInfo(internal_id, gfx::Rect(0, 0, 500, 500));
const DisplayInfo external_display_info =
CreateDisplayInfo(external_id, gfx::Rect(1, 1, 100, 100));
std::vector<DisplayInfo> display_info_list;
// software mirroring.
display_info_list.push_back(internal_display_info);
display_info_list.push_back(external_display_info);
display_manager()->OnNativeDisplaysChanged(display_info_list);
const int64 internal_display_id =
test::DisplayManagerTestApi().SetFirstDisplayAsInternalDisplay();
EXPECT_EQ(internal_id, internal_display_id);
display_info_list.clear();
display_info_list.push_back(external_display_info);
display_manager()->OnNativeDisplaysChanged(display_info_list);
EXPECT_EQ(1U, display_manager()->active_display_list().size());
EXPECT_TRUE(display_manager()->IsActiveDisplayId(external_id));
EXPECT_FALSE(display_manager()->IsActiveDisplayId(internal_id));
const DisplayInfo& info = display_manager()->GetDisplayInfo(internal_id);
DisplayMode mode;
EXPECT_FALSE(GetDisplayModeForNextUIScale(info, true, &mode));
EXPECT_FALSE(GetDisplayModeForNextUIScale(info, false, &mode));
EXPECT_FALSE(SetDisplayUIScale(internal_id, 1.0f));
DisplayInfo invalid_info;
EXPECT_FALSE(GetDisplayModeForNextUIScale(invalid_info, true, &mode));
EXPECT_FALSE(GetDisplayModeForNextUIScale(invalid_info, false, &mode));
EXPECT_FALSE(SetDisplayUIScale(gfx::Display::kInvalidDisplayID, 1.0f));
}
class ScreenShutdownTest : public test::AshTestBase {
public:
ScreenShutdownTest() {

@ -173,8 +173,11 @@ bool GetDisplayModeForResolution(const DisplayInfo& info,
bool GetDisplayModeForNextUIScale(const DisplayInfo& info,
bool up,
DisplayMode* out) {
if (!gfx::Display::IsInternalDisplayId(info.id()))
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
if (!display_manager->IsActiveDisplayId(info.id()) ||
!gfx::Display::IsInternalDisplayId(info.id())) {
return false;
}
const std::vector<DisplayMode>& modes = info.display_modes();
ScaleComparator comparator(info.configured_ui_scale());
auto iter = std::find_if(modes.begin(), modes.end(), comparator);
@ -201,6 +204,10 @@ bool GetDisplayModeForNextResolution(const DisplayInfo& info,
bool SetDisplayUIScale(int64 id, float ui_scale) {
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
if (!display_manager->IsActiveDisplayId(id) ||
!gfx::Display::IsInternalDisplayId(id)) {
return false;
}
const DisplayInfo& info = display_manager->GetDisplayInfo(id);
DisplayMode mode;
if (!GetDisplayModeForUIScale(info, ui_scale, &mode))