window_manager_app.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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
3// found in the LICENSE file.
4
5#include "mojo/services/window_manager/window_manager_app.h"
6
7#include "base/message_loop/message_loop.h"
8#include "mojo/aura/aura_init.h"
9#include "mojo/aura/window_tree_host_mojo.h"
10#include "mojo/public/cpp/application/application_connection.h"
11#include "mojo/services/public/cpp/view_manager/node.h"
12#include "mojo/services/public/cpp/view_manager/view_manager.h"
13#include "mojo/services/window_manager/window_manager_service_impl.h"
14#include "ui/wm/core/capture_controller.h"
15
16namespace mojo {
17
18////////////////////////////////////////////////////////////////////////////////
19// WindowManagerApp, public:
20
21WindowManagerApp::WindowManagerApp() : view_manager_(NULL), root_(NULL) {}
22WindowManagerApp::~WindowManagerApp() {}
23
24void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) {
25  DCHECK(connections_.find(connection) == connections_.end());
26  connections_.insert(connection);
27}
28
29void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) {
30  DCHECK(connections_.find(connection) != connections_.end());
31  connections_.erase(connection);
32}
33
34view_manager::Id WindowManagerApp::OpenWindow() {
35  view_manager::Node* node = view_manager::Node::Create(view_manager_);
36  root_->AddChild(node);
37  return node->id();
38}
39
40void WindowManagerApp::SetCapture(view_manager::Id node) {
41  capture_client_->capture_client()->SetCapture(GetWindowForNodeId(node));
42  // TODO(beng): notify connected clients that capture has changed, probably
43  //             by implementing some capture-client observer.
44}
45
46bool WindowManagerApp::IsReady() const {
47  return view_manager_ && root_;
48}
49
50////////////////////////////////////////////////////////////////////////////////
51// WindowManagerApp, ApplicationDelegate implementation:
52
53void WindowManagerApp::Initialize(ApplicationImpl* impl) {
54  aura_init_.reset(new AuraInit);
55}
56
57bool WindowManagerApp::ConfigureIncomingConnection(
58    ApplicationConnection* connection) {
59  connection->AddService<WindowManagerServiceImpl>(this);
60  view_manager::ViewManager::ConfigureIncomingConnection(connection, this);
61  return true;
62}
63
64////////////////////////////////////////////////////////////////////////////////
65// WindowManagerApp, view_manager::ViewManagerDelegate implementation:
66
67void WindowManagerApp::OnRootAdded(view_manager::ViewManager* view_manager,
68                                   view_manager::Node* root) {
69  DCHECK(!view_manager_ && !root_);
70  view_manager_ = view_manager;
71  root_ = root;
72
73  window_tree_host_.reset(new WindowTreeHostMojo(root_, this));
74
75  capture_client_.reset(
76      new wm::ScopedCaptureClient(window_tree_host_->window()));
77
78  // TODO(beng): Create the universe.
79
80  for (Connections::const_iterator it = connections_.begin();
81       it != connections_.end(); ++it) {
82    (*it)->NotifyReady();
83  }
84}
85
86void WindowManagerApp::OnViewManagerDisconnected(
87    view_manager::ViewManager* view_manager) {
88  DCHECK_EQ(view_manager_, view_manager);
89  view_manager_ = NULL;
90  base::MessageLoop::current()->Quit();
91}
92
93////////////////////////////////////////////////////////////////////////////////
94// WindowManagerApp, WindowTreeHostMojoDelegate implementation:
95
96void WindowManagerApp::CompositorContentsChanged(const SkBitmap& bitmap) {
97  // We draw nothing.
98  NOTREACHED();
99}
100
101////////////////////////////////////////////////////////////////////////////////
102// WindowManagerApp, private:
103
104aura::Window* WindowManagerApp::GetWindowForNodeId(
105    view_manager::Id node) const {
106  NOTIMPLEMENTED();
107  return NULL;
108}
109
110////////////////////////////////////////////////////////////////////////////////
111// ApplicationDelegate, public:
112
113// static
114ApplicationDelegate* ApplicationDelegate::Create() {
115  return new WindowManagerApp;
116}
117
118}  // namespace mojo
119