// 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. #include "mojo/aura/window_tree_host_mojo.h" #include <vector> #include "mojo/aura/window_tree_host_mojo_delegate.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/events/event.h" #include "ui/events/event_constants.h" namespace mojo { namespace { const char kTreeHostsKey[] = "tree_hosts"; typedef std::vector<WindowTreeHostMojo*> Managers; class TreeHosts : public base::SupportsUserData::Data { public: TreeHosts() {} virtual ~TreeHosts() {} static TreeHosts* Get() { TreeHosts* hosts = static_cast<TreeHosts*>( aura::Env::GetInstance()->GetUserData(kTreeHostsKey)); if (!hosts) { hosts = new TreeHosts; aura::Env::GetInstance()->SetUserData(kTreeHostsKey, hosts); } return hosts; } void Add(WindowTreeHostMojo* manager) { managers_.push_back(manager); } void Remove(WindowTreeHostMojo* manager) { Managers::iterator i = std::find(managers_.begin(), managers_.end(), manager); DCHECK(i != managers_.end()); managers_.erase(i); } const std::vector<WindowTreeHostMojo*> managers() const { return managers_; } private: Managers managers_; DISALLOW_COPY_AND_ASSIGN(TreeHosts); }; } // namespace //////////////////////////////////////////////////////////////////////////////// // WindowTreeHostMojo, public: WindowTreeHostMojo::WindowTreeHostMojo(View* view, WindowTreeHostMojoDelegate* delegate) : view_(view), bounds_(view->bounds()), delegate_(delegate) { view_->AddObserver(this); CreateCompositor(GetAcceleratedWidget()); TreeHosts::Get()->Add(this); } WindowTreeHostMojo::~WindowTreeHostMojo() { view_->RemoveObserver(this); TreeHosts::Get()->Remove(this); DestroyCompositor(); DestroyDispatcher(); } // static WindowTreeHostMojo* WindowTreeHostMojo::ForCompositor( ui::Compositor* compositor) { const Managers& managers = TreeHosts::Get()->managers(); for (size_t i = 0; i < managers.size(); ++i) { if (managers[i]->compositor() == compositor) return managers[i]; } return NULL; } void WindowTreeHostMojo::SetContents(const SkBitmap& contents) { delegate_->CompositorContentsChanged(contents); } //////////////////////////////////////////////////////////////////////////////// // WindowTreeHostMojo, aura::WindowTreeHost implementation: ui::EventSource* WindowTreeHostMojo::GetEventSource() { return this; } gfx::AcceleratedWidget WindowTreeHostMojo::GetAcceleratedWidget() { return gfx::kNullAcceleratedWidget; } void WindowTreeHostMojo::Show() { window()->Show(); } void WindowTreeHostMojo::Hide() { } gfx::Rect WindowTreeHostMojo::GetBounds() const { return bounds_; } void WindowTreeHostMojo::SetBounds(const gfx::Rect& bounds) { window()->SetBounds(gfx::Rect(bounds.size())); } gfx::Point WindowTreeHostMojo::GetLocationOnNativeScreen() const { return gfx::Point(0, 0); } void WindowTreeHostMojo::SetCapture() { NOTIMPLEMENTED(); } void WindowTreeHostMojo::ReleaseCapture() { NOTIMPLEMENTED(); } void WindowTreeHostMojo::PostNativeEvent( const base::NativeEvent& native_event) { NOTIMPLEMENTED(); } void WindowTreeHostMojo::SetCursorNative(gfx::NativeCursor cursor) { NOTIMPLEMENTED(); } void WindowTreeHostMojo::MoveCursorToNative(const gfx::Point& location) { NOTIMPLEMENTED(); } void WindowTreeHostMojo::OnCursorVisibilityChangedNative(bool show) { NOTIMPLEMENTED(); } //////////////////////////////////////////////////////////////////////////////// // WindowTreeHostMojo, ui::EventSource implementation: ui::EventProcessor* WindowTreeHostMojo::GetEventProcessor() { return dispatcher(); } //////////////////////////////////////////////////////////////////////////////// // WindowTreeHostMojo, ViewObserver implementation: void WindowTreeHostMojo::OnViewBoundsChanged( View* view, const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) { bounds_ = new_bounds; if (old_bounds.origin() != new_bounds.origin()) OnHostMoved(bounds_.origin()); if (old_bounds.size() != new_bounds.size()) OnHostResized(bounds_.size()); } } // namespace mojo