diff options
Diffstat (limited to 'mojo/services/window_manager/window_manager_app.h')
-rw-r--r-- | mojo/services/window_manager/window_manager_app.h | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/mojo/services/window_manager/window_manager_app.h b/mojo/services/window_manager/window_manager_app.h new file mode 100644 index 0000000..f91be46 --- /dev/null +++ b/mojo/services/window_manager/window_manager_app.h @@ -0,0 +1,213 @@ +// 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. + +#ifndef SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_ +#define SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_ + +#include <set> + +#include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" +#include "mojo/public/cpp/application/application_delegate.h" +#include "mojo/public/cpp/application/interface_factory_impl.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/string.h" +#include "mojo/services/window_manager/capture_controller_observer.h" +#include "mojo/services/window_manager/focus_controller_observer.h" +#include "mojo/services/window_manager/native_viewport_event_dispatcher_impl.h" +#include "mojo/services/window_manager/view_target.h" +#include "mojo/services/window_manager/window_manager_impl.h" +#include "third_party/mojo_services/src/view_manager/public/cpp/types.h" +#include "third_party/mojo_services/src/view_manager/public/cpp/view_manager_client_factory.h" +#include "third_party/mojo_services/src/view_manager/public/cpp/view_manager_delegate.h" +#include "third_party/mojo_services/src/view_manager/public/cpp/view_observer.h" +#include "third_party/mojo_services/src/window_manager/public/interfaces/window_manager_internal.mojom.h" +#include "ui/base/accelerators/accelerator_manager.h" +#include "ui/events/event_handler.h" + +namespace gfx { +class Size; +} + +namespace window_manager { + +class CaptureController; +class FocusController; +class FocusRules; +class ViewEventDispatcher; +class WindowManagerDelegate; +class WindowManagerImpl; + +// Implements core window manager functionality that could conceivably be shared +// across multiple window managers implementing superficially different user +// experiences. Establishes communication with the view manager. +// A window manager wishing to use this core should create and own an instance +// of this object. They may implement the associated ViewManager/WindowManager +// delegate interfaces exposed by the view manager, this object provides the +// canonical implementation of said interfaces but will call out to the wrapped +// instances. +class WindowManagerApp + : public mojo::ApplicationDelegate, + public mojo::ViewManagerDelegate, + public mojo::ViewObserver, + public ui::EventHandler, + public FocusControllerObserver, + public CaptureControllerObserver, + public mojo::InterfaceFactory<mojo::WindowManager>, + public mojo::InterfaceFactory<mojo::WindowManagerInternal>, + public mojo::InterfaceFactory<mojo::NativeViewportEventDispatcher>, + public mojo::WindowManagerInternal { + public: + WindowManagerApp(ViewManagerDelegate* view_manager_delegate, + WindowManagerDelegate* window_manager_delegate); + ~WindowManagerApp() override; + + ViewEventDispatcher* event_dispatcher() { + return view_event_dispatcher_.get(); + } + + // Register/deregister new connections to the window manager service. + void AddConnection(WindowManagerImpl* connection); + void RemoveConnection(WindowManagerImpl* connection); + + // These are canonical implementations of the window manager API methods. + bool SetCapture(mojo::Id view); + bool FocusWindow(mojo::Id view); + bool ActivateWindow(mojo::Id view); + + void DispatchInputEventToView(mojo::View* view, mojo::EventPtr event); + void SetViewportSize(const gfx::Size& size); + + bool IsReady() const; + + FocusController* focus_controller() { return focus_controller_.get(); } + CaptureController* capture_controller() { return capture_controller_.get(); } + + void InitFocus(scoped_ptr<FocusRules> rules); + + ui::AcceleratorManager* accelerator_manager() { + return &accelerator_manager_; + } + + // WindowManagerImpl::Embed() forwards to this. If connected to ViewManager + // then forwards to delegate, otherwise waits for connection to establish then + // forwards. + void Embed(const mojo::String& url, + mojo::InterfaceRequest<mojo::ServiceProvider> services, + mojo::ServiceProviderPtr exposed_services); + + // Overridden from ApplicationDelegate: + void Initialize(mojo::ApplicationImpl* impl) override; + bool ConfigureIncomingConnection( + mojo::ApplicationConnection* connection) override; + + private: + // TODO(sky): rename this. Connections is ambiguous. + typedef std::set<WindowManagerImpl*> Connections; + typedef std::set<mojo::Id> RegisteredViewIdSet; + + struct PendingEmbed; + class WindowManagerInternalImpl; + + mojo::ViewManager* view_manager() { + return root_ ? root_->view_manager() : nullptr; + } + + bool SetCaptureImpl(mojo::View* view); + bool FocusWindowImpl(mojo::View* view); + bool ActivateWindowImpl(mojo::View* view); + + ui::Accelerator ConvertEventToAccelerator(const ui::KeyEvent* event); + + // Creates an ViewTarget for every view in the hierarchy beneath |view|, + // and adds to the registry so that it can be retrieved later via + // GetViewTargetForViewId(). + // TODO(beng): perhaps View should have a property bag. + void RegisterSubtree(mojo::View* view); + + // Recursively invokes Unregister() for |view| and all its descendants. + void UnregisterSubtree(mojo::View* view); + + // Deletes the ViewTarget associated with the hierarchy beneath |id|, + // and removes from the registry. + void Unregister(mojo::View* view); + + // Overridden from ViewManagerDelegate: + void OnEmbed(mojo::View* root, + mojo::InterfaceRequest<mojo::ServiceProvider> services, + mojo::ServiceProviderPtr exposed_services) override; + void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override; + bool OnPerformAction(mojo::View* view, const std::string& action) override; + + // Overridden from ViewObserver: + void OnTreeChanged(const ViewObserver::TreeChangeParams& params) override; + void OnViewDestroying(mojo::View* view) override; + + // Overridden from ui::EventHandler: + void OnEvent(ui::Event* event) override; + + // Overridden from mojo::FocusControllerObserver: + void OnFocused(mojo::View* gained_focus) override; + void OnActivated(mojo::View* gained_active) override; + + // Overridden from mojo::CaptureControllerObserver: + void OnCaptureChanged(mojo::View* gained_capture) override; + + // Creates the connection to the ViewManager. + void LaunchViewManager(mojo::ApplicationImpl* app); + + // InterfaceFactory<WindowManagerInternal>: + void Create( + mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mojo::WindowManagerInternal> request) override; + + // InterfaceFactory<WindowManager>: + void Create(mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mojo::WindowManager> request) override; + + // InterfaceFactory<NativeViewportEventDispatcher>: + void Create(mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mojo::NativeViewportEventDispatcher> + request) override; + + // WindowManagerInternal: + void CreateWindowManagerForViewManagerClient( + uint16_t connection_id, + mojo::ScopedMessagePipeHandle window_manager_pipe) override; + void SetViewManagerClient( + mojo::ScopedMessagePipeHandle view_manager_client_request) override; + + mojo::Shell* shell_; + + ViewManagerDelegate* wrapped_view_manager_delegate_; + WindowManagerDelegate* window_manager_delegate_; + + mojo::ViewManagerServicePtr view_manager_service_; + scoped_ptr<mojo::ViewManagerClientFactory> view_manager_client_factory_; + mojo::View* root_; + + scoped_ptr<FocusController> focus_controller_; + scoped_ptr<CaptureController> capture_controller_; + + ui::AcceleratorManager accelerator_manager_; + + Connections connections_; + RegisteredViewIdSet registered_view_id_set_; + + mojo::WindowManagerInternalClientPtr window_manager_client_; + + ScopedVector<PendingEmbed> pending_embeds_; + + scoped_ptr<mojo::ViewManagerClient> view_manager_client_; + + scoped_ptr<ViewEventDispatcher> view_event_dispatcher_; + + scoped_ptr<mojo::Binding<WindowManagerInternal>> wm_internal_binding_; + + DISALLOW_COPY_AND_ASSIGN(WindowManagerApp); +}; + +} // namespace window_manager + +#endif // SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_ |