display_change_notifier.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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
  3. // found in the LICENSE file.
  4. #include "ui/display/display_change_notifier.h"
  5. #include <stdint.h>
  6. #include "base/observer_list.h"
  7. #include "ui/display/display.h"
  8. #include "ui/display/display_observer.h"
  9. namespace display {
  10. namespace {
  11. class DisplayComparator {
  12. public:
  13. explicit DisplayComparator(const Display& display)
  14. : display_id_(display.id()) {}
  15. bool operator()(const Display& display) const {
  16. return display.id() == display_id_;
  17. }
  18. private:
  19. int64_t display_id_;
  20. };
  21. } // anonymous namespace
  22. DisplayChangeNotifier::DisplayChangeNotifier() {}
  23. DisplayChangeNotifier::~DisplayChangeNotifier() {}
  24. void DisplayChangeNotifier::AddObserver(DisplayObserver* obs) {
  25. observer_list_.AddObserver(obs);
  26. }
  27. void DisplayChangeNotifier::RemoveObserver(DisplayObserver* obs) {
  28. observer_list_.RemoveObserver(obs);
  29. }
  30. void DisplayChangeNotifier::NotifyDisplaysChanged(
  31. const std::vector<Display>& old_displays,
  32. const std::vector<Display>& new_displays) {
  33. bool did_remove_displays = false;
  34. // Display present in old_displays but not in new_displays has been removed.
  35. for (auto old_it = old_displays.begin(); old_it != old_displays.end();
  36. ++old_it) {
  37. if (std::find_if(new_displays.begin(), new_displays.end(),
  38. DisplayComparator(*old_it)) == new_displays.end()) {
  39. did_remove_displays = true;
  40. for (DisplayObserver& observer : observer_list_)
  41. observer.OnDisplayRemoved(*old_it);
  42. }
  43. }
  44. if (did_remove_displays) {
  45. for (DisplayObserver& observer : observer_list_)
  46. observer.OnDidRemoveDisplays();
  47. }
  48. // Display present in new_displays but not in old_displays has been added.
  49. // Display present in both might have been modified.
  50. for (auto new_it = new_displays.begin(); new_it != new_displays.end();
  51. ++new_it) {
  52. auto old_it = std::find_if(old_displays.begin(), old_displays.end(),
  53. DisplayComparator(*new_it));
  54. if (old_it == old_displays.end()) {
  55. for (DisplayObserver& observer : observer_list_)
  56. observer.OnDisplayAdded(*new_it);
  57. continue;
  58. }
  59. uint32_t metrics = DisplayObserver::DISPLAY_METRIC_NONE;
  60. if (new_it->bounds() != old_it->bounds())
  61. metrics |= DisplayObserver::DISPLAY_METRIC_BOUNDS;
  62. if (new_it->rotation() != old_it->rotation())
  63. metrics |= DisplayObserver::DISPLAY_METRIC_ROTATION;
  64. if (new_it->work_area() != old_it->work_area())
  65. metrics |= DisplayObserver::DISPLAY_METRIC_WORK_AREA;
  66. if (new_it->device_scale_factor() != old_it->device_scale_factor())
  67. metrics |= DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR;
  68. if (new_it->color_spaces() != old_it->color_spaces())
  69. metrics |= DisplayObserver::DISPLAY_METRIC_COLOR_SPACE;
  70. if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) {
  71. for (DisplayObserver& observer : observer_list_)
  72. observer.OnDisplayMetricsChanged(*new_it, metrics);
  73. }
  74. }
  75. }
  76. void DisplayChangeNotifier::NotifyCurrentWorkspaceChanged(
  77. const std::string& workspace) {
  78. for (DisplayObserver& observer : observer_list_)
  79. observer.OnCurrentWorkspaceChanged(workspace);
  80. }
  81. } // namespace display