Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(979)

Unified Diff: chrome/browser/ui/webui/options/chromeos/display_options_handler.cc

Issue 21629002: Supports changing resolutions from options UI page. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/options/chromeos/display_options_handler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 9dad1573658c9de6b97e0d8afe173d3f6cc014f7..8861b50a14b5e416042e6309bdaa89e2b5e16811 100644
--- a/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc
@@ -23,8 +23,8 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/display.h"
#include "ui/gfx/rect.h"
-#include "ui/gfx/safe_integer_conversions.h"
#include "ui/gfx/screen.h"
+#include "ui/gfx/size_conversions.h"
using ash::internal::DisplayManager;
@@ -53,6 +53,11 @@ int64 GetDisplayId(const base::ListValue* args) {
return display_id;
}
+bool CompareResolution(ash::internal::Resolution r1,
+ ash::internal::Resolution r2) {
+ return r1.size.GetArea() < r2.size.GetArea();
+}
+
} // namespace
DisplayOptionsHandler::DisplayOptionsHandler() {
@@ -131,6 +136,10 @@ void DisplayOptionsHandler::RegisterMessages() {
base::Bind(&DisplayOptionsHandler::HandleSetUIScale,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
+ "setResolution",
+ base::Bind(&DisplayOptionsHandler::HandleSetResolution,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
"setOrientation",
base::Bind(&DisplayOptionsHandler::HandleSetOrientation,
base::Unretained(this)));
@@ -179,30 +188,54 @@ void DisplayOptionsHandler::SendDisplayInfo(
js_display->SetBoolean("isInternal", display.IsInternal());
js_display->SetInteger("orientation",
static_cast<int>(display_info.rotation()));
- std::vector<float> ui_scales = DisplayManager::GetScalesForDisplay(
- display_info);
- base::ListValue* js_scales = new base::ListValue();
- gfx::SizeF base_size = display_info.bounds_in_pixel().size();
- base_size.Scale(1.0f / display.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);
+ std::vector<ash::internal::Resolution> resolutions;
+ std::vector<float> ui_scales;
+ if (display.IsInternal()) {
+ ui_scales = DisplayManager::GetScalesForDisplay(display_info);
+ gfx::SizeF base_size = display_info.bounds_in_pixel().size();
+ base_size.Scale(1.0f / display.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]);
+ resolutions.push_back(ash::internal::Resolution(
+ gfx::ToFlooredSize(new_size), false /* interlaced */));
+ }
+ } else {
+ for (size_t i = 0; i < display_info.resolutions().size(); ++i)
+ resolutions.push_back(display_info.resolutions()[i]);
}
-
- for (size_t i = 0; i < ui_scales.size(); ++i) {
- base::DictionaryValue* scale_info = new base::DictionaryValue();
- scale_info->SetDouble("scale", ui_scales[i]);
- scale_info->SetInteger(
- "width", gfx::ToFlooredInt(base_size.width() * ui_scales[i]));
- scale_info->SetInteger(
- "height", gfx::ToFlooredInt(base_size.height() * ui_scales[i]));
- scale_info->SetBoolean("selected",
- display_info.ui_scale() == ui_scales[i]);
- js_scales->Append(scale_info);
+ std::sort(resolutions.begin(), resolutions.end(), CompareResolution);
+
+ base::ListValue* js_resolutions = new base::ListValue();
+ gfx::Size current_size(bounds.width() * display.device_scale_factor(),
+ bounds.height() * display.device_scale_factor());
+ for (size_t i = 0; i < resolutions.size(); ++i) {
+ base::DictionaryValue* resolution_info = new base::DictionaryValue();
+ 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.ui_scale() == ui_scales[i]);
+ } else {
+ // Picks the largest one as the "best", which is the last element
+ // because |resolutions| is sorted by its area.
+ if (i == resolutions.size() - 1)
+ resolution_info->SetBoolean("isBest", true);
+ resolution_info->SetBoolean(
+ "selected", (resolutions[i].size == current_size));
+ }
+ resolution_info->SetInteger("width", resolutions[i].size.width());
+ resolution_info->SetInteger("height",resolutions[i].size.height());
+ js_resolutions->Append(resolution_info);
}
- js_display->Set("uiScales", js_scales);
+ js_display->Set("resolutions", js_resolutions);
js_displays.Append(js_display);
}
@@ -284,18 +317,35 @@ void DisplayOptionsHandler::HandleSetUIScale(const base::ListValue* args) {
if (display_id == gfx::Display::kInvalidDisplayID)
return;
- std::string ui_scale_value;
double ui_scale = 0.0f;
- if (!args->GetString(1, &ui_scale_value)) {
- LOG(ERROR) << "Ca't find new ui_scale";
+ if (!args->GetDouble(1, &ui_scale) || ui_scale == 0.0f) {
+ LOG(ERROR) << "Can't find new ui_scale";
return;
}
- if (!base::StringToDouble(ui_scale_value, &ui_scale)) {
- LOG(ERROR) << "Invalid ui_scale: " << ui_scale_value;
+
+ 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)
+ return;
+
+ double width = 0.0f;
+ double height = 0.0f;
+ if (!args->GetDouble(1, &width) || width == 0.0f) {
+ LOG(ERROR) << "Can't find new width";
+ return;
+ }
+ if (!args->GetDouble(2, &height) || height == 0.0f) {
+ LOG(ERROR) << "Can't find new height";
return;
}
- GetDisplayManager()->SetDisplayUIScale(display_id, ui_scale);
+ // TODO(mukai): creates a confirmation dialog.
+ GetDisplayManager()->SetDisplayResolution(
+ display_id, gfx::ToFlooredSize(gfx::SizeF(width, height)));
}
void DisplayOptionsHandler::HandleSetOrientation(const base::ListValue* args) {
« no previous file with comments | « chrome/browser/ui/webui/options/chromeos/display_options_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698