Index: mojo/services/window_manager/window_manager_app.h |
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 0000000000000000000000000000000000000000..f91be46c398c077df2a2eeb8fc17af26629de606 |
--- /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_ |