OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/extensions/display_info_provider_chromeos.h" | 5 #include "chrome/browser/extensions/display_info_provider_chromeos.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "ash/display/display_configuration_controller.h" | 9 #include "ash/display/display_configuration_controller.h" |
10 #include "ash/display/display_manager.h" | 10 #include "ash/display/display_manager.h" |
11 #include "ash/display/resolution_notification_controller.h" | 11 #include "ash/display/resolution_notification_controller.h" |
12 #include "ash/shell.h" | 12 #include "ash/shell.h" |
13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
14 #include "chrome/browser/chromeos/display/display_preferences.h" | 14 #include "chrome/browser/chromeos/display/display_preferences.h" |
15 #include "extensions/common/api/system_display.h" | 15 #include "extensions/common/api/system_display.h" |
| 16 #include "ui/display/display.h" |
16 #include "ui/display/manager/display_layout.h" | 17 #include "ui/display/manager/display_layout.h" |
17 #include "ui/gfx/display.h" | |
18 #include "ui/gfx/geometry/point.h" | 18 #include "ui/gfx/geometry/point.h" |
19 #include "ui/gfx/geometry/rect.h" | 19 #include "ui/gfx/geometry/rect.h" |
20 | 20 |
21 namespace extensions { | 21 namespace extensions { |
22 | 22 |
23 using api::system_display::Bounds; | 23 using api::system_display::Bounds; |
24 using api::system_display::DisplayUnitInfo; | 24 using api::system_display::DisplayUnitInfo; |
25 using api::system_display::DisplayProperties; | 25 using api::system_display::DisplayProperties; |
26 using api::system_display::Insets; | 26 using api::system_display::Insets; |
27 | 27 |
28 namespace { | 28 namespace { |
29 | 29 |
30 // Maximum allowed bounds origin absolute value. | 30 // Maximum allowed bounds origin absolute value. |
31 const int kMaxBoundsOrigin = 200 * 1000; | 31 const int kMaxBoundsOrigin = 200 * 1000; |
32 | 32 |
33 // Checks if the given integer value is valid display rotation in degrees. | 33 // Checks if the given integer value is valid display rotation in degrees. |
34 bool IsValidRotationValue(int rotation) { | 34 bool IsValidRotationValue(int rotation) { |
35 return rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270; | 35 return rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270; |
36 } | 36 } |
37 | 37 |
38 // Converts integer integer value in degrees to Rotation enum value. | 38 // Converts integer integer value in degrees to Rotation enum value. |
39 gfx::Display::Rotation DegreesToRotation(int degrees) { | 39 display::Display::Rotation DegreesToRotation(int degrees) { |
40 DCHECK(IsValidRotationValue(degrees)); | 40 DCHECK(IsValidRotationValue(degrees)); |
41 switch (degrees) { | 41 switch (degrees) { |
42 case 0: | 42 case 0: |
43 return gfx::Display::ROTATE_0; | 43 return display::Display::ROTATE_0; |
44 case 90: | 44 case 90: |
45 return gfx::Display::ROTATE_90; | 45 return display::Display::ROTATE_90; |
46 case 180: | 46 case 180: |
47 return gfx::Display::ROTATE_180; | 47 return display::Display::ROTATE_180; |
48 case 270: | 48 case 270: |
49 return gfx::Display::ROTATE_270; | 49 return display::Display::ROTATE_270; |
50 default: | 50 default: |
51 return gfx::Display::ROTATE_0; | 51 return display::Display::ROTATE_0; |
52 } | 52 } |
53 } | 53 } |
54 | 54 |
55 // Checks if the given point is over the radius vector described by it's end | 55 // Checks if the given point is over the radius vector described by it's end |
56 // point |vector|. The point is over a vector if it's on its positive (left) | 56 // point |vector|. The point is over a vector if it's on its positive (left) |
57 // side. The method sees a point on the same line as the vector as being over | 57 // side. The method sees a point on the same line as the vector as being over |
58 // the vector. | 58 // the vector. |
59 bool PointIsOverRadiusVector(const gfx::Point& point, | 59 bool PointIsOverRadiusVector(const gfx::Point& point, |
60 const gfx::Point& vector) { | 60 const gfx::Point& vector) { |
61 // |point| is left of |vector| if its radius vector's scalar product with a | 61 // |point| is left of |vector| if its radius vector's scalar product with a |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 ash::Shell::GetInstance() | 177 ash::Shell::GetInstance() |
178 ->display_configuration_controller() | 178 ->display_configuration_controller() |
179 ->SetDisplayLayout(std::move(layout), true /* user_action */); | 179 ->SetDisplayLayout(std::move(layout), true /* user_action */); |
180 } | 180 } |
181 | 181 |
182 // Validates that parameters passed to the SetInfo function are valid for the | 182 // Validates that parameters passed to the SetInfo function are valid for the |
183 // desired display and the current display manager state. | 183 // desired display and the current display manager state. |
184 // Returns whether the parameters are valid. On failure |error| is set to the | 184 // Returns whether the parameters are valid. On failure |error| is set to the |
185 // error message. | 185 // error message. |
186 bool ValidateParamsForDisplay(const DisplayProperties& info, | 186 bool ValidateParamsForDisplay(const DisplayProperties& info, |
187 const gfx::Display& display, | 187 const display::Display& display, |
188 ash::DisplayManager* display_manager, | 188 ash::DisplayManager* display_manager, |
189 int64_t primary_display_id, | 189 int64_t primary_display_id, |
190 std::string* error) { | 190 std::string* error) { |
191 int64_t id = display.id(); | 191 int64_t id = display.id(); |
192 bool is_primary = | 192 bool is_primary = |
193 id == primary_display_id || (info.is_primary && *info.is_primary); | 193 id == primary_display_id || (info.is_primary && *info.is_primary); |
194 | 194 |
195 // If mirroring source id is set, a display with the given id should exist, | 195 // If mirroring source id is set, a display with the given id should exist, |
196 // and if should not be the same as the target display's id. | 196 // and if should not be the same as the target display's id. |
197 if (info.mirroring_source_id && !info.mirroring_source_id->empty()) { | 197 if (info.mirroring_source_id && !info.mirroring_source_id->empty()) { |
198 int64_t mirroring_id; | 198 int64_t mirroring_id; |
199 if (!base::StringToInt64(*info.mirroring_source_id, &mirroring_id) || | 199 if (!base::StringToInt64(*info.mirroring_source_id, &mirroring_id) || |
200 display_manager->GetDisplayForId(mirroring_id).id() == | 200 display_manager->GetDisplayForId(mirroring_id).id() == |
201 gfx::Display::kInvalidDisplayID) { | 201 display::Display::kInvalidDisplayID) { |
202 *error = "Display " + *info.mirroring_source_id + " not found."; | 202 *error = "Display " + *info.mirroring_source_id + " not found."; |
203 return false; | 203 return false; |
204 } | 204 } |
205 | 205 |
206 if (*info.mirroring_source_id == base::Int64ToString(id)) { | 206 if (*info.mirroring_source_id == base::Int64ToString(id)) { |
207 *error = "Not allowed to mirror self."; | 207 *error = "Not allowed to mirror self."; |
208 return false; | 208 return false; |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 if (new_mode.IsEquivalent(current_mode)) { | 292 if (new_mode.IsEquivalent(current_mode)) { |
293 *error = "Display mode mataches crrent mode."; | 293 *error = "Display mode mataches crrent mode."; |
294 return false; | 294 return false; |
295 } | 295 } |
296 | 296 |
297 if (!display_manager->SetDisplayMode(id, new_mode)) { | 297 if (!display_manager->SetDisplayMode(id, new_mode)) { |
298 *error = "Unable to set the display mode."; | 298 *error = "Unable to set the display mode."; |
299 return false; | 299 return false; |
300 } | 300 } |
301 | 301 |
302 if (!gfx::Display::IsInternalDisplayId(id)) { | 302 if (!display::Display::IsInternalDisplayId(id)) { |
303 // For external displays, show a notification confirming the resolution | 303 // For external displays, show a notification confirming the resolution |
304 // change. | 304 // change. |
305 ash::Shell::GetInstance() | 305 ash::Shell::GetInstance() |
306 ->resolution_notification_controller() | 306 ->resolution_notification_controller() |
307 ->PrepareNotification(id, current_mode, new_mode, | 307 ->PrepareNotification(id, current_mode, new_mode, |
308 base::Bind(&chromeos::StoreDisplayPrefs)); | 308 base::Bind(&chromeos::StoreDisplayPrefs)); |
309 } | 309 } |
310 } | 310 } |
311 return true; | 311 return true; |
312 } | 312 } |
313 | 313 |
314 // Gets the display with the provided string id. | 314 // Gets the display with the provided string id. |
315 gfx::Display GetTargetDisplay(const std::string& display_id_str, | 315 display::Display GetTargetDisplay(const std::string& display_id_str, |
316 ash::DisplayManager* manager) { | 316 ash::DisplayManager* manager) { |
317 int64_t display_id; | 317 int64_t display_id; |
318 if (!base::StringToInt64(display_id_str, &display_id)) { | 318 if (!base::StringToInt64(display_id_str, &display_id)) { |
319 // This should return invalid display. | 319 // This should return invalid display. |
320 return gfx::Display(); | 320 return display::Display(); |
321 } | 321 } |
322 return manager->GetDisplayForId(display_id); | 322 return manager->GetDisplayForId(display_id); |
323 } | 323 } |
324 | 324 |
325 extensions::api::system_display::DisplayMode GetDisplayMode( | 325 extensions::api::system_display::DisplayMode GetDisplayMode( |
326 ash::DisplayManager* display_manager, | 326 ash::DisplayManager* display_manager, |
327 const ash::DisplayInfo& display_info, | 327 const ash::DisplayInfo& display_info, |
328 const ash::DisplayMode& display_mode) { | 328 const ash::DisplayMode& display_mode) { |
329 extensions::api::system_display::DisplayMode result; | 329 extensions::api::system_display::DisplayMode result; |
330 | 330 |
331 bool is_internal = gfx::Display::HasInternalDisplay() && | 331 bool is_internal = display::Display::HasInternalDisplay() && |
332 gfx::Display::InternalDisplayId() == display_info.id(); | 332 display::Display::InternalDisplayId() == display_info.id(); |
333 gfx::Size size_dip = display_mode.GetSizeInDIP(is_internal); | 333 gfx::Size size_dip = display_mode.GetSizeInDIP(is_internal); |
334 result.width = size_dip.width(); | 334 result.width = size_dip.width(); |
335 result.height = size_dip.height(); | 335 result.height = size_dip.height(); |
336 result.width_in_native_pixels = display_mode.size.width(); | 336 result.width_in_native_pixels = display_mode.size.width(); |
337 result.height_in_native_pixels = display_mode.size.height(); | 337 result.height_in_native_pixels = display_mode.size.height(); |
338 result.ui_scale = display_mode.ui_scale; | 338 result.ui_scale = display_mode.ui_scale; |
339 result.device_scale_factor = display_mode.device_scale_factor; | 339 result.device_scale_factor = display_mode.device_scale_factor; |
340 result.is_native = display_mode.native; | 340 result.is_native = display_mode.native; |
341 result.is_selected = display_mode.IsEquivalent( | 341 result.is_selected = display_mode.IsEquivalent( |
342 display_manager->GetActiveModeForDisplayId(display_info.id())); | 342 display_manager->GetActiveModeForDisplayId(display_info.id())); |
343 return result; | 343 return result; |
344 } | 344 } |
345 | 345 |
346 } // namespace | 346 } // namespace |
347 | 347 |
348 DisplayInfoProviderChromeOS::DisplayInfoProviderChromeOS() { | 348 DisplayInfoProviderChromeOS::DisplayInfoProviderChromeOS() { |
349 } | 349 } |
350 | 350 |
351 DisplayInfoProviderChromeOS::~DisplayInfoProviderChromeOS() { | 351 DisplayInfoProviderChromeOS::~DisplayInfoProviderChromeOS() { |
352 } | 352 } |
353 | 353 |
354 bool DisplayInfoProviderChromeOS::SetInfo(const std::string& display_id_str, | 354 bool DisplayInfoProviderChromeOS::SetInfo(const std::string& display_id_str, |
355 const DisplayProperties& info, | 355 const DisplayProperties& info, |
356 std::string* error) { | 356 std::string* error) { |
357 ash::DisplayManager* display_manager = | 357 ash::DisplayManager* display_manager = |
358 ash::Shell::GetInstance()->display_manager(); | 358 ash::Shell::GetInstance()->display_manager(); |
359 ash::DisplayConfigurationController* display_configuration_controller = | 359 ash::DisplayConfigurationController* display_configuration_controller = |
360 ash::Shell::GetInstance()->display_configuration_controller(); | 360 ash::Shell::GetInstance()->display_configuration_controller(); |
361 | 361 |
362 const gfx::Display target = GetTargetDisplay(display_id_str, display_manager); | 362 const display::Display target = |
| 363 GetTargetDisplay(display_id_str, display_manager); |
363 | 364 |
364 if (target.id() == gfx::Display::kInvalidDisplayID) { | 365 if (target.id() == display::Display::kInvalidDisplayID) { |
365 *error = "Display not found."; | 366 *error = "Display not found."; |
366 return false; | 367 return false; |
367 } | 368 } |
368 | 369 |
369 int64_t display_id = target.id(); | 370 int64_t display_id = target.id(); |
370 const gfx::Display& primary = gfx::Screen::GetScreen()->GetPrimaryDisplay(); | 371 const display::Display& primary = |
| 372 display::Screen::GetScreen()->GetPrimaryDisplay(); |
371 | 373 |
372 if (!ValidateParamsForDisplay( | 374 if (!ValidateParamsForDisplay( |
373 info, target, display_manager, primary.id(), error)) { | 375 info, target, display_manager, primary.id(), error)) { |
374 return false; | 376 return false; |
375 } | 377 } |
376 | 378 |
377 // Process 'isPrimary' parameter. | 379 // Process 'isPrimary' parameter. |
378 if (info.is_primary && *info.is_primary && target.id() != primary.id()) { | 380 if (info.is_primary && *info.is_primary && target.id() != primary.id()) { |
379 display_configuration_controller->SetPrimaryDisplayId( | 381 display_configuration_controller->SetPrimaryDisplayId( |
380 display_id, true /* user_action */); | 382 display_id, true /* user_action */); |
(...skipping 12 matching lines...) Expand all Loading... |
393 gfx::Insets(info.overscan->top, | 395 gfx::Insets(info.overscan->top, |
394 info.overscan->left, | 396 info.overscan->left, |
395 info.overscan->bottom, | 397 info.overscan->bottom, |
396 info.overscan->right)); | 398 info.overscan->right)); |
397 } | 399 } |
398 | 400 |
399 // Process 'rotation' parameter. | 401 // Process 'rotation' parameter. |
400 if (info.rotation) { | 402 if (info.rotation) { |
401 display_configuration_controller->SetDisplayRotation( | 403 display_configuration_controller->SetDisplayRotation( |
402 display_id, DegreesToRotation(*info.rotation), | 404 display_id, DegreesToRotation(*info.rotation), |
403 gfx::Display::ROTATION_SOURCE_ACTIVE, true /* user_action */); | 405 display::Display::ROTATION_SOURCE_ACTIVE, true /* user_action */); |
404 } | 406 } |
405 | 407 |
406 // Process new display origin parameters. | 408 // Process new display origin parameters. |
407 gfx::Point new_bounds_origin = target.bounds().origin(); | 409 gfx::Point new_bounds_origin = target.bounds().origin(); |
408 if (info.bounds_origin_x) | 410 if (info.bounds_origin_x) |
409 new_bounds_origin.set_x(*info.bounds_origin_x); | 411 new_bounds_origin.set_x(*info.bounds_origin_x); |
410 if (info.bounds_origin_y) | 412 if (info.bounds_origin_y) |
411 new_bounds_origin.set_y(*info.bounds_origin_y); | 413 new_bounds_origin.set_y(*info.bounds_origin_y); |
412 | 414 |
413 if (new_bounds_origin != target.bounds().origin()) { | 415 if (new_bounds_origin != target.bounds().origin()) { |
414 gfx::Rect target_bounds = target.bounds(); | 416 gfx::Rect target_bounds = target.bounds(); |
415 target_bounds.Offset(new_bounds_origin.x() - target.bounds().x(), | 417 target_bounds.Offset(new_bounds_origin.x() - target.bounds().x(), |
416 new_bounds_origin.y() - target.bounds().y()); | 418 new_bounds_origin.y() - target.bounds().y()); |
417 UpdateDisplayLayout( | 419 UpdateDisplayLayout( |
418 primary.bounds(), primary.id(), target_bounds, target.id()); | 420 primary.bounds(), primary.id(), target_bounds, target.id()); |
419 } | 421 } |
420 | 422 |
421 return true; | 423 return true; |
422 } | 424 } |
423 | 425 |
424 void DisplayInfoProviderChromeOS::UpdateDisplayUnitInfoForPlatform( | 426 void DisplayInfoProviderChromeOS::UpdateDisplayUnitInfoForPlatform( |
425 const gfx::Display& display, | 427 const display::Display& display, |
426 extensions::api::system_display::DisplayUnitInfo* unit) { | 428 extensions::api::system_display::DisplayUnitInfo* unit) { |
427 ash::DisplayManager* display_manager = | 429 ash::DisplayManager* display_manager = |
428 ash::Shell::GetInstance()->display_manager(); | 430 ash::Shell::GetInstance()->display_manager(); |
429 unit->name = display_manager->GetDisplayNameForId(display.id()); | 431 unit->name = display_manager->GetDisplayNameForId(display.id()); |
430 if (display_manager->IsInMirrorMode()) { | 432 if (display_manager->IsInMirrorMode()) { |
431 unit->mirroring_source_id = | 433 unit->mirroring_source_id = |
432 base::Int64ToString(display_manager->mirroring_display_id()); | 434 base::Int64ToString(display_manager->mirroring_display_id()); |
433 } | 435 } |
434 | 436 |
435 const ash::DisplayInfo& display_info = | 437 const ash::DisplayInfo& display_info = |
(...skipping 21 matching lines...) Expand all Loading... |
457 ash::Shell::GetInstance()->display_manager()->SetUnifiedDesktopEnabled( | 459 ash::Shell::GetInstance()->display_manager()->SetUnifiedDesktopEnabled( |
458 enable); | 460 enable); |
459 } | 461 } |
460 | 462 |
461 DisplayUnitInfoList DisplayInfoProviderChromeOS::GetAllDisplaysInfo() { | 463 DisplayUnitInfoList DisplayInfoProviderChromeOS::GetAllDisplaysInfo() { |
462 ash::DisplayManager* display_manager = | 464 ash::DisplayManager* display_manager = |
463 ash::Shell::GetInstance()->display_manager(); | 465 ash::Shell::GetInstance()->display_manager(); |
464 if (!display_manager->IsInUnifiedMode()) | 466 if (!display_manager->IsInUnifiedMode()) |
465 return DisplayInfoProvider::GetAllDisplaysInfo(); | 467 return DisplayInfoProvider::GetAllDisplaysInfo(); |
466 | 468 |
467 std::vector<gfx::Display> displays = | 469 std::vector<display::Display> displays = |
468 display_manager->software_mirroring_display_list(); | 470 display_manager->software_mirroring_display_list(); |
469 CHECK_GT(displays.size(), 0u); | 471 CHECK_GT(displays.size(), 0u); |
470 | 472 |
471 // Use first display as primary. | 473 // Use first display as primary. |
472 int64_t primary_id = displays[0].id(); | 474 int64_t primary_id = displays[0].id(); |
473 DisplayUnitInfoList all_displays; | 475 DisplayUnitInfoList all_displays; |
474 for (const gfx::Display& display : displays) { | 476 for (const display::Display& display : displays) { |
475 api::system_display::DisplayUnitInfo unit = | 477 api::system_display::DisplayUnitInfo unit = |
476 CreateDisplayUnitInfo(display, primary_id); | 478 CreateDisplayUnitInfo(display, primary_id); |
477 UpdateDisplayUnitInfoForPlatform(display, &unit); | 479 UpdateDisplayUnitInfoForPlatform(display, &unit); |
478 all_displays.push_back(std::move(unit)); | 480 all_displays.push_back(std::move(unit)); |
479 } | 481 } |
480 return all_displays; | 482 return all_displays; |
481 } | 483 } |
482 | 484 |
483 // static | 485 // static |
484 DisplayInfoProvider* DisplayInfoProvider::Create() { | 486 DisplayInfoProvider* DisplayInfoProvider::Create() { |
485 return new DisplayInfoProviderChromeOS(); | 487 return new DisplayInfoProviderChromeOS(); |
486 } | 488 } |
487 | 489 |
488 } // namespace extensions | 490 } // namespace extensions |
OLD | NEW |