Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1509)

Side by Side Diff: services/ui/ws/display_manager.cc

Issue 2904993003: chromeos: changes how DisplayManagerObservers are notified (Closed)
Patch Set: cleanup Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/ui/ws/display_manager.h ('k') | services/ui/ws/test_utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 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 "services/ui/ws/display_manager.h" 5 #include "services/ui/ws/display_manager.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/stl_util.h"
10 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "services/ui/display/screen_manager.h"
11 #include "services/ui/display/viewport_metrics.h" 13 #include "services/ui/display/viewport_metrics.h"
12 #include "services/ui/ws/cursor_location_manager.h" 14 #include "services/ui/ws/cursor_location_manager.h"
13 #include "services/ui/ws/display.h" 15 #include "services/ui/ws/display.h"
14 #include "services/ui/ws/display_binding.h" 16 #include "services/ui/ws/display_binding.h"
17 #include "services/ui/ws/display_creation_config.h"
15 #include "services/ui/ws/event_dispatcher.h" 18 #include "services/ui/ws/event_dispatcher.h"
16 #include "services/ui/ws/frame_generator.h" 19 #include "services/ui/ws/frame_generator.h"
17 #include "services/ui/ws/server_window.h" 20 #include "services/ui/ws/server_window.h"
18 #include "services/ui/ws/user_display_manager.h" 21 #include "services/ui/ws/user_display_manager.h"
19 #include "services/ui/ws/user_display_manager_delegate.h" 22 #include "services/ui/ws/user_display_manager_delegate.h"
20 #include "services/ui/ws/user_id_tracker.h" 23 #include "services/ui/ws/user_id_tracker.h"
21 #include "services/ui/ws/window_manager_state.h" 24 #include "services/ui/ws/window_manager_state.h"
22 #include "services/ui/ws/window_manager_window_tree_factory.h" 25 #include "services/ui/ws/window_manager_window_tree_factory.h"
23 #include "services/ui/ws/window_server_delegate.h" 26 #include "services/ui/ws/window_server_delegate.h"
24 #include "services/ui/ws/window_tree.h" 27 #include "services/ui/ws/window_tree.h"
28 #include "ui/display/display_list.h"
29 #include "ui/display/screen_base.h"
25 #include "ui/events/event_rewriter.h" 30 #include "ui/events/event_rewriter.h"
26 31
27 #if defined(OS_CHROMEOS) 32 #if defined(OS_CHROMEOS)
28 #include "ui/chromeos/events/event_rewriter_chromeos.h" 33 #include "ui/chromeos/events/event_rewriter_chromeos.h"
29 #endif 34 #endif
30 35
31 namespace ui { 36 namespace ui {
32 namespace ws { 37 namespace ws {
33 38
34 DisplayManager::DisplayManager(WindowServer* window_server, 39 DisplayManager::DisplayManager(WindowServer* window_server,
(...skipping 12 matching lines...) Expand all
47 delegate, sticky_keys_controller); 52 delegate, sticky_keys_controller);
48 #endif 53 #endif
49 user_id_tracker_->AddObserver(this); 54 user_id_tracker_->AddObserver(this);
50 } 55 }
51 56
52 DisplayManager::~DisplayManager() { 57 DisplayManager::~DisplayManager() {
53 user_id_tracker_->RemoveObserver(this); 58 user_id_tracker_->RemoveObserver(this);
54 DestroyAllDisplays(); 59 DestroyAllDisplays();
55 } 60 }
56 61
62 void DisplayManager::OnDisplayCreationConfigSet() {
63 if (window_server_->display_creation_config() ==
64 DisplayCreationConfig::MANUAL) {
65 for (const auto& pair : user_display_managers_)
66 pair.second->DisableAutomaticNotification();
67 } else {
68 // In AUTOMATIC mode SetDisplayConfiguration() is never called.
69 got_initial_config_from_window_manager_ = true;
70 }
71 }
72
73 bool DisplayManager::SetDisplayConfiguration(
74 const std::vector<display::Display>& displays,
75 std::vector<ui::mojom::WmViewportMetricsPtr> viewport_metrics,
76 int64_t primary_display_id) {
77 if (window_server_->display_creation_config() !=
78 DisplayCreationConfig::MANUAL) {
79 DVLOG(1) << "SetDisplayConfiguration is only valid when roots manually "
80 "created";
81 return false;
82 }
83 if (displays.size() != viewport_metrics.size()) {
84 DVLOG(1) << "SetDisplayConfiguration called with mismatch in sizes";
85 return false;
86 }
87 size_t primary_display_index = displays.size();
88 std::set<int64_t> display_ids;
89 for (size_t i = 0; i < displays.size(); ++i) {
90 const display::Display& display = displays[i];
91 if (display.id() == display::kInvalidDisplayId) {
92 DVLOG(1) << "SetDisplayConfiguration passed invalid display id";
93 return false;
94 }
95 if (!display_ids.insert(display.id()).second) {
96 DVLOG(1) << "SetDisplayConfiguration passed duplicate display id";
97 return false;
98 }
99 if (display.id() == primary_display_id)
100 primary_display_index = i;
101 Display* ws_display = GetDisplayById(display.id());
102 if (!ws_display) {
103 DVLOG(1) << "SetDisplayConfiguration passed unknown display id "
104 << display.id();
105 return false;
106 }
107 }
108 if (primary_display_index == displays.size()) {
109 DVLOG(1) << "SetDisplayConfiguration primary id not in displays";
110 return false;
111 }
112
113 display::DisplayList& display_list =
114 display::ScreenManager::GetInstance()->GetScreen()->display_list();
115 display_list.AddOrUpdateDisplay(displays[primary_display_index],
116 display::DisplayList::Type::PRIMARY);
117 for (size_t i = 0; i < displays.size(); ++i) {
118 Display* ws_display = GetDisplayById(displays[i].id());
119 DCHECK(ws_display);
120 ws_display->SetDisplay(displays[i]);
121 ws_display->SetBoundsInPixels(viewport_metrics[i]->bounds_in_pixels);
122 if (i != primary_display_index) {
123 display_list.AddOrUpdateDisplay(displays[i],
124 display::DisplayList::Type::NOT_PRIMARY);
125 }
126 }
127
128 std::set<int64_t> existing_display_ids;
129 for (const display::Display& display : display_list.displays())
130 existing_display_ids.insert(display.id());
131 std::set<int64_t> removed_display_ids =
132 base::STLSetDifference<std::set<int64_t>>(existing_display_ids,
133 display_ids);
134 for (int64_t display_id : removed_display_ids)
135 display_list.RemoveDisplay(display_id);
136
137 for (auto& pair : user_display_managers_)
138 pair.second->CallOnDisplaysChanged();
139
140 if (!got_initial_config_from_window_manager_) {
141 got_initial_config_from_window_manager_ = true;
142 window_server_->delegate()->OnFirstDisplayReady();
143 }
144
145 return true;
146 }
147
57 UserDisplayManager* DisplayManager::GetUserDisplayManager( 148 UserDisplayManager* DisplayManager::GetUserDisplayManager(
58 const UserId& user_id) { 149 const UserId& user_id) {
59 if (!user_display_managers_.count(user_id)) { 150 if (!user_display_managers_.count(user_id)) {
60 user_display_managers_[user_id] = 151 user_display_managers_[user_id] =
61 base::MakeUnique<UserDisplayManager>(window_server_, user_id); 152 base::MakeUnique<UserDisplayManager>(window_server_, user_id);
153 if (window_server_->display_creation_config() ==
154 DisplayCreationConfig::MANUAL) {
155 user_display_managers_[user_id]->DisableAutomaticNotification();
156 }
62 } 157 }
63 return user_display_managers_[user_id].get(); 158 return user_display_managers_[user_id].get();
64 } 159 }
65 160
66 CursorLocationManager* DisplayManager::GetCursorLocationManager( 161 CursorLocationManager* DisplayManager::GetCursorLocationManager(
67 const UserId& user_id) { 162 const UserId& user_id) {
68 if (!cursor_location_managers_.count(user_id)) { 163 if (!cursor_location_managers_.count(user_id)) {
69 cursor_location_managers_[user_id] = 164 cursor_location_managers_[user_id] =
70 base::MakeUnique<CursorLocationManager>(); 165 base::MakeUnique<CursorLocationManager>();
71 } 166 }
72 return cursor_location_managers_[user_id].get(); 167 return cursor_location_managers_[user_id].get();
73 } 168 }
74 169
75 void DisplayManager::AddDisplay(Display* display) { 170 void DisplayManager::AddDisplay(Display* display) {
76 DCHECK_EQ(0u, pending_displays_.count(display)); 171 DCHECK_EQ(0u, pending_displays_.count(display));
77 pending_displays_.insert(display); 172 pending_displays_.insert(display);
78 } 173 }
79 174
80 void DisplayManager::AddDisplayForWindowManager( 175 Display* DisplayManager::AddDisplayForWindowManager(
176 bool is_primary_display,
81 const display::Display& display, 177 const display::Display& display,
82 const display::ViewportMetrics& metrics) { 178 const display::ViewportMetrics& metrics) {
179 DCHECK_EQ(DisplayCreationConfig::MANUAL,
180 window_server_->display_creation_config());
181 const display::DisplayList::Type display_type =
182 is_primary_display ? display::DisplayList::Type::PRIMARY
183 : display::DisplayList::Type::NOT_PRIMARY;
184 display::ScreenManager::GetInstance()->GetScreen()->display_list().AddDisplay(
185 display, display_type);
83 OnDisplayAdded(display, metrics); 186 OnDisplayAdded(display, metrics);
187 return GetDisplayById(display.id());
84 } 188 }
85 189
86 void DisplayManager::DestroyDisplay(Display* display) { 190 void DisplayManager::DestroyDisplay(Display* display) {
87 const bool is_pending = pending_displays_.count(display) > 0; 191 const bool is_pending = pending_displays_.count(display) > 0;
88 if (is_pending) { 192 if (is_pending) {
89 pending_displays_.erase(display); 193 pending_displays_.erase(display);
90 } else { 194 } else {
91 DCHECK(displays_.count(display)); 195 DCHECK(displays_.count(display));
92 displays_.erase(display); 196 displays_.erase(display);
93 window_server_->OnDisplayDestroyed(display); 197 window_server_->OnDisplayDestroyed(display);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 WindowId DisplayManager::GetAndAdvanceNextRootId() { 277 WindowId DisplayManager::GetAndAdvanceNextRootId() {
174 // TODO(sky): handle wrapping! 278 // TODO(sky): handle wrapping!
175 const uint16_t id = next_root_id_++; 279 const uint16_t id = next_root_id_++;
176 DCHECK_LT(id, next_root_id_); 280 DCHECK_LT(id, next_root_id_);
177 return RootWindowId(id); 281 return RootWindowId(id);
178 } 282 }
179 283
180 void DisplayManager::OnDisplayAcceleratedWidgetAvailable(Display* display) { 284 void DisplayManager::OnDisplayAcceleratedWidgetAvailable(Display* display) {
181 DCHECK_NE(0u, pending_displays_.count(display)); 285 DCHECK_NE(0u, pending_displays_.count(display));
182 DCHECK_EQ(0u, displays_.count(display)); 286 DCHECK_EQ(0u, displays_.count(display));
183 const bool is_first_display = displays_.empty(); 287 const bool is_first_display =
288 displays_.empty() && got_initial_config_from_window_manager_;
184 displays_.insert(display); 289 displays_.insert(display);
185 pending_displays_.erase(display); 290 pending_displays_.erase(display);
186 if (event_rewriter_) 291 if (event_rewriter_)
187 display->platform_display()->AddEventRewriter(event_rewriter_.get()); 292 display->platform_display()->AddEventRewriter(event_rewriter_.get());
188 window_server_->OnDisplayReady(display, is_first_display); 293 window_server_->OnDisplayReady(display, is_first_display);
189 } 294 }
190 295
191 void DisplayManager::SetHighContrastMode(bool enabled) { 296 void DisplayManager::SetHighContrastMode(bool enabled) {
192 for (Display* display : displays_) { 297 for (Display* display : displays_) {
193 display->platform_display()->GetFrameGenerator()->SetHighContrastMode( 298 display->platform_display()->GetFrameGenerator()->SetHighContrastMode(
(...skipping 11 matching lines...) Expand all
205 ->mouse_pointer_last_location(); 310 ->mouse_pointer_last_location();
206 previous_window_manager_state->Deactivate(); 311 previous_window_manager_state->Deactivate();
207 } 312 }
208 313
209 WindowManagerState* current_window_manager_state = 314 WindowManagerState* current_window_manager_state =
210 window_server_->GetWindowManagerStateForUser(active_id); 315 window_server_->GetWindowManagerStateForUser(active_id);
211 if (current_window_manager_state) 316 if (current_window_manager_state)
212 current_window_manager_state->Activate(mouse_location_on_screen); 317 current_window_manager_state->Activate(mouse_location_on_screen);
213 } 318 }
214 319
320 void DisplayManager::CreateDisplay(const display::Display& display,
321 const display::ViewportMetrics& metrics) {
322 ws::Display* ws_display = new ws::Display(window_server_);
323 ws_display->SetDisplay(display);
324 ws_display->Init(metrics, nullptr);
325 }
326
215 void DisplayManager::OnDisplayAdded(const display::Display& display, 327 void DisplayManager::OnDisplayAdded(const display::Display& display,
216 const display::ViewportMetrics& metrics) { 328 const display::ViewportMetrics& metrics) {
217 DVLOG(3) << "OnDisplayAdded: " << display.ToString(); 329 DVLOG(3) << "OnDisplayAdded: " << display.ToString();
218 330 CreateDisplay(display, metrics);
219 ws::Display* ws_display = new ws::Display(window_server_);
220 ws_display->SetDisplay(display);
221 ws_display->Init(metrics, nullptr);
222 } 331 }
223 332
224 void DisplayManager::OnDisplayRemoved(int64_t display_id) { 333 void DisplayManager::OnDisplayRemoved(int64_t display_id) {
225 DVLOG(3) << "OnDisplayRemoved: " << display_id; 334 DVLOG(3) << "OnDisplayRemoved: " << display_id;
226 Display* display = GetDisplayById(display_id); 335 Display* display = GetDisplayById(display_id);
227 if (display) 336 if (display)
228 DestroyDisplay(display); 337 DestroyDisplay(display);
229 } 338 }
230 339
231 void DisplayManager::OnDisplayModified( 340 void DisplayManager::OnDisplayModified(
(...skipping 26 matching lines...) Expand all
258 DVLOG(3) << "OnPrimaryDisplayChanged: " << primary_display_id; 367 DVLOG(3) << "OnPrimaryDisplayChanged: " << primary_display_id;
259 // TODO(kylechar): Send IPCs to WM clients first. 368 // TODO(kylechar): Send IPCs to WM clients first.
260 369
261 // Send IPCs to any DisplayManagerObservers. 370 // Send IPCs to any DisplayManagerObservers.
262 for (const auto& pair : user_display_managers_) 371 for (const auto& pair : user_display_managers_)
263 pair.second->OnPrimaryDisplayChanged(primary_display_id); 372 pair.second->OnPrimaryDisplayChanged(primary_display_id);
264 } 373 }
265 374
266 } // namespace ws 375 } // namespace ws
267 } // namespace ui 376 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/display_manager.h ('k') | services/ui/ws/test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698