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

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

Issue 2829733002: mus: Changes SetDisplayRoot() to create actual display (Closed)
Patch Set: screenmanagerforwarding only ozone Created 3 years, 8 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
OLDNEW
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 "services/ui/ws/window_tree.h" 5 #include "services/ui/ws/window_tree.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "mojo/public/cpp/bindings/map.h" 14 #include "mojo/public/cpp/bindings/map.h"
15 #include "services/ui/ws/cursor_location_manager.h" 15 #include "services/ui/ws/cursor_location_manager.h"
16 #include "services/ui/ws/default_access_policy.h" 16 #include "services/ui/ws/default_access_policy.h"
17 #include "services/ui/ws/display.h" 17 #include "services/ui/ws/display.h"
18 #include "services/ui/ws/display_manager.h" 18 #include "services/ui/ws/display_manager.h"
19 #include "services/ui/ws/event_matcher.h" 19 #include "services/ui/ws/event_matcher.h"
20 #include "services/ui/ws/focus_controller.h" 20 #include "services/ui/ws/focus_controller.h"
21 #include "services/ui/ws/operation.h" 21 #include "services/ui/ws/operation.h"
22 #include "services/ui/ws/platform_display.h" 22 #include "services/ui/ws/platform_display.h"
23 #include "services/ui/ws/server_window.h" 23 #include "services/ui/ws/server_window.h"
24 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 24 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
25 #include "services/ui/ws/server_window_observer.h" 25 #include "services/ui/ws/server_window_observer.h"
26 #include "services/ui/ws/user_display_manager.h" 26 #include "services/ui/ws/user_display_manager.h"
27 #include "services/ui/ws/window_manager_display_root.h" 27 #include "services/ui/ws/window_manager_display_root.h"
28 #include "services/ui/ws/window_manager_state.h" 28 #include "services/ui/ws/window_manager_state.h"
29 #include "services/ui/ws/window_server.h" 29 #include "services/ui/ws/window_server.h"
30 #include "services/ui/ws/window_server_delegate.h"
30 #include "services/ui/ws/window_tree_binding.h" 31 #include "services/ui/ws/window_tree_binding.h"
31 #include "ui/display/display.h" 32 #include "ui/display/display.h"
33 #include "ui/display/display_list.h"
34 #include "ui/display/screen_base.h"
32 #include "ui/display/types/display_constants.h" 35 #include "ui/display/types/display_constants.h"
33 #include "ui/platform_window/mojo/ime_type_converters.h" 36 #include "ui/platform_window/mojo/ime_type_converters.h"
34 #include "ui/platform_window/text_input_state.h" 37 #include "ui/platform_window/text_input_state.h"
35 38
36 using mojo::InterfaceRequest; 39 using mojo::InterfaceRequest;
37 40
38 using EventProperties = std::unordered_map<std::string, std::vector<uint8_t>>; 41 using EventProperties = std::unordered_map<std::string, std::vector<uint8_t>>;
39 42
40 namespace ui { 43 namespace ui {
41 namespace ws { 44 namespace ws {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 void WindowTree::OnWmMoveDragImageAck() { 259 void WindowTree::OnWmMoveDragImageAck() {
257 if (drag_move_state_->has_queued_drag_window_move) { 260 if (drag_move_state_->has_queued_drag_window_move) {
258 gfx::Point queued_location = drag_move_state_->queued_cursor_location; 261 gfx::Point queued_location = drag_move_state_->queued_cursor_location;
259 drag_move_state_.reset(); 262 drag_move_state_.reset();
260 OnDragMoved(queued_location); 263 OnDragMoved(queued_location);
261 } else { 264 } else {
262 drag_move_state_.reset(); 265 drag_move_state_.reset();
263 } 266 }
264 } 267 }
265 268
266 bool WindowTree::ProcessSetDisplayRoot(int64_t display_id, 269 ServerWindow* WindowTree::ProcessSetDisplayRoot(
267 const ClientWindowId& client_window_id) { 270 const display::Display& display_to_create,
271 const mojom::WmViewportMetrics& transport_viewport_metrics,
272 bool is_primary_display,
273 const ClientWindowId& client_window_id) {
268 DCHECK(window_manager_state_); // Only called for window manager. 274 DCHECK(window_manager_state_); // Only called for window manager.
275 DVLOG(3) << "SetDisplayRoot client=" << id_
276 << " global window_id=" << client_window_id.id;
269 Display* display = 277 Display* display =
270 window_server_->display_manager()->GetDisplayById(display_id); 278 window_server_->display_manager()->GetDisplayById(display_to_create.id());
271 if (!display) { 279 if (display) {
272 DVLOG(1) << "SetDisplayRoot called with unknown display " << display_id; 280 DVLOG(1) << "SetDisplayRoot called with existing display "
273 return false; 281 << display_to_create.id();
282 return nullptr;
274 } 283 }
275 284
276 if (automatically_create_display_roots_) { 285 if (automatically_create_display_roots_) {
277 DVLOG(1) << "SetDisplayRoot is only applicable when " 286 DVLOG(1) << "SetDisplayRoot is only applicable when "
278 << "automatically_create_display_roots is false"; 287 << "automatically_create_display_roots is false";
279 return false; 288 return nullptr;
280 } 289 }
281 290
282 ServerWindow* window = GetWindowByClientId(client_window_id); 291 ServerWindow* window = GetWindowByClientId(client_window_id);
283 // The window must not have a parent. 292 // The window must not have a parent.
284 if (!window || window->parent()) { 293 if (!window || window->parent()) {
285 DVLOG(1) << "SetDisplayRoot called with invalid window id " 294 DVLOG(1) << "SetDisplayRoot called with invalid window id "
286 << client_window_id.id; 295 << client_window_id.id;
287 return false; 296 return nullptr;
288 } 297 }
289 298
299 if (base::ContainsValue(roots_, window)) {
300 DVLOG(1) << "SetDisplayRoot called with existing root";
301 return nullptr;
302 }
303
304 const display::DisplayList::Type display_type =
305 is_primary_display ? display::DisplayList::Type::PRIMARY
306 : display::DisplayList::Type::NOT_PRIMARY;
307 window_server_->delegate()->GetScreen()->display_list().AddDisplay(
308 display_to_create, display_type);
309 display::ViewportMetrics viewport_metrics;
310 viewport_metrics.bounds_in_pixels =
311 transport_viewport_metrics.bounds_in_pixels;
312 viewport_metrics.device_scale_factor =
313 transport_viewport_metrics.device_scale_factor;
314 viewport_metrics.ui_scale_factor = transport_viewport_metrics.ui_scale_factor;
315 window_server_->display_manager()->AddDisplayForWindowManager(
316 display_to_create, viewport_metrics);
317
318 // OnDisplayAdded() should trigger creation of the Display.
319 display =
320 window_server_->display_manager()->GetDisplayById(display_to_create.id());
321 DCHECK(display);
290 WindowManagerDisplayRoot* display_root = 322 WindowManagerDisplayRoot* display_root =
291 display->GetWindowManagerDisplayRootForUser( 323 display->GetWindowManagerDisplayRootForUser(
292 window_manager_state_->user_id()); 324 window_manager_state_->user_id());
293 DCHECK(display_root); 325 DCHECK(display_root);
294 if (!display_root->root()->children().empty()) { 326 DCHECK(display_root->root()->children().empty());
295 DVLOG(1) << "SetDisplayRoot called more than once";
296 return false;
297 }
298
299 if (base::ContainsValue(roots_, window)) {
300 DVLOG(1) << "SetDisplayRoot called with existing root";
301 return false;
302 }
303 327
304 // NOTE: this doesn't resize the window in anyway. We assume the client takes 328 // NOTE: this doesn't resize the window in anyway. We assume the client takes
305 // care of any modifications it needs to do. 329 // care of any modifications it needs to do.
306 roots_.insert(window); 330 roots_.insert(window);
307 Operation op(this, window_server_, OperationType::ADD_WINDOW); 331 Operation op(this, window_server_, OperationType::ADD_WINDOW);
308 display_root->root()->Add(window); 332 display_root->root()->Add(window);
309 return true; 333 return window;
310 } 334 }
311 335
312 bool WindowTree::SetCapture(const ClientWindowId& client_window_id) { 336 bool WindowTree::SetCapture(const ClientWindowId& client_window_id) {
313 ServerWindow* window = GetWindowByClientId(client_window_id); 337 ServerWindow* window = GetWindowByClientId(client_window_id);
314 WindowManagerDisplayRoot* display_root = GetWindowManagerDisplayRoot(window); 338 WindowManagerDisplayRoot* display_root = GetWindowManagerDisplayRoot(window);
315 ServerWindow* current_capture_window = 339 ServerWindow* current_capture_window =
316 display_root ? display_root->window_manager_state()->capture_window() 340 display_root ? display_root->window_manager_state()->capture_window()
317 : nullptr; 341 : nullptr;
318 if (window && window->IsDrawn() && display_root && 342 if (window && window->IsDrawn() && display_root &&
319 display_root->window_manager_state()->IsActive() && 343 display_root->window_manager_state()->IsActive() &&
(...skipping 20 matching lines...) Expand all
340 return false; 364 return false;
341 } 365 }
342 Operation op(this, window_server_, OperationType::RELEASE_CAPTURE); 366 Operation op(this, window_server_, OperationType::RELEASE_CAPTURE);
343 return display_root->window_manager_state()->SetCapture(nullptr, 367 return display_root->window_manager_state()->SetCapture(nullptr,
344 kInvalidClientId); 368 kInvalidClientId);
345 } 369 }
346 370
347 bool WindowTree::NewWindow( 371 bool WindowTree::NewWindow(
348 const ClientWindowId& client_window_id, 372 const ClientWindowId& client_window_id,
349 const std::map<std::string, std::vector<uint8_t>>& properties) { 373 const std::map<std::string, std::vector<uint8_t>>& properties) {
350 if (!IsValidIdForNewWindow(client_window_id)) 374 DVLOG(3) << "new window client=" << id_
375 << " window_id=" << client_window_id.id;
376 if (!IsValidIdForNewWindow(client_window_id)) {
377 DVLOG(1) << "new window failed, id is not valid for client";
351 return false; 378 return false;
379 }
352 const WindowId window_id = GenerateNewWindowId(); 380 const WindowId window_id = GenerateNewWindowId();
353 DCHECK(!GetWindow(window_id)); 381 DCHECK(!GetWindow(window_id));
354 ServerWindow* window = 382 ServerWindow* window =
355 window_server_->CreateServerWindow(window_id, properties); 383 window_server_->CreateServerWindow(window_id, properties);
356 created_window_map_[window_id] = window; 384 created_window_map_[window_id] = window;
357 client_id_to_window_id_map_[client_window_id] = window_id; 385 client_id_to_window_id_map_[client_window_id] = window_id;
358 window_id_to_client_id_map_[window_id] = client_window_id; 386 window_id_to_client_id_map_[window_id] = client_window_id;
359 return true; 387 return true;
360 } 388 }
361 389
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 const ServerWindow* window = GetWindowByClientId(window_id); 518 const ServerWindow* window = GetWindowByClientId(window_id);
491 std::vector<const ServerWindow*> windows; 519 std::vector<const ServerWindow*> windows;
492 if (window) 520 if (window)
493 GetWindowTreeImpl(window, &windows); 521 GetWindowTreeImpl(window, &windows);
494 return windows; 522 return windows;
495 } 523 }
496 524
497 bool WindowTree::SetWindowVisibility(const ClientWindowId& window_id, 525 bool WindowTree::SetWindowVisibility(const ClientWindowId& window_id,
498 bool visible) { 526 bool visible) {
499 ServerWindow* window = GetWindowByClientId(window_id); 527 ServerWindow* window = GetWindowByClientId(window_id);
500 if (!window || !access_policy_->CanChangeWindowVisibility(window)) 528 DVLOG(3) << "SetWindowVisibility client=" << id_
529 << " client window_id= " << window_id.id << " global window_id="
530 << (window ? WindowIdToTransportId(window->id()) : 0);
531 if (!window) {
532 DVLOG(1) << "SetWindowVisibility failure, no window";
501 return false; 533 return false;
534 }
535 if (!access_policy_->CanChangeWindowVisibility(window)) {
536 DVLOG(1) << "SetWindowVisibility failure, access policy denied change";
537 return false;
538 }
502 if (window->visible() == visible) 539 if (window->visible() == visible)
503 return true; 540 return true;
504 Operation op(this, window_server_, OperationType::SET_WINDOW_VISIBILITY); 541 Operation op(this, window_server_, OperationType::SET_WINDOW_VISIBILITY);
505 window->SetVisible(visible); 542 window->SetVisible(visible);
506 return true; 543 return true;
507 } 544 }
508 545
509 bool WindowTree::SetWindowOpacity(const ClientWindowId& window_id, 546 bool WindowTree::SetWindowOpacity(const ClientWindowId& window_id,
510 float opacity) { 547 float opacity) {
511 ServerWindow* window = GetWindowByClientId(window_id); 548 ServerWindow* window = GetWindowByClientId(window_id);
(...skipping 1586 matching lines...) Expand 10 before | Expand all | Expand 10 after
2098 DVLOG(1) << "SetExtendedHitArea supplied unknown window"; 2135 DVLOG(1) << "SetExtendedHitArea supplied unknown window";
2099 return; 2136 return;
2100 } 2137 }
2101 if (window->id().client_id != id_) { 2138 if (window->id().client_id != id_) {
2102 DVLOG(1) << "SetExtendedHitArea supplied window that client does not own"; 2139 DVLOG(1) << "SetExtendedHitArea supplied window that client does not own";
2103 return; 2140 return;
2104 } 2141 }
2105 window->set_extended_hit_test_region(hit_area); 2142 window->set_extended_hit_test_region(hit_area);
2106 } 2143 }
2107 2144
2108 void WindowTree::SetDisplayRoot(int64_t display_id, 2145 void WindowTree::SetDisplayRoot(
2109 Id window_id, 2146 const display::Display& display,
2110 const SetDisplayRootCallback& callback) { 2147 const mojom::WmViewportMetricsPtr viewport_metrics,
2111 callback.Run(ProcessSetDisplayRoot(display_id, ClientWindowId(window_id))); 2148 bool is_primary_display,
2149 Id window_id,
2150 const SetDisplayRootCallback& callback) {
2151 ServerWindow* display_root =
2152 ProcessSetDisplayRoot(display, *(viewport_metrics.get()),
2153 is_primary_display, ClientWindowId(window_id));
2154 if (!display_root) {
2155 base::Optional<cc::FrameSinkId> frame_sink_id;
2156 callback.Run(frame_sink_id);
kylechar 2017/04/19 18:06:08 Maybe named |empty_frame_sink_id| or just callback
sky 2017/04/19 19:30:03 Done.
2157 return;
2158 }
2159 display_root->parent()->SetVisible(true);
2160 callback.Run(display_root->frame_sink_id());
2112 } 2161 }
2113 2162
2114 void WindowTree::WmResponse(uint32_t change_id, bool response) { 2163 void WindowTree::WmResponse(uint32_t change_id, bool response) {
2115 if (window_server_->in_move_loop() && 2164 if (window_server_->in_move_loop() &&
2116 window_server_->GetCurrentMoveLoopChangeId() == change_id) { 2165 window_server_->GetCurrentMoveLoopChangeId() == change_id) {
2117 ServerWindow* window = window_server_->GetCurrentMoveLoopWindow(); 2166 ServerWindow* window = window_server_->GetCurrentMoveLoopWindow();
2118 2167
2119 if (window->id().client_id != id_) { 2168 if (window->id().client_id != id_) {
2120 window_server_->WindowManagerSentBogusMessage(); 2169 window_server_->WindowManagerSentBogusMessage();
2121 window = nullptr; 2170 window = nullptr;
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
2351 client()->OnCompleteDrop(client_window_id.id, event_flags, cursor_offset, 2400 client()->OnCompleteDrop(client_window_id.id, event_flags, cursor_offset,
2352 effect_bitmask, callback); 2401 effect_bitmask, callback);
2353 } 2402 }
2354 2403
2355 void WindowTree::PerformOnDragDropDone() { 2404 void WindowTree::PerformOnDragDropDone() {
2356 client()->OnDragDropDone(); 2405 client()->OnDragDropDone();
2357 } 2406 }
2358 2407
2359 } // namespace ws 2408 } // namespace ws
2360 } // namespace ui 2409 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698