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

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

Issue 14710011: Redesign display options for ChromeOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/webui/options/chromeos/display_options_handler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/options/chromeos/display_options_handler.h" 5 #include "chrome/browser/ui/webui/options/chromeos/display_options_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "ash/display/display_controller.h" 9 #include "ash/display/display_controller.h"
10 #include "ash/display/display_manager.h" 10 #include "ash/display/display_manager.h"
(...skipping 17 matching lines...) Expand all
28 using ash::internal::DisplayManager; 28 using ash::internal::DisplayManager;
29 29
30 namespace chromeos { 30 namespace chromeos {
31 namespace options { 31 namespace options {
32 namespace { 32 namespace {
33 33
34 DisplayManager* GetDisplayManager() { 34 DisplayManager* GetDisplayManager() {
35 return ash::Shell::GetInstance()->display_manager(); 35 return ash::Shell::GetInstance()->display_manager();
36 } 36 }
37 37
38 int64 GetDisplayId(const base::ListValue* args) {
39 // Assumes the display id is specified as the first argument.
40 std::string id_value;
41 if (!args->GetString(0, &id_value)) {
42 LOG(ERROR) << "Can't find ID";
43 return gfx::Display::kInvalidDisplayID;
44 }
45
46 int64 display_id = gfx::Display::kInvalidDisplayID;
47 if (!base::StringToInt64(id_value, &display_id)) {
48 LOG(ERROR) << "Invalid display id: " << id_value;
49 return gfx::Display::kInvalidDisplayID;
50 }
51
52 return display_id;
53 }
54
38 } // namespace 55 } // namespace
39 56
40 DisplayOptionsHandler::DisplayOptionsHandler() { 57 DisplayOptionsHandler::DisplayOptionsHandler() {
41 ash::Shell::GetInstance()->display_controller()->AddObserver(this); 58 ash::Shell::GetInstance()->display_controller()->AddObserver(this);
42 } 59 }
43 60
44 DisplayOptionsHandler::~DisplayOptionsHandler() { 61 DisplayOptionsHandler::~DisplayOptionsHandler() {
45 ash::Shell::GetInstance()->display_controller()->RemoveObserver(this); 62 ash::Shell::GetInstance()->display_controller()->RemoveObserver(this);
46 } 63 }
47 64
48 void DisplayOptionsHandler::GetLocalizedValues( 65 void DisplayOptionsHandler::GetLocalizedValues(
49 DictionaryValue* localized_strings) { 66 DictionaryValue* localized_strings) {
50 DCHECK(localized_strings); 67 DCHECK(localized_strings);
51 RegisterTitle(localized_strings, "displayOptionsPage", 68 RegisterTitle(localized_strings, "displayOptionsPage",
52 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_TAB_TITLE); 69 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_TAB_TITLE);
70
71 localized_strings->SetString(
72 "selectedDisplayTitleOptions", l10n_util::GetStringUTF16(
73 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_OPTIONS));
74 localized_strings->SetString(
75 "selectedDisplayTitleResolution", l10n_util::GetStringUTF16(
76 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_RESOLUTION));
77 localized_strings->SetString(
78 "selectedDisplayTitleOrientation", l10n_util::GetStringUTF16(
79 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_ORIENTATION));
80 localized_strings->SetString(
81 "selectedDisplayTitleOverscan", l10n_util::GetStringUTF16(
82 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_OVERSCAN));
83
53 localized_strings->SetString("startMirroring", l10n_util::GetStringUTF16( 84 localized_strings->SetString("startMirroring", l10n_util::GetStringUTF16(
54 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_START_MIRRORING)); 85 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_START_MIRRORING));
55 localized_strings->SetString("stopMirroring", l10n_util::GetStringUTF16( 86 localized_strings->SetString("stopMirroring", l10n_util::GetStringUTF16(
56 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_STOP_MIRRORING)); 87 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_STOP_MIRRORING));
88 localized_strings->SetString("mirroringDisplay", l10n_util::GetStringUTF16(
89 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_MIRRORING_DISPLAY_NAME));
57 localized_strings->SetString("setPrimary", l10n_util::GetStringUTF16( 90 localized_strings->SetString("setPrimary", l10n_util::GetStringUTF16(
58 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_SET_PRIMARY)); 91 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_SET_PRIMARY));
59 localized_strings->SetString("applyResult", l10n_util::GetStringUTF16( 92 localized_strings->SetString("annotateBest", l10n_util::GetStringUTF16(
60 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_APPLY_RESULT)); 93 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_RESOLUTION_ANNOTATION_BEST));
61 localized_strings->SetString("resolution", l10n_util::GetStringUTF16( 94 localized_strings->SetString("orientation0", l10n_util::GetStringUTF16(
62 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_RESOLUTION)); 95 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_STANDARD_ORIENTATION));
63 localized_strings->SetString( 96 localized_strings->SetString("orientation90", l10n_util::GetStringUTF16(
64 "startCalibratingOverscan", l10n_util::GetStringUTF16( 97 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_ORIENTATION_90));
65 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_START_CALIBRATING_OVERSCAN)); 98 localized_strings->SetString("orientation180", l10n_util::GetStringUTF16(
99 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_ORIENTATION_180));
100 localized_strings->SetString("orientation270", l10n_util::GetStringUTF16(
101 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_ORIENTATION_270));
102 localized_strings->SetString(
103 "startCalibratingOverscan", l10n_util::GetStringUTF16(
104 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_START_CALIBRATING_OVERSCAN));
66 } 105 }
67 106
68 void DisplayOptionsHandler::InitializePage() { 107 void DisplayOptionsHandler::InitializePage() {
69 DCHECK(web_ui()); 108 DCHECK(web_ui());
70 UpdateDisplaySectionVisibility();
71 } 109 }
72 110
73 void DisplayOptionsHandler::RegisterMessages() { 111 void DisplayOptionsHandler::RegisterMessages() {
74 web_ui()->RegisterMessageCallback( 112 web_ui()->RegisterMessageCallback(
75 "getDisplayInfo", 113 "getDisplayInfo",
76 base::Bind(&DisplayOptionsHandler::HandleDisplayInfo, 114 base::Bind(&DisplayOptionsHandler::HandleDisplayInfo,
77 base::Unretained(this))); 115 base::Unretained(this)));
78 web_ui()->RegisterMessageCallback( 116 web_ui()->RegisterMessageCallback(
79 "setMirroring", 117 "setMirroring",
80 base::Bind(&DisplayOptionsHandler::HandleMirroring, 118 base::Bind(&DisplayOptionsHandler::HandleMirroring,
81 base::Unretained(this))); 119 base::Unretained(this)));
82 web_ui()->RegisterMessageCallback( 120 web_ui()->RegisterMessageCallback(
83 "setPrimary", 121 "setPrimary",
84 base::Bind(&DisplayOptionsHandler::HandleSetPrimary, 122 base::Bind(&DisplayOptionsHandler::HandleSetPrimary,
85 base::Unretained(this))); 123 base::Unretained(this)));
86 web_ui()->RegisterMessageCallback( 124 web_ui()->RegisterMessageCallback(
87 "setDisplayLayout", 125 "setDisplayLayout",
88 base::Bind(&DisplayOptionsHandler::HandleDisplayLayout, 126 base::Bind(&DisplayOptionsHandler::HandleDisplayLayout,
89 base::Unretained(this))); 127 base::Unretained(this)));
128 web_ui()->RegisterMessageCallback(
129 "setUIScale",
130 base::Bind(&DisplayOptionsHandler::HandleSetUIScale,
131 base::Unretained(this)));
132 web_ui()->RegisterMessageCallback(
133 "setOrientation",
134 base::Bind(&DisplayOptionsHandler::HandleSetOrientation,
135 base::Unretained(this)));
90 } 136 }
91 137
92 void DisplayOptionsHandler::OnDisplayConfigurationChanging() { 138 void DisplayOptionsHandler::OnDisplayConfigurationChanging() {
93 } 139 }
94 140
95 void DisplayOptionsHandler::OnDisplayConfigurationChanged() { 141 void DisplayOptionsHandler::OnDisplayConfigurationChanged() {
96 UpdateDisplaySectionVisibility();
97 SendAllDisplayInfo(); 142 SendAllDisplayInfo();
98 } 143 }
99 144
100 void DisplayOptionsHandler::UpdateDisplaySectionVisibility() {
101 DisplayManager* display_manager = GetDisplayManager();
102 size_t num_displays = display_manager->num_connected_displays();
103 base::FundamentalValue show_options(
104 num_displays > 1 || !display_manager->HasInternalDisplay());
105 web_ui()->CallJavascriptFunction(
106 "options.BrowserOptions.showDisplayOptions", show_options);
107 }
108
109 void DisplayOptionsHandler::SendAllDisplayInfo() { 145 void DisplayOptionsHandler::SendAllDisplayInfo() {
110 DisplayManager* display_manager = GetDisplayManager(); 146 DisplayManager* display_manager = GetDisplayManager();
111 147
112 std::vector<const gfx::Display*> displays; 148 std::vector<const gfx::Display*> displays;
113 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 149 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
114 displays.push_back(display_manager->GetDisplayAt(i)); 150 displays.push_back(display_manager->GetDisplayAt(i));
115 } 151 }
116 SendDisplayInfo(displays); 152 SendDisplayInfo(displays);
117 } 153 }
118 154
119 void DisplayOptionsHandler::SendDisplayInfo( 155 void DisplayOptionsHandler::SendDisplayInfo(
120 const std::vector<const gfx::Display*> displays) { 156 const std::vector<const gfx::Display*> displays) {
121 DisplayManager* display_manager = GetDisplayManager(); 157 DisplayManager* display_manager = GetDisplayManager();
122 ash::DisplayController* display_controller = 158 ash::DisplayController* display_controller =
123 ash::Shell::GetInstance()->display_controller(); 159 ash::Shell::GetInstance()->display_controller();
124 chromeos::OutputConfigurator* output_configurator = 160 chromeos::OutputConfigurator* output_configurator =
125 ash::Shell::GetInstance()->output_configurator(); 161 ash::Shell::GetInstance()->output_configurator();
126 base::FundamentalValue mirroring( 162 base::FundamentalValue mirroring(
127 output_configurator->output_state() == chromeos::STATE_DUAL_MIRROR); 163 output_configurator->output_state() == chromeos::STATE_DUAL_MIRROR);
128 164
129 int64 primary_id = ash::Shell::GetScreen()->GetPrimaryDisplay().id(); 165 int64 primary_id = ash::Shell::GetScreen()->GetPrimaryDisplay().id();
130 base::ListValue display_info; 166 base::ListValue js_displays;
131 for (size_t i = 0; i < displays.size(); ++i) { 167 for (size_t i = 0; i < displays.size(); ++i) {
132 const gfx::Display* display = displays[i]; 168 const gfx::Display* display = displays[i];
169 const ash::internal::DisplayInfo& display_info =
170 display_manager->GetDisplayInfo(display->id());
133 const gfx::Rect& bounds = display->bounds(); 171 const gfx::Rect& bounds = display->bounds();
134 base::DictionaryValue* js_display = new base::DictionaryValue(); 172 base::DictionaryValue* js_display = new base::DictionaryValue();
135 js_display->SetString("id", base::Int64ToString(display->id())); 173 js_display->SetString("id", base::Int64ToString(display->id()));
136 js_display->SetDouble("x", bounds.x()); 174 js_display->SetInteger("x", bounds.x());
137 js_display->SetDouble("y", bounds.y()); 175 js_display->SetInteger("y", bounds.y());
138 js_display->SetDouble("width", bounds.width()); 176 js_display->SetInteger("width", bounds.width());
139 js_display->SetDouble("height", bounds.height()); 177 js_display->SetInteger("height", bounds.height());
140 js_display->SetString("name", 178 js_display->SetString("name",
141 display_manager->GetDisplayNameForId(display->id())); 179 display_manager->GetDisplayNameForId(display->id()));
142 js_display->SetBoolean("isPrimary", display->id() == primary_id); 180 js_display->SetBoolean("isPrimary", display->id() == primary_id);
143 js_display->SetBoolean("isInternal", display->IsInternal()); 181 js_display->SetBoolean("isInternal", display->IsInternal());
144 display_info.Set(i, js_display); 182 js_display->SetInteger("orientation",
183 static_cast<int>(display_info.rotation()));
184 std::vector<float> ui_scales = DisplayManager::GetScalesForDisplay(
185 display_info);
186 base::ListValue* js_scales = new base::ListValue();
187 gfx::SizeF base_size = display_info.bounds_in_pixel().size();
188 base_size.Scale(1.0f / display->device_scale_factor());
189 if (display_info.rotation() == gfx::Display::ROTATE_90 ||
190 display_info.rotation() == gfx::Display::ROTATE_270) {
191 float tmp = base_size.width();
192 base_size.set_width(base_size.height());
193 base_size.set_height(tmp);
194 }
195
196 for (size_t i = 0; i < ui_scales.size(); ++i) {
197 base::DictionaryValue* scale_info = new base::DictionaryValue();
198 scale_info->SetDouble("scale", ui_scales[i]);
199 scale_info->SetInteger("width", base_size.width() * ui_scales[i]);
200 scale_info->SetInteger("height", base_size.height() * ui_scales[i]);
201 scale_info->SetBoolean("selected",
202 display_info.ui_scale() == ui_scales[i]);
203 js_scales->Append(scale_info);
204 }
oshima 2013/05/13 01:00:25 You need to use floored value. I may also need to
Jun Mukai 2013/05/13 16:45:31 For flooring, it's done by calling "SetInteger" (i
Jun Mukai 2013/05/13 23:42:37 chatted with Alex, and he said showing the origina
205 js_display->Set("uiScales", js_scales);
206 js_displays.Append(js_display);
145 } 207 }
146 208
147 scoped_ptr<base::Value> layout_value(base::Value::CreateNullValue()); 209 scoped_ptr<base::Value> layout_value(base::Value::CreateNullValue());
148 scoped_ptr<base::Value> offset_value(base::Value::CreateNullValue()); 210 scoped_ptr<base::Value> offset_value(base::Value::CreateNullValue());
149 if (display_manager->GetNumDisplays() > 1) { 211 if (display_manager->GetNumDisplays() > 1) {
150 const ash::DisplayLayout layout = 212 const ash::DisplayLayout layout =
151 display_controller->GetCurrentDisplayLayout(); 213 display_controller->GetCurrentDisplayLayout();
152 layout_value.reset(new base::FundamentalValue(layout.position)); 214 layout_value.reset(new base::FundamentalValue(layout.position));
153 offset_value.reset(new base::FundamentalValue(layout.offset)); 215 offset_value.reset(new base::FundamentalValue(layout.offset));
154 } 216 }
155 217
156 web_ui()->CallJavascriptFunction( 218 web_ui()->CallJavascriptFunction(
157 "options.DisplayOptions.setDisplayInfo", 219 "options.DisplayOptions.setDisplayInfo",
158 mirroring, display_info, *layout_value.get(), *offset_value.get()); 220 mirroring, js_displays, *layout_value.get(), *offset_value.get());
159 } 221 }
160 222
161 void DisplayOptionsHandler::OnFadeOutForMirroringFinished(bool is_mirroring) { 223 void DisplayOptionsHandler::OnFadeOutForMirroringFinished(bool is_mirroring) {
162 chromeos::OutputState new_state = 224 chromeos::OutputState new_state =
163 is_mirroring ? STATE_DUAL_MIRROR : STATE_DUAL_EXTENDED; 225 is_mirroring ? STATE_DUAL_MIRROR : STATE_DUAL_EXTENDED;
164 ash::Shell::GetInstance()->output_configurator()->SetDisplayMode(new_state); 226 ash::Shell::GetInstance()->output_configurator()->SetDisplayMode(new_state);
165 // Not necessary to start fade-in animation. OutputConfigurator will do that. 227 // Not necessary to start fade-in animation. OutputConfigurator will do that.
166 } 228 }
167 229
168 void DisplayOptionsHandler::OnFadeOutForDisplayLayoutFinished( 230 void DisplayOptionsHandler::OnFadeOutForDisplayLayoutFinished(
(...skipping 15 matching lines...) Expand all
184 args->GetBoolean(0, &is_mirroring); 246 args->GetBoolean(0, &is_mirroring);
185 ash::Shell::GetInstance()->output_configurator_animation()-> 247 ash::Shell::GetInstance()->output_configurator_animation()->
186 StartFadeOutAnimation(base::Bind( 248 StartFadeOutAnimation(base::Bind(
187 &DisplayOptionsHandler::OnFadeOutForMirroringFinished, 249 &DisplayOptionsHandler::OnFadeOutForMirroringFinished,
188 base::Unretained(this), 250 base::Unretained(this),
189 is_mirroring)); 251 is_mirroring));
190 } 252 }
191 253
192 void DisplayOptionsHandler::HandleSetPrimary(const base::ListValue* args) { 254 void DisplayOptionsHandler::HandleSetPrimary(const base::ListValue* args) {
193 DCHECK(!args->empty()); 255 DCHECK(!args->empty());
256 int display_id = GetDisplayId(args);
257 if (display_id == gfx::Display::kInvalidDisplayID)
258 return;
194 259
195 int64 display_id = gfx::Display::kInvalidDisplayID;
196 std::string id_value;
197 if (!args->GetString(0, &id_value)) {
198 LOG(ERROR) << "Can't find ID";
199 return;
200 }
201
202 if (!base::StringToInt64(id_value, &display_id) ||
203 display_id == gfx::Display::kInvalidDisplayID) {
204 LOG(ERROR) << "Invalid parameter: " << id_value;
205 return;
206 }
207 ash::Shell::GetInstance()->display_controller()-> 260 ash::Shell::GetInstance()->display_controller()->
208 SetPrimaryDisplayId(display_id); 261 SetPrimaryDisplayId(display_id);
209 } 262 }
210 263
211 void DisplayOptionsHandler::HandleDisplayLayout(const base::ListValue* args) { 264 void DisplayOptionsHandler::HandleDisplayLayout(const base::ListValue* args) {
212 double layout = -1; 265 double layout = -1;
213 double offset = -1; 266 double offset = -1;
214 if (!args->GetDouble(0, &layout) || !args->GetDouble(1, &offset)) { 267 if (!args->GetDouble(0, &layout) || !args->GetDouble(1, &offset)) {
215 LOG(ERROR) << "Invalid parameter"; 268 LOG(ERROR) << "Invalid parameter";
216 SendAllDisplayInfo(); 269 SendAllDisplayInfo();
217 return; 270 return;
218 } 271 }
219 DCHECK_LE(ash::DisplayLayout::TOP, layout); 272 DCHECK_LE(ash::DisplayLayout::TOP, layout);
220 DCHECK_GE(ash::DisplayLayout::LEFT, layout); 273 DCHECK_GE(ash::DisplayLayout::LEFT, layout);
221 ash::Shell::GetInstance()->output_configurator_animation()-> 274 ash::Shell::GetInstance()->output_configurator_animation()->
222 StartFadeOutAnimation(base::Bind( 275 StartFadeOutAnimation(base::Bind(
223 &DisplayOptionsHandler::OnFadeOutForDisplayLayoutFinished, 276 &DisplayOptionsHandler::OnFadeOutForDisplayLayoutFinished,
224 base::Unretained(this), 277 base::Unretained(this),
225 static_cast<int>(layout), 278 static_cast<int>(layout),
226 static_cast<int>(offset))); 279 static_cast<int>(offset)));
227 } 280 }
228 281
282 void DisplayOptionsHandler::HandleSetUIScale(const base::ListValue* args) {
283 DCHECK(!args->empty());
284
285 int64 display_id = GetDisplayId(args);
286 if (display_id == gfx::Display::kInvalidDisplayID)
287 return;
288
289 std::string ui_scale_value;
290 double ui_scale = 0.0f;
291 if (!args->GetString(1, &ui_scale_value)) {
292 LOG(ERROR) << "Ca't find new ui_scale";
293 return;
294 }
295 if (!base::StringToDouble(ui_scale_value, &ui_scale)) {
296 LOG(ERROR) << "Invalid ui_scale: " << ui_scale_value;
297 return;
298 }
299
300 GetDisplayManager()->SetDisplayUIScale(display_id, ui_scale);
301 }
302
303 void DisplayOptionsHandler::HandleSetOrientation(const base::ListValue* args) {
304 DCHECK(!args->empty());
305
306 int64 display_id = GetDisplayId(args);
307 if (display_id == gfx::Display::kInvalidDisplayID)
308 return;
309
310 std::string rotation_value;
311 gfx::Display::Rotation new_rotation = gfx::Display::ROTATE_0;
312 if (!args->GetString(1, &rotation_value)) {
313 LOG(ERROR) << "Can't find new orientation";
314 return;
315 }
316 if (rotation_value == "90")
317 new_rotation = gfx::Display::ROTATE_90;
318 else if (rotation_value == "180")
319 new_rotation = gfx::Display::ROTATE_180;
320 else if (rotation_value == "270")
321 new_rotation = gfx::Display::ROTATE_270;
322 else if (rotation_value != "0")
323 LOG(ERROR) << "Invalid rotation: " << rotation_value << " Falls back to 0";
324
325 GetDisplayManager()->SetDisplayRotation(display_id, new_rotation);
326 }
327
229 } // namespace options 328 } // namespace options
230 } // namespace chromeos 329 } // namespace chromeos
OLDNEW
« 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