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 "mojo/services/window_manager/window_manager_app.h" | 5 #include "mojo/services/window_manager/window_manager_app.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/stl_util.h" |
8 #include "mojo/aura/aura_init.h" | 9 #include "mojo/aura/aura_init.h" |
9 #include "mojo/aura/window_tree_host_mojo.h" | 10 #include "mojo/aura/window_tree_host_mojo.h" |
10 #include "mojo/public/cpp/application/application_connection.h" | 11 #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/node.h" |
12 #include "mojo/services/public/cpp/view_manager/view_manager.h" | 13 #include "mojo/services/public/cpp/view_manager/view_manager.h" |
13 #include "mojo/services/window_manager/window_manager_service_impl.h" | 14 #include "mojo/services/window_manager/window_manager_service_impl.h" |
| 15 #include "ui/aura/window.h" |
| 16 #include "ui/aura/window_property.h" |
14 #include "ui/wm/core/capture_controller.h" | 17 #include "ui/wm/core/capture_controller.h" |
| 18 #include "ui/wm/core/focus_controller.h" |
| 19 #include "ui/wm/core/focus_rules.h" |
| 20 #include "ui/wm/public/activation_client.h" |
| 21 |
| 22 DECLARE_WINDOW_PROPERTY_TYPE(mojo::view_manager::Node*); |
15 | 23 |
16 namespace mojo { | 24 namespace mojo { |
| 25 namespace { |
| 26 |
| 27 DEFINE_WINDOW_PROPERTY_KEY(view_manager::Node*, kNodeKey, NULL); |
| 28 |
| 29 view_manager::Id GetIdForWindow(aura::Window* window) { |
| 30 return window ? window->GetProperty(kNodeKey)->id() : 0; |
| 31 } |
| 32 |
| 33 class WMFocusRules : public wm::FocusRules { |
| 34 public: |
| 35 WMFocusRules() {} |
| 36 virtual ~WMFocusRules() {} |
| 37 |
| 38 private: |
| 39 // Overridden from wm::FocusRules: |
| 40 virtual bool IsToplevelWindow(aura::Window* window) const MOJO_OVERRIDE { |
| 41 return true; |
| 42 } |
| 43 virtual bool CanActivateWindow(aura::Window* window) const MOJO_OVERRIDE { |
| 44 return true; |
| 45 } |
| 46 virtual bool CanFocusWindow(aura::Window* window) const MOJO_OVERRIDE { |
| 47 return true; |
| 48 } |
| 49 virtual aura::Window* GetToplevelWindow( |
| 50 aura::Window* window) const MOJO_OVERRIDE { |
| 51 return window; |
| 52 } |
| 53 virtual aura::Window* GetActivatableWindow( |
| 54 aura::Window* window) const MOJO_OVERRIDE { |
| 55 return window; |
| 56 } |
| 57 virtual aura::Window* GetFocusableWindow( |
| 58 aura::Window* window) const MOJO_OVERRIDE { |
| 59 return window; |
| 60 } |
| 61 virtual aura::Window* GetNextActivatableWindow( |
| 62 aura::Window* ignore) const MOJO_OVERRIDE { |
| 63 return NULL; |
| 64 } |
| 65 |
| 66 DISALLOW_COPY_AND_ASSIGN(WMFocusRules); |
| 67 }; |
| 68 |
| 69 } // namespace |
17 | 70 |
18 //////////////////////////////////////////////////////////////////////////////// | 71 //////////////////////////////////////////////////////////////////////////////// |
19 // WindowManagerApp, public: | 72 // WindowManagerApp, public: |
20 | 73 |
21 WindowManagerApp::WindowManagerApp() : view_manager_(NULL), root_(NULL) {} | 74 WindowManagerApp::WindowManagerApp() : view_manager_(NULL), root_(NULL) {} |
22 WindowManagerApp::~WindowManagerApp() {} | 75 WindowManagerApp::~WindowManagerApp() { |
| 76 // TODO(beng): Figure out if this should be done in |
| 77 // OnViewManagerDisconnected(). |
| 78 STLDeleteValues(&node_id_to_window_map_); |
| 79 if (focus_client_.get()) |
| 80 focus_client_->RemoveObserver(this); |
| 81 if (activation_client_) |
| 82 activation_client_->RemoveObserver(this); |
| 83 } |
23 | 84 |
24 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) { | 85 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) { |
25 DCHECK(connections_.find(connection) == connections_.end()); | 86 DCHECK(connections_.find(connection) == connections_.end()); |
26 connections_.insert(connection); | 87 connections_.insert(connection); |
27 } | 88 } |
28 | 89 |
29 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) { | 90 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) { |
30 DCHECK(connections_.find(connection) != connections_.end()); | 91 DCHECK(connections_.find(connection) != connections_.end()); |
31 connections_.erase(connection); | 92 connections_.erase(connection); |
32 } | 93 } |
33 | 94 |
34 view_manager::Id WindowManagerApp::OpenWindow() { | 95 view_manager::Id WindowManagerApp::OpenWindow() { |
35 view_manager::Node* node = view_manager::Node::Create(view_manager_); | 96 view_manager::Node* node = view_manager::Node::Create(view_manager_); |
36 root_->AddChild(node); | 97 root_->AddChild(node); |
37 return node->id(); | 98 return node->id(); |
38 } | 99 } |
39 | 100 |
| 101 view_manager::Id WindowManagerApp::OpenWindowWithURL(const String& url) { |
| 102 view_manager::Node* node = view_manager::Node::Create(view_manager_); |
| 103 root_->AddChild(node); |
| 104 node->Embed(url); |
| 105 return node->id(); |
| 106 } |
| 107 |
40 void WindowManagerApp::SetCapture(view_manager::Id node) { | 108 void WindowManagerApp::SetCapture(view_manager::Id node) { |
41 capture_client_->capture_client()->SetCapture(GetWindowForNodeId(node)); | 109 capture_client_->capture_client()->SetCapture(GetWindowForNodeId(node)); |
42 // TODO(beng): notify connected clients that capture has changed, probably | 110 // TODO(beng): notify connected clients that capture has changed, probably |
43 // by implementing some capture-client observer. | 111 // by implementing some capture-client observer. |
44 } | 112 } |
45 | 113 |
| 114 void WindowManagerApp::FocusWindow(view_manager::Id node) { |
| 115 aura::Window* window = GetWindowForNodeId(node); |
| 116 DCHECK(window); |
| 117 focus_client_->FocusWindow(window); |
| 118 } |
| 119 |
| 120 void WindowManagerApp::ActivateWindow(view_manager::Id node) { |
| 121 aura::Window* window = GetWindowForNodeId(node); |
| 122 DCHECK(window); |
| 123 activation_client_->ActivateWindow(window); |
| 124 } |
| 125 |
46 bool WindowManagerApp::IsReady() const { | 126 bool WindowManagerApp::IsReady() const { |
47 return view_manager_ && root_; | 127 return view_manager_ && root_; |
48 } | 128 } |
49 | 129 |
50 //////////////////////////////////////////////////////////////////////////////// | 130 //////////////////////////////////////////////////////////////////////////////// |
51 // WindowManagerApp, ApplicationDelegate implementation: | 131 // WindowManagerApp, ApplicationDelegate implementation: |
52 | 132 |
53 void WindowManagerApp::Initialize(ApplicationImpl* impl) { | 133 void WindowManagerApp::Initialize(ApplicationImpl* impl) { |
54 aura_init_.reset(new AuraInit); | 134 aura_init_.reset(new AuraInit); |
55 } | 135 } |
56 | 136 |
57 bool WindowManagerApp::ConfigureIncomingConnection( | 137 bool WindowManagerApp::ConfigureIncomingConnection( |
58 ApplicationConnection* connection) { | 138 ApplicationConnection* connection) { |
59 connection->AddService<WindowManagerServiceImpl>(this); | 139 connection->AddService<WindowManagerServiceImpl>(this); |
60 view_manager::ViewManager::ConfigureIncomingConnection(connection, this); | 140 view_manager::ViewManager::ConfigureIncomingConnection(connection, this); |
61 return true; | 141 return true; |
62 } | 142 } |
63 | 143 |
64 //////////////////////////////////////////////////////////////////////////////// | 144 //////////////////////////////////////////////////////////////////////////////// |
65 // WindowManagerApp, view_manager::ViewManagerDelegate implementation: | 145 // WindowManagerApp, view_manager::ViewManagerDelegate implementation: |
66 | 146 |
67 void WindowManagerApp::OnRootAdded(view_manager::ViewManager* view_manager, | 147 void WindowManagerApp::OnRootAdded(view_manager::ViewManager* view_manager, |
68 view_manager::Node* root) { | 148 view_manager::Node* root) { |
69 DCHECK(!view_manager_ && !root_); | 149 DCHECK(!view_manager_ && !root_); |
70 view_manager_ = view_manager; | 150 view_manager_ = view_manager; |
71 root_ = root; | 151 root_ = root; |
| 152 root_->AddObserver(this); |
72 | 153 |
73 window_tree_host_.reset(new WindowTreeHostMojo(root_, this)); | 154 window_tree_host_.reset(new WindowTreeHostMojo(root_, this)); |
74 | 155 |
| 156 RegisterSubtree(root_->id(), window_tree_host_->window()); |
| 157 |
75 capture_client_.reset( | 158 capture_client_.reset( |
76 new wm::ScopedCaptureClient(window_tree_host_->window())); | 159 new wm::ScopedCaptureClient(window_tree_host_->window())); |
| 160 wm::FocusController* focus_controller = |
| 161 new wm::FocusController(new WMFocusRules); |
| 162 activation_client_ = focus_controller; |
| 163 focus_client_.reset(focus_controller); |
| 164 |
| 165 focus_client_->AddObserver(this); |
| 166 activation_client_->AddObserver(this); |
77 | 167 |
78 // TODO(beng): Create the universe. | 168 // TODO(beng): Create the universe. |
79 | 169 |
80 for (Connections::const_iterator it = connections_.begin(); | 170 for (Connections::const_iterator it = connections_.begin(); |
81 it != connections_.end(); ++it) { | 171 it != connections_.end(); ++it) { |
82 (*it)->NotifyReady(); | 172 (*it)->NotifyReady(); |
83 } | 173 } |
84 } | 174 } |
85 | 175 |
86 void WindowManagerApp::OnViewManagerDisconnected( | 176 void WindowManagerApp::OnViewManagerDisconnected( |
87 view_manager::ViewManager* view_manager) { | 177 view_manager::ViewManager* view_manager) { |
88 DCHECK_EQ(view_manager_, view_manager); | 178 DCHECK_EQ(view_manager_, view_manager); |
| 179 root_->RemoveObserver(this); |
| 180 root_ = NULL; |
89 view_manager_ = NULL; | 181 view_manager_ = NULL; |
90 base::MessageLoop::current()->Quit(); | 182 base::MessageLoop::current()->Quit(); |
91 } | 183 } |
92 | 184 |
93 //////////////////////////////////////////////////////////////////////////////// | 185 //////////////////////////////////////////////////////////////////////////////// |
| 186 // WindowManagerApp, view_manager::NodeObserver implementation: |
| 187 |
| 188 void WindowManagerApp::OnTreeChanged( |
| 189 const view_manager::NodeObserver::TreeChangeParams& params) { |
| 190 DCHECK_EQ(params.receiver, root_); |
| 191 DCHECK(params.old_parent || params.new_parent); |
| 192 if (!params.target) |
| 193 return; |
| 194 |
| 195 if (params.new_parent) { |
| 196 if (node_id_to_window_map_.find(params.target->id()) == |
| 197 node_id_to_window_map_.end()) { |
| 198 NodeIdToWindowMap::const_iterator it = |
| 199 node_id_to_window_map_.find(params.new_parent->id()); |
| 200 DCHECK(it != node_id_to_window_map_.end()); |
| 201 RegisterSubtree(params.target->id(), it->second); |
| 202 } |
| 203 } else if (params.old_parent) { |
| 204 UnregisterSubtree(params.target->id()); |
| 205 } |
| 206 } |
| 207 |
| 208 //////////////////////////////////////////////////////////////////////////////// |
94 // WindowManagerApp, WindowTreeHostMojoDelegate implementation: | 209 // WindowManagerApp, WindowTreeHostMojoDelegate implementation: |
95 | 210 |
96 void WindowManagerApp::CompositorContentsChanged(const SkBitmap& bitmap) { | 211 void WindowManagerApp::CompositorContentsChanged(const SkBitmap& bitmap) { |
97 // We draw nothing. | 212 // We draw nothing. |
98 NOTREACHED(); | 213 NOTREACHED(); |
99 } | 214 } |
100 | 215 |
101 //////////////////////////////////////////////////////////////////////////////// | 216 //////////////////////////////////////////////////////////////////////////////// |
| 217 // WindowManagerApp, aura::client::FocusChangeObserver implementation: |
| 218 |
| 219 void WindowManagerApp::OnWindowFocused(aura::Window* gained_focus, |
| 220 aura::Window* lost_focus) { |
| 221 for (Connections::const_iterator it = connections_.begin(); |
| 222 it != connections_.end(); ++it) { |
| 223 (*it)->NotifyNodeFocused(GetIdForWindow(gained_focus), |
| 224 GetIdForWindow(lost_focus)); |
| 225 } |
| 226 } |
| 227 |
| 228 //////////////////////////////////////////////////////////////////////////////// |
| 229 // WindowManagerApp, aura::client::ActivationChangeObserver implementation: |
| 230 |
| 231 void WindowManagerApp::OnWindowActivated(aura::Window* gained_active, |
| 232 aura::Window* lost_active) { |
| 233 for (Connections::const_iterator it = connections_.begin(); |
| 234 it != connections_.end(); ++it) { |
| 235 (*it)->NotifyWindowActivated(GetIdForWindow(gained_active), |
| 236 GetIdForWindow(lost_active)); |
| 237 } |
| 238 } |
| 239 |
| 240 //////////////////////////////////////////////////////////////////////////////// |
102 // WindowManagerApp, private: | 241 // WindowManagerApp, private: |
103 | 242 |
104 aura::Window* WindowManagerApp::GetWindowForNodeId( | 243 aura::Window* WindowManagerApp::GetWindowForNodeId( |
105 view_manager::Id node) const { | 244 view_manager::Id node) const { |
106 NOTIMPLEMENTED(); | 245 NodeIdToWindowMap::const_iterator it = node_id_to_window_map_.find(node); |
107 return NULL; | 246 return it != node_id_to_window_map_.end() ? it->second : NULL; |
| 247 } |
| 248 |
| 249 void WindowManagerApp::RegisterSubtree(view_manager::Id id, |
| 250 aura::Window* parent) { |
| 251 view_manager::Node* node = view_manager_->GetNodeById(id); |
| 252 DCHECK(node_id_to_window_map_.find(id) == node_id_to_window_map_.end()); |
| 253 aura::Window* window = new aura::Window(NULL); |
| 254 window->SetProperty(kNodeKey, node); |
| 255 parent->AddChild(window); |
| 256 node_id_to_window_map_[id] = window; |
| 257 view_manager::Node::Children::const_iterator it = node->children().begin(); |
| 258 for (; it != node->children().end(); ++it) |
| 259 RegisterSubtree((*it)->id(), window); |
| 260 } |
| 261 |
| 262 void WindowManagerApp::UnregisterSubtree(view_manager::Id id) { |
| 263 view_manager::Node* node = view_manager_->GetNodeById(id); |
| 264 NodeIdToWindowMap::const_iterator it = node_id_to_window_map_.find(id); |
| 265 DCHECK(it != node_id_to_window_map_.end()); |
| 266 scoped_ptr<aura::Window> window(it->second); |
| 267 node_id_to_window_map_.erase(it); |
| 268 view_manager::Node::Children::const_iterator child = node->children().begin(); |
| 269 for (; child != node->children().end(); ++child) |
| 270 UnregisterSubtree((*child)->id()); |
108 } | 271 } |
109 | 272 |
110 //////////////////////////////////////////////////////////////////////////////// | 273 //////////////////////////////////////////////////////////////////////////////// |
111 // ApplicationDelegate, public: | 274 // ApplicationDelegate, public: |
112 | 275 |
113 // static | 276 // static |
114 ApplicationDelegate* ApplicationDelegate::Create() { | 277 ApplicationDelegate* ApplicationDelegate::Create() { |
115 return new WindowManagerApp; | 278 return new WindowManagerApp; |
116 } | 279 } |
117 | 280 |
118 } // namespace mojo | 281 } // namespace mojo |
OLD | NEW |