OLD | NEW |
| (Empty) |
1 // Copyright 2016 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 | |
5 #include "ui/views/mus/display_list.h" | |
6 | |
7 #include "ui/display/display_finder.h" | |
8 #include "ui/display/display_observer.h" | |
9 | |
10 namespace views { | |
11 | |
12 DisplayList::DisplayList() {} | |
13 | |
14 DisplayList::~DisplayList() {} | |
15 | |
16 void DisplayList::AddObserver(display::DisplayObserver* observer) { | |
17 observers_.AddObserver(observer); | |
18 } | |
19 | |
20 void DisplayList::RemoveObserver(display::DisplayObserver* observer) { | |
21 observers_.RemoveObserver(observer); | |
22 } | |
23 | |
24 DisplayList::Displays::const_iterator DisplayList::FindDisplayById( | |
25 int64_t id) const { | |
26 for (auto iter = displays_.begin(); iter != displays_.end(); ++iter) { | |
27 if (iter->id() == id) | |
28 return iter; | |
29 } | |
30 return displays_.end(); | |
31 } | |
32 | |
33 DisplayList::Displays::iterator DisplayList::FindDisplayById(int64_t id) { | |
34 for (auto iter = displays_.begin(); iter != displays_.end(); ++iter) { | |
35 if (iter->id() == id) | |
36 return iter; | |
37 } | |
38 return displays_.end(); | |
39 } | |
40 | |
41 DisplayList::Displays::const_iterator DisplayList::GetPrimaryDisplayIterator() | |
42 const { | |
43 return primary_display_index_ == -1 | |
44 ? displays_.end() | |
45 : displays_.begin() + primary_display_index_; | |
46 } | |
47 | |
48 void DisplayList::UpdateDisplay(const display::Display& display, Type type) { | |
49 auto iter = FindDisplayById(display.id()); | |
50 DCHECK(iter != displays_.end()); | |
51 | |
52 display::Display* local_display = &(*iter); | |
53 uint32_t changed_values = 0; | |
54 if (type == Type::PRIMARY && | |
55 static_cast<int>(iter - displays_.begin()) != | |
56 static_cast<int>(GetPrimaryDisplayIterator() - displays_.begin())) { | |
57 primary_display_index_ = static_cast<int>(iter - displays_.begin()); | |
58 // ash::DisplayManager only notifies for the Display gaining primary, not | |
59 // the one losing it. | |
60 changed_values |= display::DisplayObserver::DISPLAY_METRIC_PRIMARY; | |
61 } | |
62 if (local_display->bounds() != display.bounds()) { | |
63 local_display->set_bounds(display.bounds()); | |
64 changed_values |= display::DisplayObserver::DISPLAY_METRIC_BOUNDS; | |
65 } | |
66 if (local_display->work_area() != display.work_area()) { | |
67 local_display->set_work_area(display.work_area()); | |
68 changed_values |= display::DisplayObserver::DISPLAY_METRIC_WORK_AREA; | |
69 } | |
70 if (local_display->rotation() != display.rotation()) { | |
71 local_display->set_rotation(display.rotation()); | |
72 changed_values |= display::DisplayObserver::DISPLAY_METRIC_ROTATION; | |
73 } | |
74 if (local_display->device_scale_factor() != display.device_scale_factor()) { | |
75 local_display->set_device_scale_factor(display.device_scale_factor()); | |
76 changed_values |= | |
77 display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; | |
78 } | |
79 FOR_EACH_OBSERVER(display::DisplayObserver, observers_, | |
80 OnDisplayMetricsChanged(*local_display, changed_values)); | |
81 } | |
82 | |
83 void DisplayList::AddDisplay(const display::Display& display, Type type) { | |
84 DCHECK(displays_.end() == FindDisplayById(display.id())); | |
85 displays_.push_back(display); | |
86 if (type == Type::PRIMARY) | |
87 primary_display_index_ = static_cast<int>(displays_.size()) - 1; | |
88 FOR_EACH_OBSERVER(display::DisplayObserver, observers_, | |
89 OnDisplayAdded(display)); | |
90 } | |
91 | |
92 void DisplayList::RemoveDisplay(int64_t id) { | |
93 auto iter = FindDisplayById(id); | |
94 DCHECK(displays_.end() != iter); | |
95 if (primary_display_index_ == static_cast<int>(iter - displays_.begin())) { | |
96 // We expect the primary to change before removing it. The only case we | |
97 // allow removal of the primary is if it is the list display. | |
98 DCHECK_EQ(1u, displays_.size()); | |
99 primary_display_index_ = -1; | |
100 } else if (primary_display_index_ > | |
101 static_cast<int>(iter - displays_.begin())) { | |
102 primary_display_index_--; | |
103 } | |
104 const display::Display display = *iter; | |
105 displays_.erase(iter); | |
106 FOR_EACH_OBSERVER(display::DisplayObserver, observers_, | |
107 OnDisplayRemoved(display)); | |
108 } | |
109 } // namespace views | |
OLD | NEW |