| Index: content/renderer/gpu/compositor_thread.cc
|
| ===================================================================
|
| --- content/renderer/gpu/compositor_thread.cc (revision 0)
|
| +++ content/renderer/gpu/compositor_thread.cc (revision 0)
|
| @@ -0,0 +1,114 @@
|
| +// Copyright (c) 2011 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 "content/renderer/gpu/compositor_thread.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "content/renderer/gpu/input_event_filter.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositor.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorClient.h"
|
| +
|
| +using WebKit::WebCompositor;
|
| +using WebKit::WebInputEvent;
|
| +
|
| +//------------------------------------------------------------------------------
|
| +
|
| +class CompositorThread::CompositorWrapper : public WebKit::WebCompositorClient {
|
| + public:
|
| + CompositorWrapper(CompositorThread* compositor_thread,
|
| + int routing_id,
|
| + WebKit::WebCompositor* compositor)
|
| + : compositor_thread_(compositor_thread),
|
| + routing_id_(routing_id),
|
| + compositor_(compositor) {
|
| + compositor_->setClient(this);
|
| + }
|
| +
|
| + virtual ~CompositorWrapper() {
|
| + compositor_->setClient(NULL);
|
| + }
|
| +
|
| + int routing_id() const { return routing_id_; }
|
| + WebKit::WebCompositor* compositor() const { return compositor_; }
|
| +
|
| + // WebCompositorClient methods:
|
| +
|
| + virtual void willShutdown() {
|
| + compositor_thread_->RemoveCompositor(routing_id_);
|
| + }
|
| +
|
| + virtual void didHandleInputEvent() {
|
| + compositor_thread_->filter_->DidHandleInputEvent();
|
| + }
|
| +
|
| + virtual void didNotHandleInputEvent(bool send_to_widget) {
|
| + compositor_thread_->filter_->DidNotHandleInputEvent(send_to_widget);
|
| + }
|
| +
|
| + private:
|
| + CompositorThread* compositor_thread_;
|
| + int routing_id_;
|
| + WebKit::WebCompositor* compositor_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CompositorWrapper);
|
| +};
|
| +
|
| +//------------------------------------------------------------------------------
|
| +
|
| +CompositorThread::CompositorThread(IPC::Channel::Listener* main_listener)
|
| + : thread_("Compositor") {
|
| + filter_ =
|
| + new InputEventFilter(main_listener,
|
| + thread_.message_loop()->message_loop_proxy(),
|
| + base::Bind(&CompositorThread::HandleInputEvent,
|
| + base::Unretained(this)));
|
| + WebCompositor::setThread(&thread_);
|
| +}
|
| +
|
| +CompositorThread::~CompositorThread() {
|
| +}
|
| +
|
| +IPC::ChannelProxy::MessageFilter* CompositorThread::GetMessageFilter() const {
|
| + return filter_;
|
| +}
|
| +
|
| +void CompositorThread::AddCompositor(int routing_id, int compositor_id) {
|
| + if (thread_.message_loop() != MessageLoop::current()) {
|
| + thread_.message_loop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&CompositorThread::AddCompositor, base::Unretained(this),
|
| + routing_id, compositor_id));
|
| + return;
|
| + }
|
| +
|
| + WebCompositor* compositor = WebCompositor::fromIdentifier(compositor_id);
|
| + if (!compositor)
|
| + return;
|
| +
|
| + filter_->AddRoute(routing_id);
|
| + compositors_[routing_id] =
|
| + make_linked_ptr(new CompositorWrapper(this, routing_id, compositor));
|
| +}
|
| +
|
| +void CompositorThread::RemoveCompositor(int routing_id) {
|
| + DCHECK(thread_.message_loop() == MessageLoop::current());
|
| +
|
| + filter_->RemoveRoute(routing_id);
|
| + compositors_.erase(routing_id);
|
| +}
|
| +
|
| +void CompositorThread::HandleInputEvent(
|
| + int routing_id,
|
| + const WebInputEvent* input_event) {
|
| + DCHECK_EQ(MessageLoop::current(), thread_.message_loop());
|
| +
|
| + CompositorMap::iterator it = compositors_.find(routing_id);
|
| + if (it == compositors_.end()) {
|
| + // Oops, we no longer have an interested compositor.
|
| + filter_->DidNotHandleInputEvent(true);
|
| + return;
|
| + }
|
| +
|
| + it->second->compositor()->handleInputEvent(*input_event);
|
| +}
|
|
|