| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/window_manager/window_manager_impl.h" |
| |
| #include "mojo/services/view_manager/public/cpp/view.h" |
| #include "services/window_manager/capture_controller.h" |
| #include "services/window_manager/focus_controller.h" |
| #include "services/window_manager/window_manager_app.h" |
| |
| using mojo::Callback; |
| using mojo::Id; |
| |
| namespace window_manager { |
| |
| WindowManagerImpl::WindowManagerImpl(WindowManagerApp* window_manager, |
| bool from_vm) |
| : window_manager_(window_manager), from_vm_(from_vm), binding_(this) { |
| window_manager_->AddConnection(this); |
| binding_.set_error_handler(this); |
| } |
| |
| WindowManagerImpl::~WindowManagerImpl() { |
| window_manager_->RemoveConnection(this); |
| } |
| |
| void WindowManagerImpl::Bind( |
| mojo::ScopedMessagePipeHandle window_manager_pipe) { |
| binding_.Bind(window_manager_pipe.Pass()); |
| } |
| |
| void WindowManagerImpl::NotifyViewFocused(Id focused_id) { |
| if (from_vm_ && observer_) |
| observer_->OnFocusChanged(focused_id); |
| } |
| |
| void WindowManagerImpl::NotifyWindowActivated(Id active_id) { |
| if (from_vm_ && observer_) |
| observer_->OnActiveWindowChanged(active_id); |
| } |
| |
| void WindowManagerImpl::NotifyCaptureChanged(Id capture_id) { |
| if (from_vm_ && observer_) |
| observer_->OnCaptureChanged(capture_id); |
| } |
| |
| void WindowManagerImpl::Embed( |
| const mojo::String& url, |
| mojo::InterfaceRequest<mojo::ServiceProvider> services, |
| mojo::ServiceProviderPtr exposed_services) { |
| window_manager_->Embed(url, services.Pass(), exposed_services.Pass()); |
| } |
| |
| void WindowManagerImpl::SetCapture(Id view, |
| const Callback<void(bool)>& callback) { |
| callback.Run(from_vm_ && window_manager_->IsReady() && |
| window_manager_->SetCapture(view)); |
| } |
| |
| void WindowManagerImpl::FocusWindow(Id view, |
| const Callback<void(bool)>& callback) { |
| callback.Run(from_vm_ && window_manager_->IsReady() && |
| window_manager_->FocusWindow(view)); |
| } |
| |
| void WindowManagerImpl::ActivateWindow(Id view, |
| const Callback<void(bool)>& callback) { |
| callback.Run(from_vm_ && window_manager_->IsReady() && |
| window_manager_->ActivateWindow(view)); |
| } |
| |
| void WindowManagerImpl::GetFocusedAndActiveViews( |
| mojo::WindowManagerObserverPtr observer, |
| const mojo::WindowManager::GetFocusedAndActiveViewsCallback& callback) { |
| observer_ = observer.Pass(); |
| if (!window_manager_->focus_controller()) { |
| // TODO(sky): add typedef for 0. |
| callback.Run(0, 0, 0); |
| return; |
| } |
| mojo::View* capture_view = |
| window_manager_->capture_controller()->GetCapture(); |
| mojo::View* active_view = |
| window_manager_->focus_controller()->GetActiveView(); |
| mojo::View* focused_view = |
| window_manager_->focus_controller()->GetFocusedView(); |
| // TODO(sky): sanitize ids for client. |
| callback.Run(capture_view ? capture_view->id() : 0, |
| focused_view ? focused_view->id() : 0, |
| active_view ? active_view->id() : 0); |
| } |
| |
| void WindowManagerImpl::OnConnectionError() { |
| delete this; |
| } |
| |
| } // namespace window_manager |