OLD | NEW |
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 "ui/aura/mus/window_port_mus.h" | 5 #include "ui/aura/mus/window_port_mus.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "ui/aura/client/aura_constants.h" | 8 #include "ui/aura/client/aura_constants.h" |
9 #include "ui/aura/client/transient_window_client.h" | 9 #include "ui/aura/client/transient_window_client.h" |
10 #include "ui/aura/mus/client_surface_embedder.h" | 10 #include "ui/aura/mus/client_surface_embedder.h" |
11 #include "ui/aura/mus/property_converter.h" | 11 #include "ui/aura/mus/property_converter.h" |
12 #include "ui/aura/mus/window_tree_client.h" | 12 #include "ui/aura/mus/window_tree_client.h" |
13 #include "ui/aura/mus/window_tree_client_delegate.h" | 13 #include "ui/aura/mus/window_tree_client_delegate.h" |
14 #include "ui/aura/window.h" | 14 #include "ui/aura/window.h" |
15 #include "ui/aura/window_delegate.h" | 15 #include "ui/aura/window_delegate.h" |
16 #include "ui/aura/window_observer.h" | 16 #include "ui/aura/window_observer.h" |
17 #include "ui/base/class_property.h" | 17 #include "ui/base/class_property.h" |
| 18 #include "ui/display/display.h" |
| 19 #include "ui/display/screen.h" |
18 | 20 |
19 namespace aura { | 21 namespace aura { |
20 | 22 |
| 23 namespace { |
| 24 // Helper function to get the device_scale_factor() of the display::Display |
| 25 // nearest to |window|. |
| 26 float ScaleFactorForDisplay(Window* window) { |
| 27 return display::Screen::GetScreen() |
| 28 ->GetDisplayNearestWindow(window) |
| 29 .device_scale_factor(); |
| 30 } |
| 31 } // namespace |
| 32 |
21 WindowPortMus::WindowMusChangeDataImpl::WindowMusChangeDataImpl() = default; | 33 WindowPortMus::WindowMusChangeDataImpl::WindowMusChangeDataImpl() = default; |
22 | 34 |
23 WindowPortMus::WindowMusChangeDataImpl::~WindowMusChangeDataImpl() = default; | 35 WindowPortMus::WindowMusChangeDataImpl::~WindowMusChangeDataImpl() = default; |
24 | 36 |
25 // static | 37 // static |
26 WindowMus* WindowMus::Get(Window* window) { | 38 WindowMus* WindowMus::Get(Window* window) { |
27 return WindowPortMus::Get(window); | 39 return WindowPortMus::Get(window); |
28 } | 40 } |
29 | 41 |
30 WindowPortMus::WindowPortMus(WindowTreeClient* client, | 42 WindowPortMus::WindowPortMus(WindowTreeClient* client, |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 | 289 |
278 void WindowPortMus::SetFrameSinkIdFromServer( | 290 void WindowPortMus::SetFrameSinkIdFromServer( |
279 const cc::FrameSinkId& frame_sink_id) { | 291 const cc::FrameSinkId& frame_sink_id) { |
280 frame_sink_id_ = frame_sink_id; | 292 frame_sink_id_ = frame_sink_id; |
281 if (!pending_compositor_frame_sink_request_.is_null()) { | 293 if (!pending_compositor_frame_sink_request_.is_null()) { |
282 // TOP_LEVEL_IN_WM, and EMBED_IN_OWNER windows should not be requesting | 294 // TOP_LEVEL_IN_WM, and EMBED_IN_OWNER windows should not be requesting |
283 // CompositorFrameSinks. | 295 // CompositorFrameSinks. |
284 DCHECK_NE(WindowMusType::TOP_LEVEL_IN_WM, window_mus_type()); | 296 DCHECK_NE(WindowMusType::TOP_LEVEL_IN_WM, window_mus_type()); |
285 DCHECK_NE(WindowMusType::EMBED_IN_OWNER, window_mus_type()); | 297 DCHECK_NE(WindowMusType::EMBED_IN_OWNER, window_mus_type()); |
286 base::ResetAndReturn(&pending_compositor_frame_sink_request_).Run(); | 298 base::ResetAndReturn(&pending_compositor_frame_sink_request_).Run(); |
| 299 return; |
287 } | 300 } |
288 // TODO(fsamuel): If the window type is TOP_LEVEL_IN_WM or EMBED_IN_OWNER then | 301 UpdatePrimarySurfaceInfo(); |
289 // we should check if we have a cc::LocalSurfaeId ready as well. If we do, | |
290 // then we are ready to embed. | |
291 } | 302 } |
292 | 303 |
293 const cc::LocalSurfaceId& WindowPortMus::GetOrAllocateLocalSurfaceId( | 304 const cc::LocalSurfaceId& WindowPortMus::GetOrAllocateLocalSurfaceId( |
294 const gfx::Size& surface_size) { | 305 const gfx::Size& surface_size) { |
295 if (last_surface_size_ == surface_size && local_surface_id_.is_valid()) | 306 if (last_surface_size_ == surface_size && local_surface_id_.is_valid()) |
296 return local_surface_id_; | 307 return local_surface_id_; |
297 | 308 |
298 local_surface_id_ = local_surface_id_allocator_.GenerateId(); | 309 local_surface_id_ = local_surface_id_allocator_.GenerateId(); |
299 last_surface_size_ = surface_size; | 310 last_surface_size_ = surface_size; |
300 | 311 |
301 // TODO(fsamuel): If surface synchronization is enabled and the FrameSinkId | 312 // If surface synchronization is enabled and the FrameSinkId is available, |
302 // is available, then immediately embed the SurfaceId. The newly generated | 313 // then immediately embed the SurfaceId. The newly generated frame by the |
303 // frame by the embedder will block in the display compositor until the | 314 // embedder will block in the display compositor until the child submits a |
304 // child submits a corresponding CompositorFrame or a deadline hits. | 315 // corresponding CompositorFrame or a deadline hits. |
| 316 if (window_tree_client_->enable_surface_synchronization_ && |
| 317 frame_sink_id_.is_valid()) { |
| 318 UpdatePrimarySurfaceInfo(); |
| 319 } |
305 | 320 |
306 return local_surface_id_; | 321 return local_surface_id_; |
307 } | 322 } |
308 | 323 |
309 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { | 324 void WindowPortMus::SetPrimarySurfaceInfo(const cc::SurfaceInfo& surface_info) { |
310 primary_surface_info_ = surface_info; | 325 primary_surface_info_ = surface_info; |
311 UpdatePrimarySurfaceInfoInternal(); | 326 UpdateClientSurfaceEmbedder(); |
| 327 } |
| 328 |
| 329 void WindowPortMus::SetFallbackSurfaceInfo( |
| 330 const cc::SurfaceInfo& surface_info) { |
| 331 DCHECK(client_surface_embedder_); |
| 332 client_surface_embedder_->SetFallbackSurfaceInfo(surface_info); |
312 } | 333 } |
313 | 334 |
314 void WindowPortMus::DestroyFromServer() { | 335 void WindowPortMus::DestroyFromServer() { |
315 std::unique_ptr<ScopedServerChange> remove_from_parent_change; | 336 std::unique_ptr<ScopedServerChange> remove_from_parent_change; |
316 if (window_->parent()) { | 337 if (window_->parent()) { |
317 ServerChangeData data; | 338 ServerChangeData data; |
318 data.child_id = server_id(); | 339 data.child_id = server_id(); |
319 WindowPortMus* parent = Get(window_->parent()); | 340 WindowPortMus* parent = Get(window_->parent()); |
320 remove_from_parent_change = base::MakeUnique<ScopedServerChange>( | 341 remove_from_parent_change = base::MakeUnique<ScopedServerChange>( |
321 parent, ServerChangeType::REMOVE, data); | 342 parent, ServerChangeType::REMOVE, data); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 window_tree_client_->OnWindowMusMoveChild(this, current_index, dest_index); | 471 window_tree_client_->OnWindowMusMoveChild(this, current_index, dest_index); |
451 } | 472 } |
452 } | 473 } |
453 | 474 |
454 void WindowPortMus::OnVisibilityChanged(bool visible) { | 475 void WindowPortMus::OnVisibilityChanged(bool visible) { |
455 ServerChangeData change_data; | 476 ServerChangeData change_data; |
456 change_data.visible = visible; | 477 change_data.visible = visible; |
457 if (!RemoveChangeByTypeAndData(ServerChangeType::VISIBLE, change_data)) | 478 if (!RemoveChangeByTypeAndData(ServerChangeType::VISIBLE, change_data)) |
458 window_tree_client_->OnWindowMusSetVisible(this, visible); | 479 window_tree_client_->OnWindowMusSetVisible(this, visible); |
459 // We should only embed a client if its visible. | 480 // We should only embed a client if its visible. |
460 UpdatePrimarySurfaceInfoInternal(); | 481 UpdateClientSurfaceEmbedder(); |
461 } | 482 } |
462 | 483 |
463 void WindowPortMus::OnDidChangeBounds(const gfx::Rect& old_bounds, | 484 void WindowPortMus::OnDidChangeBounds(const gfx::Rect& old_bounds, |
464 const gfx::Rect& new_bounds) { | 485 const gfx::Rect& new_bounds) { |
465 ServerChangeData change_data; | 486 ServerChangeData change_data; |
466 change_data.bounds_in_dip = new_bounds; | 487 change_data.bounds_in_dip = new_bounds; |
467 if (!RemoveChangeByTypeAndData(ServerChangeType::BOUNDS, change_data)) | 488 if (!RemoveChangeByTypeAndData(ServerChangeType::BOUNDS, change_data)) |
468 window_tree_client_->OnWindowMusBoundsChanged(this, old_bounds, new_bounds); | 489 window_tree_client_->OnWindowMusBoundsChanged(this, old_bounds, new_bounds); |
469 } | 490 } |
470 | 491 |
(...skipping 20 matching lines...) Expand all Loading... |
491 change_data.property_name = | 512 change_data.property_name = |
492 GetPropertyConverter()->GetTransportNameForPropertyKey(key); | 513 GetPropertyConverter()->GetTransportNameForPropertyKey(key); |
493 // TODO(sky): investigate to see if we need to compare data. In particular do | 514 // TODO(sky): investigate to see if we need to compare data. In particular do |
494 // we ever have a case where changing a property cascades into changing the | 515 // we ever have a case where changing a property cascades into changing the |
495 // same property? | 516 // same property? |
496 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data)) | 517 if (!RemoveChangeByTypeAndData(ServerChangeType::PROPERTY, change_data)) |
497 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value, | 518 window_tree_client_->OnWindowMusPropertyChanged(this, key, old_value, |
498 std::move(data)); | 519 std::move(data)); |
499 } | 520 } |
500 | 521 |
501 void WindowPortMus::UpdatePrimarySurfaceInfoInternal() { | 522 void WindowPortMus::UpdatePrimarySurfaceInfo() { |
| 523 bool embeds_surface = window_mus_type() == WindowMusType::TOP_LEVEL_IN_WM || |
| 524 window_mus_type() == WindowMusType::EMBED_IN_OWNER; |
| 525 if (!embeds_surface) |
| 526 return; |
| 527 |
| 528 if (!frame_sink_id_.is_valid() || !local_surface_id_.is_valid()) |
| 529 return; |
| 530 |
| 531 primary_surface_info_ = |
| 532 cc::SurfaceInfo(cc::SurfaceId(frame_sink_id_, local_surface_id_), |
| 533 ScaleFactorForDisplay(window_), last_surface_size_); |
| 534 |
| 535 UpdateClientSurfaceEmbedder(); |
| 536 } |
| 537 |
| 538 void WindowPortMus::UpdateClientSurfaceEmbedder() { |
502 if (!client_surface_embedder_ && primary_surface_info_.is_valid()) | 539 if (!client_surface_embedder_ && primary_surface_info_.is_valid()) |
503 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>(window_); | 540 client_surface_embedder_ = base::MakeUnique<ClientSurfaceEmbedder>(window_); |
504 | 541 |
505 if (primary_surface_info_.is_valid() && window_->IsVisible()) | 542 if (primary_surface_info_.is_valid() && window_->IsVisible()) |
506 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_); | 543 client_surface_embedder_->SetPrimarySurfaceInfo(primary_surface_info_); |
507 else | 544 else |
508 client_surface_embedder_.reset(); | 545 client_surface_embedder_.reset(); |
509 } | 546 } |
510 | 547 |
511 } // namespace aura | 548 } // namespace aura |
OLD | NEW |