diff options
Diffstat (limited to 'remoting/client/plugin/chromoting_plugin.cc')
-rw-r--r-- | remoting/client/plugin/chromoting_plugin.cc | 82 |
1 files changed, 34 insertions, 48 deletions
diff --git a/remoting/client/plugin/chromoting_plugin.cc b/remoting/client/plugin/chromoting_plugin.cc index c5b5b03..84dfe32 100644 --- a/remoting/client/plugin/chromoting_plugin.cc +++ b/remoting/client/plugin/chromoting_plugin.cc @@ -7,6 +7,7 @@ #include <string> #include <vector> +#include "base/message_loop.h" #include "base/string_util.h" #include "base/thread.h" #include "remoting/client/chromoting_client.h" @@ -17,7 +18,6 @@ #include "third_party/ppapi/c/pp_event.h" #include "third_party/ppapi/c/pp_rect.h" #include "third_party/ppapi/cpp/completion_callback.h" -#include "third_party/ppapi/cpp/image_data.h" using std::string; using std::vector; @@ -26,13 +26,9 @@ namespace remoting { const char* ChromotingPlugin::kMimeType = "pepper-application/x-chromoting"; -ChromotingPlugin::ChromotingPlugin(PP_Instance pp_instance, - const PPB_Instance* ppb_instance_funcs) - : width_(0), - height_(0), - drawing_context_(NULL), - pp_instance_(pp_instance), - ppb_instance_funcs_(ppb_instance_funcs) { +ChromotingPlugin::ChromotingPlugin(PP_Instance pp_instance) + : pp::Instance(pp_instance), + pepper_main_loop_dont_post_to_me_(NULL) { } ChromotingPlugin::~ChromotingPlugin() { @@ -53,6 +49,19 @@ ChromotingPlugin::~ChromotingPlugin() { bool ChromotingPlugin::Init(uint32_t argc, const char* argn[], const char* argv[]) { + CHECK(pepper_main_loop_dont_post_to_me_ == NULL); + + // Record the current thread. This function should only be invoked by the + // plugin thread, so we capture the current message loop and assume it is + // indeed the plugin thread. + // + // We're abusing the pepper API slightly here. We know we're running as an + // internal plugin, and thus we are on the pepper main thread that uses a + // message loop. + // + // TODO(ajwong): See if there is a method for querying what thread we're on + // from inside the pepper API. + pepper_main_loop_dont_post_to_me_ = MessageLoop::current(); LOG(INFO) << "Started ChromotingPlugin::Init"; // Extract the URL from the arguments. @@ -87,21 +96,23 @@ bool ChromotingPlugin::Init(uint32_t argc, // Create the chromting objects. host_connection_.reset(new JingleHostConnection(network_thread_.get())); - /* - view_.reset(new PepperView(main_thread_->message_loop(), device_, - instance())); - */ - //client_.reset(new ChromotingClient(main_thread_->message_loop(), - // host_connection_.get(), view_.get())); + view_.reset(new PepperView(this)); + client_.reset(new ChromotingClient(main_thread_->message_loop(), + host_connection_.get(), view_.get())); + + // Default to a medium grey. + view_->SetSolidFill(0xFFCDCDCD); // Kick off the connection. - //host_connection_->Connect(user_id, auth_token, host_jid, client_.get()); + host_connection_->Connect(user_id, auth_token, host_jid, client_.get()); return true; } void ChromotingPlugin::ViewChanged(const PP_Rect& position, const PP_Rect& clip) { + DCHECK(CurrentlyOnPluginThread()); + // TODO(ajwong): This is going to be a race condition when the view changes // and we're in the middle of a Paint(). LOG(INFO) << "ViewChanged " @@ -110,43 +121,18 @@ void ChromotingPlugin::ViewChanged(const PP_Rect& position, << position.size.width << "," << position.size.height; - // TODO(ajwong): Do we care about the position? Probably not... - if (position.size.width == width_ || position.size.height == height_) - return; - - width_ = position.size.width; - height_ = position.size.height; - - /* - * TODO(ajwong): Reenable this code once we fingure out how we want to - * abstract away the C-api for DeviceContext2D. - device_context_ = pp::DeviceContext2D(width_, height_, false); - if (!ppb_instance_funcs_->BindGraphicsDeviceContext( - pp_instance_, - device_context_.pp_resource())) { - LOG(ERROR) << "Couldn't bind the device context."; - return; - } - - pp::ImageData image(PP_IMAGEDATAFORMAT_BGRA_PREMUL, width_, height_, false); - if (!image.is_null()) { - for (int y = 0; y < image.height(); y++) { - for (int x = 0; x < image.width(); x++) { - *image.GetAddr32(x, y) = 0xccff00cc; - } - } - device_context_.ReplaceContents(&image); - device_context_.Flush(pp::CompletionCallback(NULL, this)); - } else { - LOG(ERROR) << "Unable to allocate image."; - } - */ + view_->SetViewport(position.point.x, position.point.y, + position.size.width, position.size.height); + view_->Paint(); +} - //client_->SetViewport(0, 0, width_, height_); - //client_->Repaint(); +bool ChromotingPlugin::CurrentlyOnPluginThread() const { + return pepper_main_loop_dont_post_to_me_ == MessageLoop::current(); } bool ChromotingPlugin::HandleEvent(const PP_Event& event) { + DCHECK(CurrentlyOnPluginThread()); + switch (event.type) { case PP_Event_Type_MouseDown: case PP_Event_Type_MouseUp: |