diff options
Diffstat (limited to 'components/mus/ws/window_server.cc')
-rw-r--r-- | components/mus/ws/window_server.cc | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/components/mus/ws/window_server.cc b/components/mus/ws/window_server.cc index 3bfadc2..fdef43c 100644 --- a/components/mus/ws/window_server.cc +++ b/components/mus/ws/window_server.cc @@ -77,9 +77,14 @@ WindowTree* WindowServer::EmbedAtWindow( WindowTree* tree = tree_ptr.get(); mojom::WindowTreePtr window_tree_ptr; - scoped_ptr<WindowTreeBinding> binding = - delegate_->CreateWindowTreeBindingForEmbedAtWindow( - this, tree, GetProxy(&window_tree_ptr), std::move(client)); + mojom::WindowTreeRequest window_tree_request = GetProxy(&window_tree_ptr); + scoped_ptr<WindowTreeBinding> binding = delegate_->CreateWindowTreeBinding( + WindowServerDelegate::BindingType::EMBED, this, tree, + &window_tree_request, &client); + if (!binding) { + binding.reset(new ws::DefaultWindowTreeBinding( + tree, this, std::move(window_tree_request), std::move(client))); + } AddTree(std::move(tree_ptr), std::move(binding), std::move(window_tree_ptr)); OnTreeMessagedClient(tree->id()); @@ -107,9 +112,17 @@ WindowTree* WindowServer::CreateTreeForWindowManager( scoped_ptr<WindowTree> tree_ptr(new WindowTree( this, user_id, root, make_scoped_ptr(new WindowManagerAccessPolicy))); WindowTree* tree = tree_ptr.get(); - scoped_ptr<DefaultWindowTreeBinding> binding(new DefaultWindowTreeBinding( - tree_ptr.get(), this, std::move(tree_client))); - mojom::WindowTreePtr window_tree_ptr = binding->CreateInterfacePtrAndBind(); + mojom::WindowTreePtr window_tree_ptr; + mojom::WindowTreeRequest tree_request; + scoped_ptr<WindowTreeBinding> binding = delegate_->CreateWindowTreeBinding( + WindowServerDelegate::BindingType::WINDOW_MANAGER, this, tree, + &tree_request, &tree_client); + if (!binding) { + DefaultWindowTreeBinding* default_binding = new DefaultWindowTreeBinding( + tree_ptr.get(), this, std::move(tree_client)); + binding.reset(default_binding); + window_tree_ptr = default_binding->CreateInterfacePtrAndBind(); + } AddTree(std::move(tree_ptr), std::move(binding), std::move(window_tree_ptr)); tree->ConfigureWindowManager(); return tree; @@ -224,6 +237,28 @@ void WindowServer::OnFirstWindowManagerFactorySet() { delegate_->CreateDefaultDisplays(); } +void WindowServer::SetFocusedWindow(ServerWindow* window) { + // TODO(sky): this should fail if there is modal dialog active and |window| + // is outside that. + Display* focused_display = nullptr; + for (Display* display : display_manager_->displays()) { + if (display->GetFocusedWindow()) { + focused_display = display; + break; + } + } + Display* display = display_manager_->GetDisplayContaining(window); + DCHECK(display); // It's assumed callers do validation before calling this. + display->SetFocusedWindow(window); + // If the focus actually changed, and focus was in another display, then we + // need to notify the previously focused display so that it cleans up state + // and notifies appropriately. + if (window && display->GetFocusedWindow() && display != focused_display && + focused_display) { + focused_display->SetFocusedWindow(nullptr); + } +} + uint32_t WindowServer::GenerateWindowManagerChangeId( WindowTree* source, uint32_t client_change_id) { |