| Index: ash/display/display_manager.cc
|
| diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
|
| index 241f93c13adad4c334e6c7d07d82049453c26e43..c85d2def76ffc7bdede822e9154ec1e50f36ad2a 100644
|
| --- a/ash/display/display_manager.cc
|
| +++ b/ash/display/display_manager.cc
|
| @@ -8,6 +8,7 @@
|
| #include <cmath>
|
| #include <set>
|
| #include <string>
|
| +#include <utility>
|
| #include <vector>
|
|
|
| #include "ash/ash_switches.h"
|
| @@ -110,6 +111,15 @@ void MaybeInitInternalDisplay(DisplayInfo* info) {
|
| }
|
| }
|
|
|
| +gfx::Size GetMaxNativeSize(const DisplayInfo& info) {
|
| + gfx::Size size;
|
| + for (auto& mode : info.display_modes()) {
|
| + if (mode.size.GetArea() > size.GetArea())
|
| + size = mode.size;
|
| + }
|
| + return size;
|
| +}
|
| +
|
| } // namespace
|
|
|
| using std::string;
|
| @@ -453,17 +463,13 @@ DisplayMode DisplayManager::GetActiveModeForDisplayId(int64 display_id) const {
|
| // restored mode to |display_mode_|, so it needs to look up the mode whose
|
| // UI-scale value matches. See the TODO in RegisterDisplayProperty().
|
| const DisplayInfo& info = GetDisplayInfo(display_id);
|
| - const std::vector<DisplayMode>& display_modes = info.display_modes();
|
|
|
| - if (GetDisplayIdForUIScaling() == display_id) {
|
| - for (size_t i = 0; i < display_modes.size(); ++i) {
|
| - if (info.configured_ui_scale() == display_modes[i].ui_scale)
|
| - return display_modes[i];
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < display_modes.size(); ++i) {
|
| - if (display_modes[i].native)
|
| - return display_modes[i];
|
| + for (auto& mode : info.display_modes()) {
|
| + if (GetDisplayIdForUIScaling() == display_id) {
|
| + if (info.configured_ui_scale() == mode.ui_scale)
|
| + return mode;
|
| + } else if (mode.native) {
|
| + return mode;
|
| }
|
| }
|
| return selected_mode;
|
| @@ -1114,11 +1120,19 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(
|
|
|
| // 1st Pass. Find the max size.
|
| int max_height = std::numeric_limits<int>::min();
|
| - for (auto& info : *display_info_list)
|
| +
|
| + int default_height = 0;
|
| + float default_device_scale_factor = 1.0f;
|
| + for (auto& info : *display_info_list) {
|
| max_height = std::max(max_height, info.size_in_pixel().height());
|
| + if (!default_height || gfx::Display::IsInternalDisplayId(info.id())) {
|
| + default_height = info.size_in_pixel().height();
|
| + default_device_scale_factor = info.device_scale_factor();
|
| + }
|
| + }
|
|
|
| std::vector<DisplayMode> display_mode_list;
|
| - std::set<float> scales;
|
| + std::set<std::pair<float, float>> dsf_scale_list;
|
|
|
| // 2nd Pass. Compute the unified display size.
|
| for (auto& info : *display_info_list) {
|
| @@ -1131,20 +1145,34 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(
|
| info.id(), origin, 1.0f / scale);
|
| unified_bounds.Union(display.bounds());
|
|
|
| - scales.insert(scale);
|
| + dsf_scale_list.insert(
|
| + std::make_pair(info.device_scale_factor(), scale));
|
| }
|
|
|
| DisplayInfo info(kUnifiedDisplayId, "Unified Desktop", false);
|
| - info.SetBounds(unified_bounds);
|
|
|
| DisplayMode native_mode(unified_bounds.size(), 60.0f, false, true);
|
| - info.SetDisplayModes(CreateUnifiedDisplayModeList(native_mode, scales));
|
| + std::vector<DisplayMode> modes =
|
| + CreateUnifiedDisplayModeList(native_mode, dsf_scale_list);
|
| +
|
| + // Find the default mode.
|
| + auto iter = std::find_if(
|
| + modes.begin(), modes.end(),
|
| + [default_height,
|
| + default_device_scale_factor](const DisplayMode& mode) {
|
| + return mode.size.height() == default_height &&
|
| + mode.device_scale_factor == default_device_scale_factor;
|
| + });
|
| + iter->native = true;
|
| + info.SetDisplayModes(modes);
|
| + info.set_device_scale_factor(iter->device_scale_factor);
|
| + info.SetBounds(gfx::Rect(iter->size));
|
|
|
| // Forget the configured resolution if the original unified
|
| // desktop resolution has changed.
|
| if (display_info_.count(kUnifiedDisplayId) != 0 &&
|
| - display_info_[kUnifiedDisplayId].size_in_pixel() !=
|
| - info.size_in_pixel()) {
|
| + GetMaxNativeSize(display_info_[kUnifiedDisplayId]) !=
|
| + unified_bounds.size()) {
|
| display_modes_.erase(kUnifiedDisplayId);
|
| }
|
|
|
| @@ -1153,7 +1181,7 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(
|
| DisplayMode mode;
|
| if (GetSelectedModeForDisplayId(kUnifiedDisplayId, &mode) &&
|
| FindDisplayMode(info, mode) != info.display_modes().end()) {
|
| - // TODO(oshima): device scale factor.
|
| + info.set_device_scale_factor(mode.device_scale_factor);
|
| info.SetBounds(gfx::Rect(mode.size));
|
| } else {
|
| display_modes_.erase(kUnifiedDisplayId);
|
|
|