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:
@ -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))
|
||||
|
Reference in New Issue
Block a user