Chromium Code Reviews| Index: chrome/browser/ui/webui/options/chromeos/display_options_handler.cc |
| diff --git a/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc |
| index 52a5e238d54b84717626fbb058d3b0412eea3455..589e28b1c8abfadc6362ee69a96f8e58c8ad47d0 100644 |
| --- a/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc |
| +++ b/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc |
| @@ -54,12 +54,6 @@ int64 GetDisplayId(const base::ListValue* args) { |
| return display_id; |
| } |
| -bool CompareDisplayMode(ash::DisplayMode d1, ash::DisplayMode d2) { |
| - if (d1.size.GetArea() == d2.size.GetArea()) |
| - return d1.refresh_rate < d2.refresh_rate; |
| - return d1.size.GetArea() < d2.size.GetArea(); |
| -} |
| - |
| base::string16 GetColorProfileName(ui::ColorCalibrationProfile profile) { |
| switch (profile) { |
| case ui::COLOR_PROFILE_STANDARD: |
| @@ -82,6 +76,69 @@ base::string16 GetColorProfileName(ui::ColorCalibrationProfile profile) { |
| return base::string16(); |
| } |
| +int GetIntOrDouble(const base::DictionaryValue* dict, |
| + const std::string& field) { |
| + double double_result = 0; |
| + if (dict->GetDouble(field, &double_result)) |
| + return static_cast<int>(double_result); |
| + |
| + int result = 0; |
| + dict->GetInteger(field, &result); |
| + return result; |
| +} |
| + |
| +bool GetFloat(const base::DictionaryValue* dict, |
| + const std::string& field, |
| + float* result) { |
| + double double_result = 0; |
| + if (dict->GetDouble(field, &double_result)) { |
| + *result = static_cast<float>(double_result); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +bool ConvertValueToDisplayMode(const base::DictionaryValue* dict, |
| + ash::DisplayMode* mode) { |
| + mode->size.set_width(GetIntOrDouble(dict, "originalWidth")); |
| + mode->size.set_height(GetIntOrDouble(dict, "originalHeight")); |
| + if (mode->size.IsEmpty()) { |
| + LOG(ERROR) << "missing width or height."; |
| + return false; |
| + } |
| + if (!GetFloat(dict, "refreshRate", &mode->refresh_rate)) { |
| + LOG(ERROR) << "missing refreshRate."; |
| + return false; |
| + } |
| + if (!GetFloat(dict, "scale", &mode->ui_scale)) { |
| + LOG(ERROR) << "missing ui-scale."; |
| + return false; |
| + } |
| + if (!GetFloat(dict, "deviceScaleFactor", &mode->device_scale_factor)) { |
| + LOG(ERROR) << "missing deviceScaleFactor."; |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +base::DictionaryValue* ConvertDisplayModeToValue( |
| + int64 display_id, const ash::DisplayMode& mode) { |
|
stevenjb
2014/07/31 00:03:58
nit: one arg per line
Jun Mukai
2014/07/31 00:31:35
Done.
|
| + base::DictionaryValue* result = new base::DictionaryValue(); |
| + gfx::Size size_dip = mode.GetSizeInDIP(); |
| + result->SetInteger("width", size_dip.width()); |
| + result->SetInteger("height", size_dip.height()); |
| + result->SetInteger("originalWidth", mode.size.width()); |
| + result->SetInteger("originalHeight", mode.size.height()); |
| + result->SetDouble("deviceScaleFactor", mode.device_scale_factor); |
| + result->SetDouble("scale", mode.ui_scale); |
| + result->SetDouble("refreshRate", mode.refresh_rate); |
| + result->SetBoolean("isBest", mode.native); |
| + result->SetBoolean( |
| + "selected", |
| + mode == GetDisplayManager()->GetActiveModeForDisplayId(display_id)); |
| + return result; |
| +} |
| + |
| } // namespace |
| DisplayOptionsHandler::DisplayOptionsHandler() { |
| @@ -159,12 +216,8 @@ void DisplayOptionsHandler::RegisterMessages() { |
| base::Bind(&DisplayOptionsHandler::HandleDisplayLayout, |
| base::Unretained(this))); |
| web_ui()->RegisterMessageCallback( |
| - "setUIScale", |
| - base::Bind(&DisplayOptionsHandler::HandleSetUIScale, |
| - base::Unretained(this))); |
| - web_ui()->RegisterMessageCallback( |
| - "setResolution", |
| - base::Bind(&DisplayOptionsHandler::HandleSetResolution, |
| + "setDisplayMode", |
| + base::Bind(&DisplayOptionsHandler::HandleSetDisplayMode, |
| base::Unretained(this))); |
| web_ui()->RegisterMessageCallback( |
| "setOrientation", |
| @@ -217,55 +270,13 @@ void DisplayOptionsHandler::SendDisplayInfo( |
| js_display->SetBoolean("isInternal", display.IsInternal()); |
| js_display->SetInteger("orientation", |
| static_cast<int>(display_info.rotation())); |
| - std::vector<ash::DisplayMode> display_modes; |
| - std::vector<float> ui_scales; |
| - if (display.IsInternal()) { |
| - ui_scales = DisplayManager::GetScalesForDisplay(display_info); |
| - gfx::SizeF base_size = display_info.bounds_in_native().size(); |
| - base_size.Scale(1.0f / display_info.device_scale_factor()); |
| - if (display_info.rotation() == gfx::Display::ROTATE_90 || |
| - display_info.rotation() == gfx::Display::ROTATE_270) { |
| - float tmp = base_size.width(); |
| - base_size.set_width(base_size.height()); |
| - base_size.set_height(tmp); |
| - } |
| - for (size_t i = 0; i < ui_scales.size(); ++i) { |
| - gfx::SizeF new_size = base_size; |
| - new_size.Scale(ui_scales[i]); |
| - display_modes.push_back(ash::DisplayMode( |
| - gfx::ToFlooredSize(new_size), -1.0f, false, false)); |
| - } |
| - } else { |
| - for (size_t i = 0; i < display_info.display_modes().size(); ++i) |
| - display_modes.push_back(display_info.display_modes()[i]); |
| - } |
| - std::sort(display_modes.begin(), display_modes.end(), CompareDisplayMode); |
| base::ListValue* js_resolutions = new base::ListValue(); |
| - gfx::Size current_size = display_info.bounds_in_native().size(); |
| + const std::vector<ash::DisplayMode>& display_modes = |
| + display_info.display_modes(); |
| for (size_t i = 0; i < display_modes.size(); ++i) { |
| - base::DictionaryValue* resolution_info = new base::DictionaryValue(); |
| - gfx::Size resolution = display_modes[i].size; |
| - if (!ui_scales.empty()) { |
| - resolution_info->SetDouble("scale", ui_scales[i]); |
| - if (ui_scales[i] == 1.0f) |
| - resolution_info->SetBoolean("isBest", true); |
| - resolution_info->SetBoolean( |
| - "selected", display_info.configured_ui_scale() == ui_scales[i]); |
| - } else { |
| - // Picks the largest one as the "best", which is the last element |
| - // because |display_modes| is sorted by its area. |
| - if (i == display_modes.size() - 1) |
| - resolution_info->SetBoolean("isBest", true); |
| - resolution_info->SetBoolean("selected", (resolution == current_size)); |
| - } |
| - resolution_info->SetInteger("width", resolution.width()); |
| - resolution_info->SetInteger("height", resolution.height()); |
| - if (display_modes[i].refresh_rate > 0.0f) { |
| - resolution_info->SetDouble("refreshRate", |
| - display_modes[i].refresh_rate); |
| - } |
| - js_resolutions->Append(resolution_info); |
| + js_resolutions->Append( |
| + ConvertDisplayModeToValue(display.id(), display_modes[i])); |
| } |
| js_display->Set("resolutions", js_resolutions); |
| @@ -359,69 +370,33 @@ void DisplayOptionsHandler::HandleDisplayLayout(const base::ListValue* args) { |
| static_cast<int>(offset))); |
| } |
| -void DisplayOptionsHandler::HandleSetUIScale(const base::ListValue* args) { |
| +void DisplayOptionsHandler::HandleSetDisplayMode(const base::ListValue* args) { |
| DCHECK(!args->empty()); |
| int64 display_id = GetDisplayId(args); |
| if (display_id == gfx::Display::kInvalidDisplayID) |
| return; |
| - double ui_scale = 0.0f; |
| - if (!args->GetDouble(1, &ui_scale) || ui_scale == 0.0f) { |
| - LOG(ERROR) << "Can't find new ui_scale"; |
| + const base::DictionaryValue* mode_data = NULL; |
| + if (!args->GetDictionary(1, &mode_data)) { |
| + LOG(ERROR) << "Failed to get mode data"; |
| return; |
| } |
| - GetDisplayManager()->SetDisplayUIScale(display_id, ui_scale); |
| -} |
| - |
| -void DisplayOptionsHandler::HandleSetResolution(const base::ListValue* args) { |
| - DCHECK(!args->empty()); |
| - int64 display_id = GetDisplayId(args); |
| - if (display_id == gfx::Display::kInvalidDisplayID) |
| + ash::DisplayMode mode; |
| + if (!ConvertValueToDisplayMode(mode_data, &mode)) |
| return; |
| content::RecordAction( |
| base::UserMetricsAction("Options_DisplaySetResolution")); |
| - double width = 0.0f; |
| - double height = 0.0f; |
| - if (!args->GetDouble(1, &width) || width == 0.0f) { |
| - LOG(ERROR) << "Can't find new width"; |
| - return; |
| + ash::DisplayManager* display_manager = GetDisplayManager(); |
| + ash::DisplayMode current_mode = |
| + display_manager->GetActiveModeForDisplayId(display_id); |
| + if (display_manager->SetDisplayMode(display_id, mode)) { |
| + ash::Shell::GetInstance()->resolution_notification_controller()-> |
| + PrepareNotification( |
| + display_id, current_mode, mode, base::Bind(&StoreDisplayPrefs)); |
| } |
| - if (!args->GetDouble(2, &height) || height == 0.0f) { |
| - LOG(ERROR) << "Can't find new height"; |
| - return; |
| - } |
| - |
| - const ash::DisplayInfo& display_info = |
| - GetDisplayManager()->GetDisplayInfo(display_id); |
| - gfx::Size new_resolution = gfx::ToFlooredSize(gfx::SizeF(width, height)); |
| - gfx::Size old_resolution = display_info.bounds_in_native().size(); |
| - bool has_new_resolution = false; |
| - bool has_old_resolution = false; |
| - for (size_t i = 0; i < display_info.display_modes().size(); ++i) { |
| - ash::DisplayMode display_mode = display_info.display_modes()[i]; |
| - if (display_mode.size == new_resolution) |
| - has_new_resolution = true; |
| - if (display_mode.size == old_resolution) |
| - has_old_resolution = true; |
| - } |
| - if (!has_new_resolution) { |
| - LOG(ERROR) << "No new resolution " << new_resolution.ToString() |
| - << " is found in the display info " << display_info.ToString(); |
| - return; |
| - } |
| - if (!has_old_resolution) { |
| - LOG(ERROR) << "No old resolution " << old_resolution.ToString() |
| - << " is found in the display info " << display_info.ToString(); |
| - return; |
| - } |
| - |
| - ash::Shell::GetInstance()->resolution_notification_controller()-> |
| - SetDisplayResolutionAndNotify( |
| - display_id, old_resolution, new_resolution, |
| - base::Bind(&StoreDisplayPrefs)); |
| } |
| void DisplayOptionsHandler::HandleSetOrientation(const base::ListValue* args) { |