| 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..caea66908892c424b4feb24356efb6b60691fb18 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) {
|
| + 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.IsEquivalent(
|
| + 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) {
|
|
|