Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / mojo / services / view_manager / window_tree_host_impl.cc
index c344ba4..9f201b0 100644 (file)
@@ -1,13 +1,15 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Copyright 2013 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 "mojo/services/view_manager/root_node_manager.h"
 #include "mojo/services/view_manager/window_tree_host_impl.h"
-
 #include "mojo/public/c/gles2/gles2.h"
 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
+#include "mojo/services/public/cpp/input_events/input_events_type_converters.h"
 #include "mojo/services/view_manager/context_factory_impl.h"
 #include "ui/aura/env.h"
+#include "ui/aura/layout_manager.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/compositor/compositor.h"
@@ -17,7 +19,6 @@
 #include "ui/gfx/geometry/rect.h"
 
 namespace mojo {
-namespace view_manager {
 namespace service {
 
 // TODO(sky): nuke this. It shouldn't be static.
@@ -25,14 +26,55 @@ namespace service {
 ContextFactoryImpl* WindowTreeHostImpl::context_factory_ = NULL;
 
 ////////////////////////////////////////////////////////////////////////////////
+// RootLayoutManager, layout management for the root window's (one) child
+
+class RootLayoutManager : public aura::LayoutManager {
+ public:
+  RootLayoutManager() : child_(NULL) {}
+
+  // Overridden from aura::LayoutManager
+  virtual void OnWindowResized() OVERRIDE;
+  virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE;
+  virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {}
+  virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {}
+  virtual void OnChildWindowVisibilityChanged(aura::Window* child,
+                                              bool visible) OVERRIDE {}
+  virtual void SetChildBounds(aura::Window* child,
+                              const gfx::Rect& requested_bounds) OVERRIDE;
+ private:
+  aura::Window* child_;
+
+  DISALLOW_COPY_AND_ASSIGN(RootLayoutManager);
+};
+
+void RootLayoutManager::OnWindowResized() {
+  if (child_)
+    child_->SetBounds(gfx::Rect(child_->parent()->bounds().size()));
+}
+
+void RootLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
+  DCHECK(!child_);
+  child_ = child;
+}
+
+void RootLayoutManager::SetChildBounds(aura::Window* child,
+                                       const gfx::Rect& requested_bounds) {
+  SetChildBoundsDirect(child, gfx::Rect(requested_bounds.size()));
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // WindowTreeHostImpl, public:
 
 WindowTreeHostImpl::WindowTreeHostImpl(
     NativeViewportPtr viewport,
     const gfx::Rect& bounds,
-    const base::Callback<void()>& compositor_created_callback)
+    const Callback<void()>& compositor_created_callback,
+    const Callback<void()>& native_viewport_closed_callback,
+    const Callback<void(EventPtr)>& event_received_callback)
     : native_viewport_(viewport.Pass()),
       compositor_created_callback_(compositor_created_callback),
+      native_viewport_closed_callback_(native_viewport_closed_callback),
+      event_received_callback_(event_received_callback),
       bounds_(bounds) {
   native_viewport_.set_client(this);
   native_viewport_->Create(Rect::From(bounds));
@@ -48,7 +90,8 @@ WindowTreeHostImpl::WindowTreeHostImpl(
   }
   context_factory_ = new ContextFactoryImpl(pipe.handle1.Pass());
   aura::Env::GetInstance()->set_context_factory(context_factory_);
-  CHECK(context_factory_) << "No GL bindings.";
+
+  window()->SetLayoutManager(new RootLayoutManager());
 }
 
 WindowTreeHostImpl::~WindowTreeHostImpl() {
@@ -103,10 +146,6 @@ void WindowTreeHostImpl::PostNativeEvent(
   NOTIMPLEMENTED();
 }
 
-void WindowTreeHostImpl::OnDeviceScaleFactorChanged(float device_scale_factor) {
-  NOTIMPLEMENTED();
-}
-
 void WindowTreeHostImpl::SetCursorNative(gfx::NativeCursor cursor) {
   NOTIMPLEMENTED();
 }
@@ -139,39 +178,18 @@ void WindowTreeHostImpl::OnBoundsChanged(RectPtr bounds) {
   OnHostResized(bounds_.size());
 }
 
-void WindowTreeHostImpl::OnDestroyed() {
-  base::MessageLoop::current()->Quit();
+void WindowTreeHostImpl::OnDestroyed(const mojo::Callback<void()>& callback) {
+  DestroyCompositor();
+  native_viewport_closed_callback_.Run();
+  // TODO(beng): quit the message loop once we are on our own thread.
+  callback.Run();
 }
 
 void WindowTreeHostImpl::OnEvent(EventPtr event,
                                  const mojo::Callback<void()>& callback) {
-  switch (event->action) {
-    case ui::ET_MOUSE_PRESSED:
-    case ui::ET_MOUSE_DRAGGED:
-    case ui::ET_MOUSE_RELEASED:
-    case ui::ET_MOUSE_MOVED:
-    case ui::ET_MOUSE_ENTERED:
-    case ui::ET_MOUSE_EXITED: {
-      gfx::Point location(event->location->x, event->location->y);
-      ui::MouseEvent ev(static_cast<ui::EventType>(event->action), location,
-                        location, event->flags, 0);
-      SendEventToProcessor(&ev);
-      break;
-    }
-    case ui::ET_KEY_PRESSED:
-    case ui::ET_KEY_RELEASED: {
-      ui::KeyEvent ev(
-          static_cast<ui::EventType>(event->action),
-          static_cast<ui::KeyboardCode>(event->key_data->key_code),
-          event->flags, event->key_data->is_char);
-      SendEventToProcessor(&ev);
-      break;
-    }
-    // TODO(beng): touch, etc.
-  }
+  event_received_callback_.Run(event.Pass());
   callback.Run();
 };
 
 }  // namespace service
-}  // namespace view_manager
 }  // namespace mojo