[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 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 | |||||
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 5 | #include "ui/display/display_change_notifier.h" |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 6 | |
avi | c89eb8d4 | 2015-12-23 08:08:18 | [diff] [blame] | 7 | #include <stdint.h> |
8 | |||||
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 9 | #include "ui/display/display.h" |
10 | #include "ui/display/display_observer.h" | ||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 11 | |
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 12 | namespace display { |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 13 | |
14 | namespace { | ||||
15 | |||||
16 | class DisplayComparator { | ||||
17 | public: | ||||
18 | explicit DisplayComparator(const Display& display) | ||||
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 19 | : display_id_(display.id()) {} |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 20 | |
21 | bool operator()(const Display& display) const { | ||||
22 | return display.id() == display_id_; | ||||
23 | } | ||||
24 | |||||
25 | private: | ||||
avi | c89eb8d4 | 2015-12-23 08:08:18 | [diff] [blame] | 26 | int64_t display_id_; |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 27 | }; |
28 | |||||
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 29 | } // anonymous namespace |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 30 | |
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 31 | DisplayChangeNotifier::DisplayChangeNotifier() {} |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 32 | |
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 33 | DisplayChangeNotifier::~DisplayChangeNotifier() {} |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 34 | |
35 | void DisplayChangeNotifier::AddObserver(DisplayObserver* obs) { | ||||
36 | observer_list_.AddObserver(obs); | ||||
37 | } | ||||
38 | |||||
39 | void DisplayChangeNotifier::RemoveObserver(DisplayObserver* obs) { | ||||
40 | observer_list_.RemoveObserver(obs); | ||||
41 | } | ||||
42 | |||||
43 | void DisplayChangeNotifier::NotifyDisplaysChanged( | ||||
44 | const std::vector<Display>& old_displays, | ||||
45 | const std::vector<Display>& new_displays) { | ||||
46 | // Display present in old_displays but not in new_displays has been removed. | ||||
jdoerrie | dcef4b1 | 2018-10-10 12:04:32 | [diff] [blame] | 47 | auto old_it = old_displays.begin(); |
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 48 | for (; old_it != old_displays.end(); ++old_it) { |
49 | if (std::find_if(new_displays.begin(), new_displays.end(), | ||||
50 | DisplayComparator(*old_it)) == new_displays.end()) { | ||||
ericwilligers | 44bb427 | 2016-10-19 00:15:24 | [diff] [blame] | 51 | for (DisplayObserver& observer : observer_list_) |
52 | observer.OnDisplayRemoved(*old_it); | ||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 53 | } |
54 | } | ||||
55 | |||||
56 | // Display present in new_displays but not in old_displays has been added. | ||||
57 | // Display present in both might have been modified. | ||||
jdoerrie | dcef4b1 | 2018-10-10 12:04:32 | [diff] [blame] | 58 | for (auto new_it = new_displays.begin(); new_it != new_displays.end(); |
59 | ++new_it) { | ||||
60 | auto old_it = std::find_if(old_displays.begin(), old_displays.end(), | ||||
61 | DisplayComparator(*new_it)); | ||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 62 | |
63 | if (old_it == old_displays.end()) { | ||||
ericwilligers | 44bb427 | 2016-10-19 00:15:24 | [diff] [blame] | 64 | for (DisplayObserver& observer : observer_list_) |
65 | observer.OnDisplayAdded(*new_it); | ||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 66 | continue; |
67 | } | ||||
68 | |||||
69 | uint32_t metrics = DisplayObserver::DISPLAY_METRIC_NONE; | ||||
70 | |||||
71 | if (new_it->bounds() != old_it->bounds()) | ||||
72 | metrics |= DisplayObserver::DISPLAY_METRIC_BOUNDS; | ||||
73 | |||||
74 | if (new_it->rotation() != old_it->rotation()) | ||||
75 | metrics |= DisplayObserver::DISPLAY_METRIC_ROTATION; | ||||
76 | |||||
77 | if (new_it->work_area() != old_it->work_area()) | ||||
78 | metrics |= DisplayObserver::DISPLAY_METRIC_WORK_AREA; | ||||
79 | |||||
80 | if (new_it->device_scale_factor() != old_it->device_scale_factor()) | ||||
81 | metrics |= DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; | ||||
82 | |||||
hubbe | 853276f | 2017-07-02 06:44:59 | [diff] [blame] | 83 | if (new_it->color_space() != old_it->color_space()) |
84 | metrics |= DisplayObserver::DISPLAY_METRIC_COLOR_SPACE; | ||||
85 | |||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 86 | if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) { |
ericwilligers | 44bb427 | 2016-10-19 00:15:24 | [diff] [blame] | 87 | for (DisplayObserver& observer : observer_list_) |
88 | observer.OnDisplayMetricsChanged(*new_it, metrics); | ||||
[email protected] | 472de00 | 2014-07-18 22:36:13 | [diff] [blame] | 89 | } |
90 | } | ||||
91 | } | ||||
92 | |||||
oshima | a15deb0 | 2016-05-11 00:19:33 | [diff] [blame] | 93 | } // namespace display |