| OLD | NEW |
| (Empty) |
| 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 "components/window_manager/window_manager_app.h" | |
| 6 | |
| 7 #include "base/message_loop/message_loop.h" | |
| 8 #include "base/stl_util.h" | |
| 9 #include "components/view_manager/public/cpp/view.h" | |
| 10 #include "components/view_manager/public/cpp/view_manager.h" | |
| 11 #include "components/window_manager/window_manager_delegate.h" | |
| 12 #include "mojo/application/public/cpp/application_connection.h" | |
| 13 #include "mojo/application/public/cpp/application_impl.h" | |
| 14 #include "mojo/application/public/interfaces/shell.mojom.h" | |
| 15 #include "mojo/converters/geometry/geometry_type_converters.h" | |
| 16 | |
| 17 using mojo::ApplicationConnection; | |
| 18 using mojo::Id; | |
| 19 using mojo::ServiceProvider; | |
| 20 using mojo::View; | |
| 21 using mojo::WindowManager; | |
| 22 | |
| 23 namespace window_manager { | |
| 24 | |
| 25 // Used for calls to Embed() that occur before we've connected to the | |
| 26 // ViewManager. | |
| 27 struct WindowManagerApp::PendingEmbed { | |
| 28 mojo::String url; | |
| 29 mojo::InterfaceRequest<ServiceProvider> services; | |
| 30 mojo::ServiceProviderPtr exposed_services; | |
| 31 }; | |
| 32 | |
| 33 //////////////////////////////////////////////////////////////////////////////// | |
| 34 // WindowManagerApp, public: | |
| 35 | |
| 36 WindowManagerApp::WindowManagerApp( | |
| 37 ViewManagerDelegate* view_manager_delegate, | |
| 38 WindowManagerDelegate* window_manager_delegate) | |
| 39 : shell_(nullptr), | |
| 40 wrapped_view_manager_delegate_(view_manager_delegate), | |
| 41 window_manager_delegate_(window_manager_delegate), | |
| 42 root_(nullptr) { | |
| 43 } | |
| 44 | |
| 45 WindowManagerApp::~WindowManagerApp() { | |
| 46 // TODO(msw|sky): Should this destructor explicitly delete the ViewManager? | |
| 47 if (root_) | |
| 48 root_->RemoveObserver(this); | |
| 49 | |
| 50 STLDeleteElements(&connections_); | |
| 51 } | |
| 52 | |
| 53 void WindowManagerApp::AddConnection(WindowManagerImpl* connection) { | |
| 54 DCHECK(connections_.find(connection) == connections_.end()); | |
| 55 connections_.insert(connection); | |
| 56 } | |
| 57 | |
| 58 void WindowManagerApp::RemoveConnection(WindowManagerImpl* connection) { | |
| 59 DCHECK(connections_.find(connection) != connections_.end()); | |
| 60 connections_.erase(connection); | |
| 61 } | |
| 62 | |
| 63 bool WindowManagerApp::IsReady() const { | |
| 64 return !!root_; | |
| 65 } | |
| 66 | |
| 67 void WindowManagerApp::AddAccelerator(mojo::KeyboardCode keyboard_code, | |
| 68 mojo::EventFlags flags) { | |
| 69 window_manager_client_->AddAccelerator(keyboard_code, flags); | |
| 70 } | |
| 71 | |
| 72 void WindowManagerApp::Embed( | |
| 73 const mojo::String& url, | |
| 74 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
| 75 mojo::ServiceProviderPtr exposed_services) { | |
| 76 if (view_manager()) { | |
| 77 window_manager_delegate_->Embed(url, services.Pass(), | |
| 78 exposed_services.Pass()); | |
| 79 return; | |
| 80 } | |
| 81 scoped_ptr<PendingEmbed> pending_embed(new PendingEmbed); | |
| 82 pending_embed->url = url; | |
| 83 pending_embed->services = services.Pass(); | |
| 84 pending_embed->exposed_services = exposed_services.Pass(); | |
| 85 pending_embeds_.push_back(pending_embed.release()); | |
| 86 } | |
| 87 | |
| 88 //////////////////////////////////////////////////////////////////////////////// | |
| 89 // WindowManagerApp, ApplicationDelegate implementation: | |
| 90 | |
| 91 void WindowManagerApp::Initialize(mojo::ApplicationImpl* impl) { | |
| 92 shell_ = impl->shell(); | |
| 93 LaunchViewManager(impl); | |
| 94 } | |
| 95 | |
| 96 bool WindowManagerApp::ConfigureIncomingConnection( | |
| 97 ApplicationConnection* connection) { | |
| 98 connection->AddService<WindowManager>(this); | |
| 99 return true; | |
| 100 } | |
| 101 | |
| 102 //////////////////////////////////////////////////////////////////////////////// | |
| 103 // WindowManagerApp, ViewManagerDelegate implementation: | |
| 104 | |
| 105 void WindowManagerApp::OnEmbed( | |
| 106 View* root, | |
| 107 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
| 108 mojo::ServiceProviderPtr exposed_services) { | |
| 109 DCHECK(!root_); | |
| 110 root_ = root; | |
| 111 | |
| 112 root_->AddObserver(this); | |
| 113 | |
| 114 if (wrapped_view_manager_delegate_) { | |
| 115 wrapped_view_manager_delegate_->OnEmbed(root, services.Pass(), | |
| 116 exposed_services.Pass()); | |
| 117 } | |
| 118 | |
| 119 for (PendingEmbed* pending_embed : pending_embeds_) { | |
| 120 Embed(pending_embed->url, pending_embed->services.Pass(), | |
| 121 pending_embed->exposed_services.Pass()); | |
| 122 } | |
| 123 pending_embeds_.clear(); | |
| 124 } | |
| 125 | |
| 126 void WindowManagerApp::OnViewManagerDisconnected( | |
| 127 mojo::ViewManager* view_manager) { | |
| 128 if (wrapped_view_manager_delegate_) | |
| 129 wrapped_view_manager_delegate_->OnViewManagerDisconnected(view_manager); | |
| 130 | |
| 131 base::MessageLoop* message_loop = base::MessageLoop::current(); | |
| 132 if (message_loop && message_loop->is_running()) | |
| 133 message_loop->Quit(); | |
| 134 } | |
| 135 | |
| 136 //////////////////////////////////////////////////////////////////////////////// | |
| 137 // WindowManagerApp, ViewObserver implementation: | |
| 138 | |
| 139 void WindowManagerApp::OnViewDestroying(View* view) { | |
| 140 DCHECK_EQ(root_, view); | |
| 141 root_->RemoveObserver(this); | |
| 142 root_ = nullptr; | |
| 143 } | |
| 144 | |
| 145 //////////////////////////////////////////////////////////////////////////////// | |
| 146 // WindowManagerApp, private: | |
| 147 | |
| 148 void WindowManagerApp::DispatchInputEventToViewDEPRECATED( | |
| 149 View* view, | |
| 150 mojo::EventPtr event) { | |
| 151 window_manager_client_->DispatchInputEventToViewDEPRECATED(view->id(), | |
| 152 event.Pass()); | |
| 153 } | |
| 154 | |
| 155 void WindowManagerApp::SetViewportSize(const gfx::Size& size) { | |
| 156 window_manager_client_->SetViewportSize(mojo::Size::From(size)); | |
| 157 } | |
| 158 | |
| 159 void WindowManagerApp::LaunchViewManager(mojo::ApplicationImpl* app) { | |
| 160 // TODO(sky): figure out logic if this connection goes away. | |
| 161 view_manager_client_factory_.reset( | |
| 162 new mojo::ViewManagerClientFactory(shell_, this)); | |
| 163 | |
| 164 ApplicationConnection* view_manager_app = | |
| 165 app->ConnectToApplication("mojo:view_manager"); | |
| 166 view_manager_app->ConnectToService(&view_manager_service_); | |
| 167 | |
| 168 view_manager_app->AddService<WindowManagerInternal>(this); | |
| 169 | |
| 170 view_manager_app->ConnectToService(&window_manager_client_); | |
| 171 } | |
| 172 | |
| 173 void WindowManagerApp::Create( | |
| 174 ApplicationConnection* connection, | |
| 175 mojo::InterfaceRequest<WindowManagerInternal> request) { | |
| 176 if (wm_internal_binding_.get()) { | |
| 177 VLOG(1) << | |
| 178 "WindowManager allows only one WindowManagerInternal connection."; | |
| 179 return; | |
| 180 } | |
| 181 wm_internal_binding_.reset( | |
| 182 new mojo::Binding<WindowManagerInternal>(this, request.Pass())); | |
| 183 } | |
| 184 | |
| 185 void WindowManagerApp::Create(ApplicationConnection* connection, | |
| 186 mojo::InterfaceRequest<WindowManager> request) { | |
| 187 WindowManagerImpl* wm = new WindowManagerImpl(this, false); | |
| 188 wm->Bind(request.PassMessagePipe()); | |
| 189 // WindowManagerImpl is deleted when the connection has an error, or from our | |
| 190 // destructor. | |
| 191 } | |
| 192 | |
| 193 void WindowManagerApp::SetViewManagerClient( | |
| 194 mojo::ScopedMessagePipeHandle view_manager_client_request) { | |
| 195 view_manager_client_.reset( | |
| 196 mojo::ViewManagerClientFactory::WeakBindViewManagerToPipe( | |
| 197 mojo::MakeRequest<mojo::ViewManagerClient>( | |
| 198 view_manager_client_request.Pass()), | |
| 199 view_manager_service_.Pass(), shell_, this)); | |
| 200 } | |
| 201 | |
| 202 void WindowManagerApp::OnAccelerator(mojo::EventPtr event) { | |
| 203 window_manager_delegate_->OnAcceleratorPressed( | |
| 204 root_->view_manager()->GetFocusedView(), | |
| 205 event->key_data->windows_key_code, event->flags); | |
| 206 } | |
| 207 | |
| 208 } // namespace window_manager | |
| OLD | NEW |