summaryrefslogtreecommitdiffstats
path: root/components/mus/ws/window_server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/mus/ws/window_server.cc')
-rw-r--r--components/mus/ws/window_server.cc47
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) {