Index: mojo/services/view_manager/root_view_manager.cc |
diff --git a/mojo/services/view_manager/root_view_manager.cc b/mojo/services/view_manager/root_view_manager.cc |
index 2b73375077cc9c02a2aec1ac497e2b54aeea1796..43ab26f88d0f061c9604c17f1eba7f8bc25cbf7a 100644 |
--- a/mojo/services/view_manager/root_view_manager.cc |
+++ b/mojo/services/view_manager/root_view_manager.cc |
@@ -16,10 +16,98 @@ |
#include "ui/aura/client/focus_client.h" |
#include "ui/aura/client/window_tree_client.h" |
#include "ui/aura/window.h" |
-#include "ui/aura/window_observer.h" |
+#include "ui/aura/window_delegate.h" |
+#include "ui/base/cursor/cursor.h" |
+#include "ui/base/hit_test.h" |
+#include "ui/compositor/layer.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/image/image_skia.h" |
+#include "ui/gfx/native_widget_types.h" |
namespace mojo { |
namespace service { |
+namespace { |
+ |
+gfx::Rect ConvertRectToRoot(const Node* node, const gfx::Rect& bounds) { |
+ gfx::Point origin(bounds.origin()); |
+ while (node->parent()) { |
+ origin += node->bounds().OffsetFromOrigin(); |
+ node = node->parent(); |
+ } |
+ return gfx::Rect(origin, bounds.size()); |
+} |
+ |
+void PaintNodeTree(gfx::Canvas* canvas, |
+ const Node* node, |
+ const gfx::Point& origin) { |
+ if (!node->visible()) |
+ return; |
+ |
+ canvas->DrawImageInt(gfx::ImageSkia::CreateFrom1xBitmap(node->bitmap()), |
+ origin.x(), origin.y()); |
+ std::vector<const Node*> children(node->GetChildren()); |
+ for (size_t i = 0; i < children.size(); ++i) { |
+ PaintNodeTree(canvas, children[i], |
+ origin + children[i]->bounds().OffsetFromOrigin()); |
+ } |
+} |
+ |
+} // namespace |
+ |
+class RootViewManager::RootWindowDelegateImpl : public aura::WindowDelegate { |
+ public: |
+ explicit RootWindowDelegateImpl(const Node* root_node) |
+ : root_node_(root_node) {} |
+ virtual ~RootWindowDelegateImpl() {} |
+ |
+ // aura::WindowDelegate: |
+ virtual gfx::Size GetMinimumSize() const OVERRIDE { |
+ return gfx::Size(); |
+ } |
+ virtual gfx::Size GetMaximumSize() const OVERRIDE { |
+ return gfx::Size(); |
+ } |
+ virtual void OnBoundsChanged(const gfx::Rect& old_bounds, |
+ const gfx::Rect& new_bounds) OVERRIDE { |
+ } |
+ virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE { |
+ return gfx::kNullCursor; |
+ } |
+ virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { |
+ return HTCAPTION; |
+ } |
+ virtual bool ShouldDescendIntoChildForEventHandling( |
+ aura::Window* child, |
+ const gfx::Point& location) OVERRIDE { |
+ return true; |
+ } |
+ virtual bool CanFocus() OVERRIDE { |
+ return true; |
+ } |
+ virtual void OnCaptureLost() OVERRIDE { |
+ } |
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { |
+ PaintNodeTree(canvas, root_node_, gfx::Point()); |
+ } |
+ virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE { |
+ } |
+ virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { |
+ } |
+ virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE { |
+ } |
+ virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE { |
+ } |
+ virtual bool HasHitTestMask() const OVERRIDE { |
+ return false; |
+ } |
+ virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE { |
+ } |
+ |
+ private: |
+ const Node* root_node_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RootWindowDelegateImpl); |
+}; |
// TODO(sky): Remove once aura is removed from the service. |
class FocusClientImpl : public aura::client::FocusClient { |
@@ -76,7 +164,8 @@ RootViewManager::RootViewManager( |
const Callback<void()>& native_viewport_closed_callback) |
: delegate_(delegate), |
root_node_manager_(root_node), |
- in_setup_(false) { |
+ in_setup_(false), |
+ root_window_(NULL) { |
screen_.reset(ScreenImpl::Create()); |
gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get()); |
NativeViewportPtr viewport; |
@@ -102,14 +191,26 @@ RootViewManager::~RootViewManager() { |
gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, NULL); |
} |
+void RootViewManager::SchedulePaint(const Node* node, const gfx::Rect& bounds) { |
+ if (root_window_) |
+ root_window_->SchedulePaintInRect(ConvertRectToRoot(node, bounds)); |
+} |
+ |
void RootViewManager::OnCompositorCreated() { |
base::AutoReset<bool> resetter(&in_setup_, true); |
window_tree_host_->InitHost(); |
- aura::Window* root = root_node_manager_->root()->window(); |
- window_tree_host_->window()->AddChild(root); |
- root->SetBounds(gfx::Rect(window_tree_host_->window()->bounds().size())); |
- root_node_manager_->root()->window()->Show(); |
+ window_delegate_.reset( |
+ new RootWindowDelegateImpl(root_node_manager_->root())); |
+ root_window_ = new aura::Window(window_delegate_.get()); |
+ root_window_->Init(aura::WINDOW_LAYER_TEXTURED); |
+ root_window_->Show(); |
+ root_window_->SetBounds( |
+ gfx::Rect(window_tree_host_->window()->bounds().size())); |
+ window_tree_host_->window()->AddChild(root_window_); |
+ |
+ root_node_manager_->root()->SetBounds( |
+ gfx::Rect(window_tree_host_->window()->bounds().size())); |
window_tree_client_.reset( |
new WindowTreeClientImpl(window_tree_host_->window())); |