| 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 "chrome/browser/chromeos/display/overscan_calibrator.h" |
| 15 #include "extensions/common/api/system_display.h" | 16 #include "extensions/common/api/system_display.h" |
| 16 #include "ui/display/display.h" | 17 #include "ui/display/display.h" |
| 17 #include "ui/display/manager/display_layout.h" | 18 #include "ui/display/manager/display_layout.h" |
| 18 #include "ui/gfx/geometry/point.h" | 19 #include "ui/gfx/geometry/point.h" |
| 19 #include "ui/gfx/geometry/rect.h" | 20 #include "ui/gfx/geometry/rect.h" |
| 20 | 21 |
| 21 namespace extensions { | 22 namespace extensions { |
| 22 | 23 |
| 23 using api::system_display::Bounds; | 24 using api::system_display::Bounds; |
| 24 using api::system_display::DisplayUnitInfo; | 25 using api::system_display::DisplayUnitInfo; |
| 25 using api::system_display::DisplayProperties; | 26 using api::system_display::DisplayProperties; |
| 26 using api::system_display::Insets; | 27 using api::system_display::Insets; |
| 27 | 28 |
| 28 namespace { | 29 namespace { |
| 29 | 30 |
| 30 // Maximum allowed bounds origin absolute value. | 31 // Maximum allowed bounds origin absolute value. |
| 31 const int kMaxBoundsOrigin = 200 * 1000; | 32 const int kMaxBoundsOrigin = 200 * 1000; |
| 32 | 33 |
| 34 // Gets the display with the provided string id. |
| 35 display::Display GetDisplay(const std::string& display_id_str) { |
| 36 int64_t display_id; |
| 37 if (!base::StringToInt64(display_id_str, &display_id)) |
| 38 return display::Display(); |
| 39 return ash::Shell::GetInstance()->display_manager()->GetDisplayForId( |
| 40 display_id); |
| 41 } |
| 42 |
| 33 // Checks if the given integer value is valid display rotation in degrees. | 43 // Checks if the given integer value is valid display rotation in degrees. |
| 34 bool IsValidRotationValue(int rotation) { | 44 bool IsValidRotationValue(int rotation) { |
| 35 return rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270; | 45 return rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270; |
| 36 } | 46 } |
| 37 | 47 |
| 38 // Converts integer integer value in degrees to Rotation enum value. | 48 // Converts integer integer value in degrees to Rotation enum value. |
| 39 display::Display::Rotation DegreesToRotation(int degrees) { | 49 display::Display::Rotation DegreesToRotation(int degrees) { |
| 40 DCHECK(IsValidRotationValue(degrees)); | 50 DCHECK(IsValidRotationValue(degrees)); |
| 41 switch (degrees) { | 51 switch (degrees) { |
| 42 case 0: | 52 case 0: |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 ash::DisplayManager* display_manager, | 198 ash::DisplayManager* display_manager, |
| 189 int64_t primary_display_id, | 199 int64_t primary_display_id, |
| 190 std::string* error) { | 200 std::string* error) { |
| 191 int64_t id = display.id(); | 201 int64_t id = display.id(); |
| 192 bool is_primary = | 202 bool is_primary = |
| 193 id == primary_display_id || (info.is_primary && *info.is_primary); | 203 id == primary_display_id || (info.is_primary && *info.is_primary); |
| 194 | 204 |
| 195 // If mirroring source id is set, a display with the given id should exist, | 205 // 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. | 206 // and if should not be the same as the target display's id. |
| 197 if (info.mirroring_source_id && !info.mirroring_source_id->empty()) { | 207 if (info.mirroring_source_id && !info.mirroring_source_id->empty()) { |
| 198 int64_t mirroring_id; | 208 int64_t mirroring_id = GetDisplay(*info.mirroring_source_id).id(); |
| 199 if (!base::StringToInt64(*info.mirroring_source_id, &mirroring_id) || | 209 if (mirroring_id == display::Display::kInvalidDisplayID) { |
| 200 display_manager->GetDisplayForId(mirroring_id).id() == | |
| 201 display::Display::kInvalidDisplayID) { | |
| 202 *error = "Display " + *info.mirroring_source_id + " not found."; | 210 *error = "Display " + *info.mirroring_source_id + " not found."; |
| 203 return false; | 211 return false; |
| 204 } | 212 } |
| 205 | 213 |
| 206 if (*info.mirroring_source_id == base::Int64ToString(id)) { | 214 if (*info.mirroring_source_id == base::Int64ToString(id)) { |
| 207 *error = "Not allowed to mirror self."; | 215 *error = "Not allowed to mirror self."; |
| 208 return false; | 216 return false; |
| 209 } | 217 } |
| 210 } | 218 } |
| 211 | 219 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 // change. | 312 // change. |
| 305 ash::Shell::GetInstance() | 313 ash::Shell::GetInstance() |
| 306 ->resolution_notification_controller() | 314 ->resolution_notification_controller() |
| 307 ->PrepareNotification(id, current_mode, new_mode, | 315 ->PrepareNotification(id, current_mode, new_mode, |
| 308 base::Bind(&chromeos::StoreDisplayPrefs)); | 316 base::Bind(&chromeos::StoreDisplayPrefs)); |
| 309 } | 317 } |
| 310 } | 318 } |
| 311 return true; | 319 return true; |
| 312 } | 320 } |
| 313 | 321 |
| 314 // Gets the display with the provided string id. | |
| 315 display::Display GetTargetDisplay(const std::string& display_id_str, | |
| 316 ash::DisplayManager* manager) { | |
| 317 int64_t display_id; | |
| 318 if (!base::StringToInt64(display_id_str, &display_id)) { | |
| 319 // This should return invalid display. | |
| 320 return display::Display(); | |
| 321 } | |
| 322 return manager->GetDisplayForId(display_id); | |
| 323 } | |
| 324 | |
| 325 extensions::api::system_display::DisplayMode GetDisplayMode( | 322 extensions::api::system_display::DisplayMode GetDisplayMode( |
| 326 ash::DisplayManager* display_manager, | 323 ash::DisplayManager* display_manager, |
| 327 const ash::DisplayInfo& display_info, | 324 const ash::DisplayInfo& display_info, |
| 328 const ash::DisplayMode& display_mode) { | 325 const ash::DisplayMode& display_mode) { |
| 329 extensions::api::system_display::DisplayMode result; | 326 extensions::api::system_display::DisplayMode result; |
| 330 | 327 |
| 331 bool is_internal = display::Display::HasInternalDisplay() && | 328 bool is_internal = display::Display::HasInternalDisplay() && |
| 332 display::Display::InternalDisplayId() == display_info.id(); | 329 display::Display::InternalDisplayId() == display_info.id(); |
| 333 gfx::Size size_dip = display_mode.GetSizeInDIP(is_internal); | 330 gfx::Size size_dip = display_mode.GetSizeInDIP(is_internal); |
| 334 result.width = size_dip.width(); | 331 result.width = size_dip.width(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 352 } | 349 } |
| 353 | 350 |
| 354 bool DisplayInfoProviderChromeOS::SetInfo(const std::string& display_id_str, | 351 bool DisplayInfoProviderChromeOS::SetInfo(const std::string& display_id_str, |
| 355 const DisplayProperties& info, | 352 const DisplayProperties& info, |
| 356 std::string* error) { | 353 std::string* error) { |
| 357 ash::DisplayManager* display_manager = | 354 ash::DisplayManager* display_manager = |
| 358 ash::Shell::GetInstance()->display_manager(); | 355 ash::Shell::GetInstance()->display_manager(); |
| 359 ash::DisplayConfigurationController* display_configuration_controller = | 356 ash::DisplayConfigurationController* display_configuration_controller = |
| 360 ash::Shell::GetInstance()->display_configuration_controller(); | 357 ash::Shell::GetInstance()->display_configuration_controller(); |
| 361 | 358 |
| 362 const display::Display target = | 359 const display::Display target = GetDisplay(display_id_str); |
| 363 GetTargetDisplay(display_id_str, display_manager); | |
| 364 | 360 |
| 365 if (target.id() == display::Display::kInvalidDisplayID) { | 361 if (target.id() == display::Display::kInvalidDisplayID) { |
| 366 *error = "Display not found."; | 362 *error = "Display not found."; |
| 367 return false; | 363 return false; |
| 368 } | 364 } |
| 369 | 365 |
| 370 int64_t display_id = target.id(); | 366 int64_t display_id = target.id(); |
| 371 const display::Display& primary = | 367 const display::Display& primary = |
| 372 display::Screen::GetScreen()->GetPrimaryDisplay(); | 368 display::Screen::GetScreen()->GetPrimaryDisplay(); |
| 373 | 369 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 DisplayUnitInfoList all_displays; | 471 DisplayUnitInfoList all_displays; |
| 476 for (const display::Display& display : displays) { | 472 for (const display::Display& display : displays) { |
| 477 api::system_display::DisplayUnitInfo unit = | 473 api::system_display::DisplayUnitInfo unit = |
| 478 CreateDisplayUnitInfo(display, primary_id); | 474 CreateDisplayUnitInfo(display, primary_id); |
| 479 UpdateDisplayUnitInfoForPlatform(display, &unit); | 475 UpdateDisplayUnitInfoForPlatform(display, &unit); |
| 480 all_displays.push_back(std::move(unit)); | 476 all_displays.push_back(std::move(unit)); |
| 481 } | 477 } |
| 482 return all_displays; | 478 return all_displays; |
| 483 } | 479 } |
| 484 | 480 |
| 481 bool DisplayInfoProviderChromeOS::OverscanCalibrationStart( |
| 482 const std::string& id) { |
| 483 VLOG(1) << "OverscanCalibrationStart: " << id; |
| 484 const display::Display display = GetDisplay(id); |
| 485 if (display.id() == display::Display::kInvalidDisplayID) |
| 486 return false; |
| 487 auto insets = |
| 488 ash::Shell::GetInstance()->window_tree_host_manager()->GetOverscanInsets( |
| 489 display.id()); |
| 490 overscan_calibrators_[id].reset( |
| 491 new chromeos::OverscanCalibrator(display, insets)); |
| 492 return true; |
| 493 } |
| 494 |
| 495 bool DisplayInfoProviderChromeOS::OverscanCalibrationAdjust( |
| 496 const std::string& id, |
| 497 const api::system_display::Insets& delta) { |
| 498 VLOG(1) << "OverscanCalibrationAdjust: " << id; |
| 499 chromeos::OverscanCalibrator* calibrator = GetCalibrator(id); |
| 500 if (!calibrator) |
| 501 return false; |
| 502 gfx::Insets insets = calibrator->insets(); |
| 503 insets += gfx::Insets(delta.top, delta.left, delta.bottom, delta.right); |
| 504 calibrator->UpdateInsets(insets); |
| 505 return true; |
| 506 } |
| 507 |
| 508 bool DisplayInfoProviderChromeOS::OverscanCalibrationReset( |
| 509 const std::string& id) { |
| 510 VLOG(1) << "OverscanCalibrationReset: " << id; |
| 511 chromeos::OverscanCalibrator* calibrator = GetCalibrator(id); |
| 512 if (!calibrator) |
| 513 return false; |
| 514 calibrator->Reset(); |
| 515 return true; |
| 516 } |
| 517 |
| 518 bool DisplayInfoProviderChromeOS::OverscanCalibrationComplete( |
| 519 const std::string& id) { |
| 520 VLOG(1) << "OverscanCalibrationComplete: " << id; |
| 521 chromeos::OverscanCalibrator* calibrator = GetCalibrator(id); |
| 522 if (!calibrator) |
| 523 return false; |
| 524 calibrator->Commit(); |
| 525 overscan_calibrators_[id].reset(); |
| 526 return true; |
| 527 } |
| 528 |
| 529 chromeos::OverscanCalibrator* DisplayInfoProviderChromeOS::GetCalibrator( |
| 530 const std::string& id) { |
| 531 auto iter = overscan_calibrators_.find(id); |
| 532 if (iter == overscan_calibrators_.end()) |
| 533 return nullptr; |
| 534 return iter->second.get(); |
| 535 } |
| 536 |
| 485 // static | 537 // static |
| 486 DisplayInfoProvider* DisplayInfoProvider::Create() { | 538 DisplayInfoProvider* DisplayInfoProvider::Create() { |
| 487 return new DisplayInfoProviderChromeOS(); | 539 return new DisplayInfoProviderChromeOS(); |
| 488 } | 540 } |
| 489 | 541 |
| 490 } // namespace extensions | 542 } // namespace extensions |
| OLD | NEW |