| OLD | NEW |
| 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 "components/mus/ws/connection_manager.h" | 5 #include "components/mus/ws/connection_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "components/mus/ws/client_connection.h" | 9 #include "components/mus/ws/client_connection.h" |
| 10 #include "components/mus/ws/connection_manager_delegate.h" | 10 #include "components/mus/ws/connection_manager_delegate.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 ConnectionManager::ConnectionManager( | 25 ConnectionManager::ConnectionManager( |
| 26 ConnectionManagerDelegate* delegate, | 26 ConnectionManagerDelegate* delegate, |
| 27 const scoped_refptr<mus::SurfacesState>& surfaces_state) | 27 const scoped_refptr<mus::SurfacesState>& surfaces_state) |
| 28 : delegate_(delegate), | 28 : delegate_(delegate), |
| 29 surfaces_state_(surfaces_state), | 29 surfaces_state_(surfaces_state), |
| 30 next_connection_id_(1), | 30 next_connection_id_(1), |
| 31 next_host_id_(0), | 31 next_host_id_(0), |
| 32 current_operation_(nullptr), | 32 current_operation_(nullptr), |
| 33 in_destructor_(false), | 33 in_destructor_(false), |
| 34 next_wm_change_id_(0) {} | 34 next_wm_change_id_(0), |
| 35 got_valid_frame_decorations_(false) {} |
| 35 | 36 |
| 36 ConnectionManager::~ConnectionManager() { | 37 ConnectionManager::~ConnectionManager() { |
| 37 in_destructor_ = true; | 38 in_destructor_ = true; |
| 38 | 39 |
| 39 // Copy the HostConnectionMap because it will be mutated as the connections | 40 // Copy the HostConnectionMap because it will be mutated as the connections |
| 40 // are closed. | 41 // are closed. |
| 41 HostConnectionMap host_connection_map(host_connection_map_); | 42 HostConnectionMap host_connection_map(host_connection_map_); |
| 42 for (auto& pair : host_connection_map) | 43 for (auto& pair : host_connection_map) |
| 43 pair.second->CloseConnection(); | 44 pair.second->CloseConnection(); |
| 44 | 45 |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 } | 385 } |
| 385 | 386 |
| 386 void ConnectionManager::ProcessViewportMetricsChanged( | 387 void ConnectionManager::ProcessViewportMetricsChanged( |
| 387 WindowTreeHostImpl* host, | 388 WindowTreeHostImpl* host, |
| 388 const mojom::ViewportMetrics& old_metrics, | 389 const mojom::ViewportMetrics& old_metrics, |
| 389 const mojom::ViewportMetrics& new_metrics) { | 390 const mojom::ViewportMetrics& new_metrics) { |
| 390 for (auto& pair : connection_map_) { | 391 for (auto& pair : connection_map_) { |
| 391 pair.second->service()->ProcessViewportMetricsChanged( | 392 pair.second->service()->ProcessViewportMetricsChanged( |
| 392 host, old_metrics, new_metrics, IsOperationSource(pair.first)); | 393 host, old_metrics, new_metrics, IsOperationSource(pair.first)); |
| 393 } | 394 } |
| 395 |
| 396 if (!got_valid_frame_decorations_) |
| 397 return; |
| 398 } |
| 399 |
| 400 void ConnectionManager::ProcessFrameDecorationValuesChanged( |
| 401 WindowTreeHostImpl* host) { |
| 402 if (!got_valid_frame_decorations_) { |
| 403 got_valid_frame_decorations_ = true; |
| 404 display_manager_observers_.ForAllPtrs([this]( |
| 405 mojom::DisplayManagerObserver* observer) { CallOnDisplays(observer); }); |
| 406 return; |
| 407 } |
| 408 |
| 409 display_manager_observers_.ForAllPtrs( |
| 410 [this, &host](mojom::DisplayManagerObserver* observer) { |
| 411 CallOnDisplayChanged(observer, host); |
| 412 }); |
| 394 } | 413 } |
| 395 | 414 |
| 396 bool ConnectionManager::GetAndClearInFlightWindowManagerChange( | 415 bool ConnectionManager::GetAndClearInFlightWindowManagerChange( |
| 397 uint32_t window_manager_change_id, | 416 uint32_t window_manager_change_id, |
| 398 InFlightWindowManagerChange* change) { | 417 InFlightWindowManagerChange* change) { |
| 399 // There are valid reasons as to why we wouldn't know about the id. The | 418 // There are valid reasons as to why we wouldn't know about the id. The |
| 400 // most likely is the client disconnected before the response from the window | 419 // most likely is the client disconnected before the response from the window |
| 401 // manager came back. | 420 // manager came back. |
| 402 auto iter = in_flight_wm_change_map_.find(window_manager_change_id); | 421 auto iter = in_flight_wm_change_map_.find(window_manager_change_id); |
| 403 if (iter == in_flight_wm_change_map_.end()) | 422 if (iter == in_flight_wm_change_map_.end()) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 425 connection_map_[connection->service()->id()] = connection; | 444 connection_map_[connection->service()->id()] = connection; |
| 426 } | 445 } |
| 427 | 446 |
| 428 void ConnectionManager::MaybeUpdateNativeCursor(ServerWindow* window) { | 447 void ConnectionManager::MaybeUpdateNativeCursor(ServerWindow* window) { |
| 429 // This can be null in unit tests. | 448 // This can be null in unit tests. |
| 430 WindowTreeHostImpl* impl = GetWindowTreeHostByWindow(window); | 449 WindowTreeHostImpl* impl = GetWindowTreeHostByWindow(window); |
| 431 if (impl) | 450 if (impl) |
| 432 impl->MaybeChangeCursorOnWindowTreeChange(); | 451 impl->MaybeChangeCursorOnWindowTreeChange(); |
| 433 } | 452 } |
| 434 | 453 |
| 454 void ConnectionManager::CallOnDisplays( |
| 455 mojom::DisplayManagerObserver* observer) { |
| 456 mojo::Array<mojom::DisplayPtr> displays(host_connection_map_.size()); |
| 457 { |
| 458 size_t i = 0; |
| 459 for (auto& pair : host_connection_map_) { |
| 460 displays[i] = DisplayForHost(pair.first); |
| 461 ++i; |
| 462 } |
| 463 } |
| 464 observer->OnDisplays(std::move(displays)); |
| 465 } |
| 466 |
| 467 void ConnectionManager::CallOnDisplayChanged( |
| 468 mojom::DisplayManagerObserver* observer, |
| 469 WindowTreeHostImpl* host) { |
| 470 mojo::Array<mojom::DisplayPtr> displays(1); |
| 471 displays[0] = DisplayForHost(host); |
| 472 display_manager_observers_.ForAllPtrs( |
| 473 [&displays](mojom::DisplayManagerObserver* observer) { |
| 474 observer->OnDisplaysChanged(displays.Clone()); |
| 475 }); |
| 476 } |
| 477 |
| 478 mojom::DisplayPtr ConnectionManager::DisplayForHost(WindowTreeHostImpl* host) { |
| 479 size_t i = 0; |
| 480 int next_x = 0; |
| 481 for (auto& pair : host_connection_map_) { |
| 482 const ServerWindow* root = host->root_window(); |
| 483 if (pair.first == host) { |
| 484 mojom::DisplayPtr display = mojom::Display::New(); |
| 485 display = mojom::Display::New(); |
| 486 display->id = host->id(); |
| 487 display->bounds = mojo::Rect::New(); |
| 488 display->bounds->x = next_x; |
| 489 display->bounds->y = 0; |
| 490 display->bounds->width = root->bounds().size().width(); |
| 491 display->bounds->height = root->bounds().size().height(); |
| 492 // TODO(sky): window manager needs an API to set the work area. |
| 493 display->work_area = display->bounds.Clone(); |
| 494 display->device_pixel_ratio = |
| 495 host->GetViewportMetrics().device_pixel_ratio; |
| 496 display->rotation = host->GetRotation(); |
| 497 // TODO(sky): make this real. |
| 498 display->is_primary = i == 0; |
| 499 // TODO(sky): make this real. |
| 500 display->touch_support = mojom::TouchSupport::UNKNOWN; |
| 501 display->frame_decoration_values = |
| 502 host->frame_decoration_values().Clone(); |
| 503 return display; |
| 504 } |
| 505 next_x += root->bounds().size().width(); |
| 506 ++i; |
| 507 } |
| 508 NOTREACHED(); |
| 509 return mojom::Display::New(); |
| 510 } |
| 511 |
| 435 mus::SurfacesState* ConnectionManager::GetSurfacesState() { | 512 mus::SurfacesState* ConnectionManager::GetSurfacesState() { |
| 436 return surfaces_state_.get(); | 513 return surfaces_state_.get(); |
| 437 } | 514 } |
| 438 | 515 |
| 439 void ConnectionManager::OnScheduleWindowPaint(const ServerWindow* window) { | 516 void ConnectionManager::OnScheduleWindowPaint(const ServerWindow* window) { |
| 440 if (!in_destructor_) | 517 if (!in_destructor_) |
| 441 SchedulePaint(window, gfx::Rect(window->bounds().size())); | 518 SchedulePaint(window, gfx::Rect(window->bounds().size())); |
| 442 } | 519 } |
| 443 | 520 |
| 444 const ServerWindow* ConnectionManager::GetRootWindow( | 521 const ServerWindow* ConnectionManager::GetRootWindow( |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 // If we're deleting a window, then this is a superfluous message. | 658 // If we're deleting a window, then this is a superfluous message. |
| 582 if (current_operation_type() == OperationType::DELETE_WINDOW) | 659 if (current_operation_type() == OperationType::DELETE_WINDOW) |
| 583 return; | 660 return; |
| 584 for (auto& pair : connection_map_) { | 661 for (auto& pair : connection_map_) { |
| 585 pair.second->service()->ProcessTransientWindowRemoved( | 662 pair.second->service()->ProcessTransientWindowRemoved( |
| 586 window, transient_child, IsOperationSource(pair.first)); | 663 window, transient_child, IsOperationSource(pair.first)); |
| 587 } | 664 } |
| 588 } | 665 } |
| 589 | 666 |
| 590 void ConnectionManager::AddObserver(mojom::DisplayManagerObserverPtr observer) { | 667 void ConnectionManager::AddObserver(mojom::DisplayManagerObserverPtr observer) { |
| 591 mojo::Array<mojom::DisplayPtr> displays(host_connection_map_.size()); | 668 // Many clients key off the frame decorations to size widgets. Wait for frame |
| 592 { | 669 // decorations before notifying so that we don't have to worry about clients |
| 593 size_t i = 0; | 670 // resizing appropriately. |
| 594 int next_x = 0; | 671 if (!got_valid_frame_decorations_) { |
| 595 for (auto& pair : host_connection_map_) { | 672 display_manager_observers_.AddInterfacePtr(std::move(observer)); |
| 596 const WindowTreeHostImpl* tree_host = pair.first; | 673 return; |
| 597 const ServerWindow* root = tree_host->root_window(); | |
| 598 displays[i] = mojom::Display::New(); | |
| 599 displays[i]->id = tree_host->id(); | |
| 600 displays[i]->bounds = mojo::Rect::New(); | |
| 601 displays[i]->bounds->x = next_x; | |
| 602 displays[i]->bounds->y = 0; | |
| 603 displays[i]->bounds->width = root->bounds().size().width(); | |
| 604 displays[i]->bounds->height = root->bounds().size().height(); | |
| 605 next_x += displays[i]->bounds->width; | |
| 606 // TODO(sky): window manager needs an API to set the work area. | |
| 607 displays[i]->work_area = displays[i]->bounds.Clone(); | |
| 608 displays[i]->device_pixel_ratio = | |
| 609 tree_host->GetViewportMetrics().device_pixel_ratio; | |
| 610 displays[i]->rotation = tree_host->GetRotation(); | |
| 611 // TODO(sky): make this real. | |
| 612 displays[i]->is_primary = i == 0; | |
| 613 // TODO(sky): make this real. | |
| 614 displays[i]->touch_support = mojom::TouchSupport::UNKNOWN; | |
| 615 ++i; | |
| 616 } | |
| 617 } | 674 } |
| 618 observer->OnDisplays(std::move(displays)); | 675 CallOnDisplays(observer.get()); |
| 619 display_manager_observers_.AddInterfacePtr(std::move(observer)); | 676 display_manager_observers_.AddInterfacePtr(std::move(observer)); |
| 620 } | 677 } |
| 621 | 678 |
| 622 } // namespace ws | 679 } // namespace ws |
| 623 } // namespace mus | 680 } // namespace mus |
| OLD | NEW |