Chromium Code Reviews| Index: ash/display/display_manager.cc |
| diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc |
| index 07d44155fa6ccdd1ad4a6e89b7d7939a69455f5e..d771657fd1fadf7de1863878de33aaa880509821 100644 |
| --- a/ash/display/display_manager.cc |
| +++ b/ash/display/display_manager.cc |
| @@ -4,6 +4,7 @@ |
| #include "ash/display/display_manager.h" |
| +#include <algorithm> |
| #include <cmath> |
| #include <set> |
| #include <string> |
| @@ -81,12 +82,6 @@ struct DisplayInfoSortFunctor { |
| } |
| }; |
| -struct DisplayModeMatcher { |
| - DisplayModeMatcher(const gfx::Size& size) : size(size) {} |
| - bool operator()(const DisplayMode& mode) { return mode.size == size; } |
| - gfx::Size size; |
| -}; |
| - |
| struct ScaleComparator { |
| explicit ScaleComparator(float s) : scale(s) {} |
| @@ -429,6 +424,7 @@ void DisplayManager::SetDisplayUIScale(int64 display_id, |
| return; |
| } |
| + // TODO(mukai): merge this implementation into SetDisplayMode(). |
| DisplayInfoList display_info_list; |
| for (DisplayList::const_iterator iter = displays_.begin(); |
| iter != displays_.end(); ++iter) { |
| @@ -458,8 +454,10 @@ void DisplayManager::SetDisplayResolution(int64 display_id, |
| const DisplayInfo& display_info = GetDisplayInfo(display_id); |
| const std::vector<DisplayMode>& modes = display_info.display_modes(); |
| DCHECK_NE(0u, modes.size()); |
| + DisplayMode target_mode; |
| + target_mode.size = resolution; |
| std::vector<DisplayMode>::const_iterator iter = |
| - std::find_if(modes.begin(), modes.end(), DisplayModeMatcher(resolution)); |
| + std::find(modes.begin(), modes.end(), target_mode); |
| if (iter == modes.end()) { |
| LOG(WARNING) << "Unsupported resolution was requested:" |
| << resolution.ToString(); |
| @@ -472,6 +470,49 @@ void DisplayManager::SetDisplayResolution(int64 display_id, |
| #endif |
| } |
| +bool DisplayManager::SetDisplayMode(int64 display_id, |
| + const DisplayMode& display_mode) { |
| + if (IsInternalDisplayId(display_id)) { |
| + SetDisplayUIScale(display_id, display_mode.ui_scale); |
| + return false; |
| + } |
| + |
| + DisplayInfoList display_info_list; |
| + bool display_property_changed = false; |
| + bool resolution_changed = false; |
| + for (DisplayList::const_iterator iter = displays_.begin(); |
| + iter != displays_.end(); ++iter) { |
| + DisplayInfo info = GetDisplayInfo(iter->id()); |
| + if (info.id() == display_id) { |
| + const std::vector<DisplayMode>& modes = info.display_modes(); |
| + std::vector<DisplayMode>::const_iterator iter = |
| + std::find(modes.begin(), modes.end(), display_mode); |
| + if (iter == modes.end()) { |
| + LOG(WARNING) << "Unsupported resolution was requested:" |
| + << display_mode.size.ToString(); |
| + return false; |
| + } |
| + display_modes_[display_id] = *iter; |
| + if (info.bounds_in_native().size() != display_mode.size) |
| + resolution_changed = true; |
| + if (info.device_scale_factor() != display_mode.device_scale_factor) { |
| + info.set_device_scale_factor(display_mode.device_scale_factor); |
| + display_property_changed = true; |
| + } |
| + } |
| + display_info_list.push_back(info); |
| + } |
| + if (display_property_changed) { |
| + AddMirrorDisplayInfoIfAny(&display_info_list); |
| + UpdateDisplays(display_info_list); |
| + } |
| +#if defined(OS_CHROMEOS) |
| + if (resolution_changed && base::SysInfo::IsRunningOnChromeOS()) |
| + Shell::GetInstance()->display_configurator()->OnConfigurationChanged(); |
| +#endif |
| + return resolution_changed; |
| +} |
| + |
| void DisplayManager::RegisterDisplayProperty( |
| int64 display_id, |
| gfx::Display::Rotation rotation, |
| @@ -497,6 +538,28 @@ void DisplayManager::RegisterDisplayProperty( |
| } |
| } |
| +DisplayMode DisplayManager::GetActiveModeForDisplayId(int64 display_id) const { |
| + DisplayMode selected_mode; |
| + if (GetSelectedModeForDisplayId(display_id, &selected_mode)) |
| + return selected_mode; |
| + |
|
oshima
2014/07/31 02:16:52
can you add comment that this is looking for "defa
Jun Mukai
2014/07/31 04:57:52
Done.
|
| + const DisplayInfo& info = GetDisplayInfo(display_id); |
| + const std::vector<DisplayMode>& display_modes = info.display_modes(); |
| + |
| + if (IsInternalDisplayId(display_id)) { |
| + for (size_t i = 0; i < display_modes.size(); ++i) { |
| + if (info.configured_ui_scale() == display_modes[i].ui_scale) |
|
oshima
2014/07/31 02:16:52
I believe the ui scale should always be 1.0f in th
Jun Mukai
2014/07/31 04:57:52
This case, ui scale comes from the pref store, can
oshima
2014/07/31 18:52:37
Discussed offline and understood the issue. please
Jun Mukai
2014/07/31 20:32:50
Done.
|
| + return display_modes[i]; |
| + } |
| + } else { |
| + for (size_t i = 0; i < display_modes.size(); ++i) { |
| + if (display_modes[i].native) |
| + return display_modes[i]; |
| + } |
| + } |
| + return selected_mode; |
| +} |
| + |
| bool DisplayManager::GetSelectedModeForDisplayId(int64 id, |
| DisplayMode* mode_out) const { |
| std::map<int64, DisplayMode>::const_iterator iter = display_modes_.find(id); |
| @@ -597,15 +660,16 @@ void DisplayManager::OnNativeDisplaysChanged( |
| new_display_info_list.push_back(*iter); |
| } |
| - const gfx::Size& resolution = iter->bounds_in_native().size(); |
| + DisplayMode new_mode; |
| + new_mode.size = iter->bounds_in_native().size(); |
| + new_mode.device_scale_factor = iter->device_scale_factor(); |
| + new_mode.ui_scale = iter->configured_ui_scale(); |
| const std::vector<DisplayMode>& display_modes = iter->display_modes(); |
| // This is empty the displays are initialized from InitFromCommandLine. |
| if (!display_modes.size()) |
| continue; |
| std::vector<DisplayMode>::const_iterator display_modes_iter = |
| - std::find_if(display_modes.begin(), |
| - display_modes.end(), |
| - DisplayModeMatcher(resolution)); |
| + std::find(display_modes.begin(), display_modes.end(), new_mode); |
| // Update the actual resolution selected as the resolution request may fail. |
| if (display_modes_iter == display_modes.end()) |
| display_modes_.erase(iter->id()); |