| Index: mojo/services/view_manager/display_manager.cc
|
| diff --git a/mojo/services/view_manager/display_manager.cc b/mojo/services/view_manager/display_manager.cc
|
| index aa4e631b2026402f88e99bbf9e194fdea5949b05..d42e2823a8d37cd05f6d408cb24120c4be3d36a1 100644
|
| --- a/mojo/services/view_manager/display_manager.cc
|
| +++ b/mojo/services/view_manager/display_manager.cc
|
| @@ -4,25 +4,15 @@
|
|
|
| #include "mojo/services/view_manager/display_manager.h"
|
|
|
| -#include "base/auto_reset.h"
|
| -#include "base/scoped_observer.h"
|
| +#include "base/numerics/safe_conversions.h"
|
| +#include "cc/surfaces/surface_id_allocator.h"
|
| #include "mojo/public/cpp/application/application_connection.h"
|
| +#include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
|
| +#include "mojo/services/public/cpp/surfaces/surfaces_type_converters.h"
|
| +#include "mojo/services/public/cpp/surfaces/surfaces_utils.h"
|
| #include "mojo/services/public/interfaces/gpu/gpu.mojom.h"
|
| +#include "mojo/services/public/interfaces/surfaces/quads.mojom.h"
|
| #include "mojo/services/view_manager/connection_manager.h"
|
| -#include "mojo/services/view_manager/display_manager_delegate.h"
|
| -#include "mojo/services/view_manager/screen_impl.h"
|
| -#include "mojo/services/view_manager/window_tree_host_impl.h"
|
| -#include "ui/aura/client/default_capture_client.h"
|
| -#include "ui/aura/client/focus_client.h"
|
| -#include "ui/aura/client/window_tree_client.h"
|
| -#include "ui/aura/window.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 {
|
| @@ -33,200 +23,146 @@ gfx::Rect ConvertRectToRoot(const ServerView* view, const gfx::Rect& bounds) {
|
| while (view->parent()) {
|
| origin += view->bounds().OffsetFromOrigin();
|
| view = view->parent();
|
| + if (!view->visible())
|
| + return gfx::Rect();
|
| }
|
| return gfx::Rect(origin, bounds.size());
|
| }
|
|
|
| -void PaintViewTree(gfx::Canvas* canvas,
|
| - const ServerView* view,
|
| - const gfx::Point& origin) {
|
| +void DrawViewTree(Pass* pass, const ServerView* view) {
|
| if (!view->visible())
|
| return;
|
|
|
| - canvas->DrawImageInt(gfx::ImageSkia::CreateFrom1xBitmap(view->bitmap()),
|
| - origin.x(),
|
| - origin.y());
|
| - std::vector<const ServerView*> children(view->GetChildren());
|
| - for (size_t i = 0; i < children.size(); ++i) {
|
| - PaintViewTree(
|
| - canvas, children[i], origin + children[i]->bounds().OffsetFromOrigin());
|
| - }
|
| -}
|
| + cc::SurfaceId node_id = view->surface_id();
|
|
|
| -} // namespace
|
| + SurfaceQuadStatePtr surface_quad_state = SurfaceQuadState::New();
|
| + surface_quad_state->surface = SurfaceId::From(node_id);
|
|
|
| -class DisplayManager::RootWindowDelegateImpl : public aura::WindowDelegate {
|
| - public:
|
| - explicit RootWindowDelegateImpl(ConnectionManager* connection_manager)
|
| - : connection_manager_(connection_manager) {}
|
| - virtual ~RootWindowDelegateImpl() {}
|
| + const gfx::Rect& node_bounds = view->bounds();
|
| + gfx::Transform node_transform;
|
| + node_transform.Translate(node_bounds.x(), node_bounds.y());
|
|
|
| - // 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 {
|
| - connection_manager_->ProcessViewBoundsChanged(connection_manager_->root(),
|
| - old_bounds,
|
| - new_bounds);
|
| - }
|
| - 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 {
|
| - PaintViewTree(canvas, connection_manager_->root(), 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 {
|
| - }
|
| + QuadPtr surface_quad = Quad::New();
|
| + surface_quad->material = Material::MATERIAL_SURFACE_CONTENT;
|
| + surface_quad->rect = Rect::From(node_bounds);
|
| + surface_quad->opaque_rect = Rect::From(node_bounds);
|
| + surface_quad->visible_rect = Rect::From(node_bounds);
|
| + surface_quad->needs_blending = true;
|
| + surface_quad->shared_quad_state_index =
|
| + base::saturated_cast<int32_t>(pass->shared_quad_states.size());
|
| + surface_quad->surface_quad_state = surface_quad_state.Pass();
|
|
|
| - private:
|
| - ConnectionManager* connection_manager_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RootWindowDelegateImpl);
|
| -};
|
| -
|
| -// TODO(sky): Remove once aura is removed from the service.
|
| -class FocusClientImpl : public aura::client::FocusClient {
|
| - public:
|
| - FocusClientImpl() {}
|
| - virtual ~FocusClientImpl() {}
|
| -
|
| - private:
|
| - // Overridden from aura::client::FocusClient:
|
| - virtual void AddObserver(
|
| - aura::client::FocusChangeObserver* observer) OVERRIDE {}
|
| - virtual void RemoveObserver(
|
| - aura::client::FocusChangeObserver* observer) OVERRIDE {}
|
| - virtual void FocusWindow(aura::Window* window) OVERRIDE {}
|
| - virtual void ResetFocusWithinActiveWindow(aura::Window* window) OVERRIDE {}
|
| - virtual aura::Window* GetFocusedWindow() OVERRIDE { return NULL; }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusClientImpl);
|
| -};
|
| -
|
| -class WindowTreeClientImpl : public aura::client::WindowTreeClient {
|
| - public:
|
| - explicit WindowTreeClientImpl(aura::Window* window) : window_(window) {
|
| - aura::client::SetWindowTreeClient(window_, this);
|
| - }
|
| + SharedQuadStatePtr sqs = CreateDefaultSQS(node_bounds.size());
|
| + sqs->content_to_target_transform = Transform::From(node_transform);
|
|
|
| - virtual ~WindowTreeClientImpl() {
|
| - aura::client::SetWindowTreeClient(window_, NULL);
|
| - }
|
| + pass->quads.push_back(surface_quad.Pass());
|
| + pass->shared_quad_states.push_back(sqs.Pass());
|
|
|
| - // Overridden from aura::client::WindowTreeClient:
|
| - virtual aura::Window* GetDefaultParent(aura::Window* context,
|
| - aura::Window* window,
|
| - const gfx::Rect& bounds) OVERRIDE {
|
| - if (!capture_client_) {
|
| - capture_client_.reset(
|
| - new aura::client::DefaultCaptureClient(window_->GetRootWindow()));
|
| - }
|
| - return window_;
|
| + std::vector<const ServerView*> children(view->GetChildren());
|
| + for (std::vector<const ServerView*>::reverse_iterator it = children.rbegin();
|
| + it != children.rend();
|
| + ++it) {
|
| + DrawViewTree(pass, *it);
|
| }
|
| +}
|
|
|
| - private:
|
| - aura::Window* window_;
|
| -
|
| - scoped_ptr<aura::client::DefaultCaptureClient> capture_client_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WindowTreeClientImpl);
|
| -};
|
| +} // namespace
|
|
|
| DisplayManager::DisplayManager(
|
| ApplicationConnection* app_connection,
|
| ConnectionManager* connection_manager,
|
| - DisplayManagerDelegate* delegate,
|
| const Callback<void()>& native_viewport_closed_callback)
|
| - : delegate_(delegate),
|
| - connection_manager_(connection_manager),
|
| + : connection_manager_(connection_manager),
|
| in_setup_(false),
|
| - root_window_(NULL) {
|
| - screen_.reset(ScreenImpl::Create());
|
| - gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get());
|
| - NativeViewportPtr viewport;
|
| - app_connection->ConnectToService(
|
| - "mojo:mojo_native_viewport_service", &viewport);
|
| - GpuPtr gpu_service;
|
| - // TODO(jamesr): Should be mojo:mojo_gpu_service
|
| + bounds_(800, 600),
|
| + draw_timer_(false, false),
|
| + weak_factory_(this) {
|
| app_connection->ConnectToService("mojo:mojo_native_viewport_service",
|
| - &gpu_service);
|
| - window_tree_host_.reset(new WindowTreeHostImpl(
|
| - viewport.Pass(),
|
| - gpu_service.Pass(),
|
| - gfx::Rect(800, 600),
|
| - base::Bind(&DisplayManager::OnCompositorCreated, base::Unretained(this)),
|
| - native_viewport_closed_callback,
|
| - base::Bind(&ConnectionManager::DispatchViewInputEventToWindowManager,
|
| - base::Unretained(connection_manager_))));
|
| + &native_viewport_);
|
| + native_viewport_.set_client(this);
|
| + native_viewport_->Create(Size::From(bounds_));
|
| + native_viewport_->Show();
|
| + app_connection->ConnectToService("mojo:mojo_surfaces_service",
|
| + &surfaces_service_);
|
| + surfaces_service_->CreateSurfaceConnection(base::Bind(
|
| + &DisplayManager::OnSurfaceConnectionCreated, weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| DisplayManager::~DisplayManager() {
|
| - window_tree_client_.reset();
|
| - window_tree_host_.reset();
|
| - gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, NULL);
|
| }
|
|
|
| void DisplayManager::SchedulePaint(const ServerView* view,
|
| const gfx::Rect& bounds) {
|
| - if (root_window_)
|
| - root_window_->SchedulePaintInRect(ConvertRectToRoot(view, bounds));
|
| + if (!view->visible())
|
| + return;
|
| + gfx::Rect root_relative_rect = ConvertRectToRoot(view, bounds);
|
| + if (root_relative_rect.IsEmpty())
|
| + return;
|
| + dirty_rect_.Union(root_relative_rect);
|
| + if (!draw_timer_.IsRunning()) {
|
| + draw_timer_.Start(
|
| + FROM_HERE,
|
| + base::TimeDelta(),
|
| + base::Bind(&DisplayManager::Draw, base::Unretained(this)));
|
| + }
|
| }
|
|
|
| -void DisplayManager::OnCompositorCreated() {
|
| - base::AutoReset<bool> resetter(&in_setup_, true);
|
| - window_tree_host_->InitHost();
|
| +void DisplayManager::OnSurfaceConnectionCreated(SurfacePtr surface,
|
| + uint32_t id_namespace) {
|
| + surface_ = surface.Pass();
|
| + surface_.set_client(this);
|
| + surface_id_allocator_.reset(new cc::SurfaceIdAllocator(id_namespace));
|
| + Draw();
|
| +}
|
| +
|
| +void DisplayManager::Draw() {
|
| + if (!surface_)
|
| + return;
|
| + if (surface_id_.is_null()) {
|
| + surface_id_ = surface_id_allocator_->GenerateId();
|
| + surface_->CreateSurface(SurfaceId::From(surface_id_), Size::From(bounds_));
|
| + }
|
| +
|
| + PassPtr pass = CreateDefaultPass(1, gfx::Rect(bounds_));
|
| + pass->damage_rect = Rect::From(dirty_rect_);
|
| +
|
| + DrawViewTree(pass.get(), connection_manager_->root());
|
|
|
| - window_delegate_.reset(
|
| - new RootWindowDelegateImpl(connection_manager_));
|
| - 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_);
|
| + FramePtr frame = Frame::New();
|
| + frame->passes.push_back(pass.Pass());
|
| + frame->resources.resize(0u);
|
| + surface_->SubmitFrame(SurfaceId::From(surface_id_), frame.Pass());
|
|
|
| - connection_manager_->root()->SetBounds(
|
| - gfx::Rect(window_tree_host_->window()->bounds().size()));
|
| + native_viewport_->SubmittedFrame(SurfaceId::From(surface_id_));
|
|
|
| - window_tree_client_.reset(
|
| - new WindowTreeClientImpl(window_tree_host_->window()));
|
| + dirty_rect_ = gfx::Rect();
|
| +}
|
|
|
| - focus_client_.reset(new FocusClientImpl);
|
| - aura::client::SetFocusClient(window_tree_host_->window(),
|
| - focus_client_.get());
|
| +void DisplayManager::OnCreated(uint64_t native_viewport_id) {
|
| +}
|
|
|
| - window_tree_host_->Show();
|
| +void DisplayManager::OnDestroyed() {
|
| + native_viewport_closed_callback_.Run();
|
| +}
|
| +
|
| +void DisplayManager::OnBoundsChanged(SizePtr bounds) {
|
| + bounds_ = bounds.To<gfx::Size>();
|
| + connection_manager_->root()->SetBounds(gfx::Rect(bounds_));
|
| + if (surface_id_.is_null())
|
| + return;
|
| + surface_->DestroySurface(SurfaceId::From(surface_id_));
|
| + surface_id_ = cc::SurfaceId();
|
| + SchedulePaint(connection_manager_->root(), gfx::Rect(bounds_));
|
| +}
|
| +
|
| +void DisplayManager::OnEvent(EventPtr event,
|
| + const mojo::Callback<void()>& callback) {
|
| + connection_manager_->DispatchViewInputEventToWindowManager(event.Pass());
|
| + callback.Run();
|
| +}
|
|
|
| - delegate_->OnDisplayManagerWindowTreeHostCreated();
|
| +void DisplayManager::ReturnResources(Array<ReturnedResourcePtr> resources) {
|
| + DCHECK_EQ(0u, resources.size());
|
| }
|
|
|
| } // namespace service
|
|
|