Index: ash/display/display_change_observer_chromeos.cc |
diff --git a/ash/display/display_change_observer_chromeos.cc b/ash/display/display_change_observer_chromeos.cc |
index 7c5780ec639259df80a29f85ee6698482fa9985f..4e735f070be2f3e248edd048c193fb377b3806ec 100644 |
--- a/ash/display/display_change_observer_chromeos.cc |
+++ b/ash/display/display_change_observer_chromeos.cc |
@@ -37,46 +37,52 @@ const unsigned int kHighDensityDPIThreshold = 160; |
// 1 inch in mm. |
const float kInchInMm = 25.4f; |
-// Resolution list are sorted by the area in pixels and the larger |
-// one comes first. |
-struct ResolutionSorter { |
- bool operator()(const Resolution& a, const Resolution& b) { |
- return a.size.width() * a.size.height() > b.size.width() * b.size.height(); |
+// Display mode list is sorted by (in descending priority): |
+// * the area in pixels. |
+// * refresh rate. |
+struct DisplayModeSorter { |
+ bool operator()(const DisplayMode& a, const DisplayMode& b) { |
+ if (a.size.GetArea() == b.size.GetArea()) |
+ return (a.refresh_rate > b.refresh_rate); |
+ return (a.size.GetArea() > b.size.GetArea()); |
} |
}; |
} // namespace |
// static |
-std::vector<Resolution> DisplayChangeObserver::GetResolutionList( |
+std::vector<DisplayMode> DisplayChangeObserver::GetDisplayModeList( |
const OutputConfigurator::OutputSnapshot& output) { |
- typedef std::map<std::pair<int,int>, Resolution> ResolutionMap; |
- ResolutionMap resolution_map; |
+ typedef std::map<std::pair<int, int>, DisplayMode> DisplayModeMap; |
+ DisplayModeMap display_mode_map; |
for (std::map<RRMode, OutputConfigurator::ModeInfo>::const_iterator it = |
output.mode_infos.begin(); it != output.mode_infos.end(); ++it) { |
const OutputConfigurator::ModeInfo& mode_info = it->second; |
const std::pair<int, int> size(mode_info.width, mode_info.height); |
- const Resolution resolution(gfx::Size(mode_info.width, mode_info.height), |
- mode_info.interlaced); |
- |
- // Add the resolution if it isn't already present and override interlaced |
- // resolutions with non-interlaced ones. |
- ResolutionMap::iterator resolution_it = resolution_map.find(size); |
- if (resolution_it == resolution_map.end()) |
- resolution_map.insert(std::make_pair(size, resolution)); |
- else if (resolution_it->second.interlaced && !resolution.interlaced) |
- resolution_it->second = resolution; |
+ const DisplayMode display_mode(gfx::Size(mode_info.width, mode_info.height), |
+ mode_info.refresh_rate, |
+ mode_info.interlaced, |
+ output.native_mode == it->first); |
+ |
+ // Add the display mode if it isn't already present and override interlaced |
+ // display modes with non-interlaced ones. |
+ DisplayModeMap::iterator display_mode_it = display_mode_map.find(size); |
+ if (display_mode_it == display_mode_map.end()) |
+ display_mode_map.insert(std::make_pair(size, display_mode)); |
+ else if (display_mode_it->second.interlaced && !display_mode.interlaced) |
+ display_mode_it->second = display_mode; |
} |
- std::vector<Resolution> resolution_list; |
- for (ResolutionMap::const_iterator iter = resolution_map.begin(); |
- iter != resolution_map.end(); |
+ std::vector<DisplayMode> display_mode_list; |
+ for (DisplayModeMap::const_iterator iter = display_mode_map.begin(); |
+ iter != display_mode_map.end(); |
++iter) { |
- resolution_list.push_back(iter->second); |
+ display_mode_list.push_back(iter->second); |
} |
- std::sort(resolution_list.begin(), resolution_list.end(), ResolutionSorter()); |
- return resolution_list; |
+ std::sort( |
+ display_mode_list.begin(), display_mode_list.end(), DisplayModeSorter()); |
+ return display_mode_list; |
} |
DisplayChangeObserver::DisplayChangeObserver() { |
@@ -105,14 +111,13 @@ chromeos::OutputState DisplayChangeObserver::GetStateForDisplayIds( |
bool DisplayChangeObserver::GetResolutionForDisplayId(int64 display_id, |
int* width, |
int* height) const { |
- gfx::Size resolution; |
- if (!Shell::GetInstance()->display_manager()-> |
- GetSelectedResolutionForDisplayId(display_id, &resolution)) { |
+ DisplayMode mode; |
+ if (!Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( |
+ display_id, &mode)) |
return false; |
- } |
- *width = resolution.width(); |
- *height = resolution.height(); |
+ *width = mode.size.width(); |
+ *height = mode.size.height(); |
return true; |
} |
@@ -145,9 +150,7 @@ void DisplayChangeObserver::OnDisplayModeChanged( |
gfx::Rect display_bounds( |
output.x, output.y, mode_info->width, mode_info->height); |
- std::vector<Resolution> resolutions; |
- if (output.type != chromeos::OUTPUT_TYPE_INTERNAL) |
- resolutions = GetResolutionList(output); |
+ std::vector<DisplayMode> display_modes = GetDisplayModeList(output); |
std::string name = output.type == chromeos::OUTPUT_TYPE_INTERNAL ? |
l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) : |
@@ -167,7 +170,7 @@ void DisplayChangeObserver::OnDisplayModeChanged( |
displays.back().set_device_scale_factor(device_scale_factor); |
displays.back().SetBounds(display_bounds); |
displays.back().set_native(true); |
- displays.back().set_resolutions(resolutions); |
+ displays.back().set_display_modes(display_modes); |
displays.back().set_touch_support( |
output.touch_device_id == 0 ? gfx::Display::TOUCH_SUPPORT_UNAVAILABLE : |
gfx::Display::TOUCH_SUPPORT_AVAILABLE); |