| Index: remoting/client/plugin/chromoting_instance.cc
|
| diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc
|
| index e6dea0eebec720a1c39eb89dd7c906838a7de2a8..d3f7b625f4c8a51f378f23d79f504f3077788dde 100644
|
| --- a/remoting/client/plugin/chromoting_instance.cc
|
| +++ b/remoting/client/plugin/chromoting_instance.cc
|
| @@ -24,14 +24,15 @@
|
| #include "remoting/base/util.h"
|
| #include "remoting/client/client_config.h"
|
| #include "remoting/client/chromoting_client.h"
|
| +#include "remoting/client/mouse_input_filter.h"
|
| #include "remoting/client/plugin/chromoting_scriptable_object.h"
|
| #include "remoting/client/plugin/pepper_input_handler.h"
|
| #include "remoting/client/plugin/pepper_view.h"
|
| -#include "remoting/client/plugin/pepper_view_proxy.h"
|
| #include "remoting/client/plugin/pepper_xmpp_proxy.h"
|
| #include "remoting/client/rectangle_update_decoder.h"
|
| #include "remoting/protocol/connection_to_host.h"
|
| #include "remoting/protocol/host_stub.h"
|
| +#include "remoting/protocol/key_event_tracker.h"
|
|
|
| namespace remoting {
|
|
|
| @@ -82,16 +83,11 @@ ChromotingInstance::~ChromotingInstance() {
|
| done_event.Wait();
|
| }
|
|
|
| - // Stopping the context shutdown all chromoting threads. This is a requirement
|
| - // before we can call Detach() on |view_proxy_|.
|
| + // Stopping the context shuts down all chromoting threads.
|
| context_.Stop();
|
|
|
| - if (view_proxy_.get()) {
|
| - view_proxy_->Detach();
|
| - }
|
| -
|
| // Delete |thread_proxy_| before we detach |plugin_message_loop_|,
|
| - // otherwise ScopedThreadProxy may DCHECK when destroying.
|
| + // otherwise ScopedThreadProxy may DCHECK when being destroyed.
|
| thread_proxy_.reset();
|
|
|
| plugin_message_loop_->Detach();
|
| @@ -117,9 +113,8 @@ bool ChromotingInstance::Init(uint32_t argc,
|
|
|
| // Create the chromoting objects that don't depend on the network connection.
|
| view_.reset(new PepperView(this, &context_));
|
| - view_proxy_ = new PepperViewProxy(this, view_.get(), plugin_message_loop_);
|
| rectangle_decoder_ = new RectangleUpdateDecoder(
|
| - context_.decode_message_loop(), view_proxy_);
|
| + context_.decode_message_loop(), view_.get());
|
|
|
| // Default to a medium grey.
|
| view_->SetSolidFill(0xFFCDCDCD);
|
| @@ -132,14 +127,9 @@ void ChromotingInstance::Connect(const ClientConfig& config) {
|
|
|
| host_connection_.reset(new protocol::ConnectionToHost(
|
| context_.network_message_loop(), this, true));
|
| -
|
| - input_handler_.reset(new PepperInputHandler(&context_,
|
| - host_connection_.get(),
|
| - view_proxy_));
|
| -
|
| client_.reset(new ChromotingClient(config, &context_, host_connection_.get(),
|
| - view_proxy_, rectangle_decoder_.get(),
|
| - input_handler_.get(), base::Closure()));
|
| + view_.get(), rectangle_decoder_.get(),
|
| + base::Closure()));
|
|
|
| LOG(INFO) << "Connecting to " << config.host_jid
|
| << ". Local jid: " << config.local_jid << ".";
|
| @@ -175,6 +165,8 @@ void ChromotingInstance::Disconnect() {
|
| }
|
|
|
| input_handler_.reset();
|
| + key_event_tracker_.reset();
|
| + mouse_input_filter_.reset();
|
| host_connection_.reset();
|
|
|
| GetScriptableObject()->SetConnectionStatus(
|
| @@ -186,87 +178,44 @@ void ChromotingInstance::DidChangeView(const pp::Rect& position,
|
| const pp::Rect& clip) {
|
| DCHECK(plugin_message_loop_->BelongsToCurrentThread());
|
|
|
| - view_->SetPluginSize(SkISize::Make(position.width(), position.height()));
|
| -
|
| - // TODO(wez): Pass the dimensions of the plugin to the RectangleDecoder
|
| - // and let it generate the necessary refresh events.
|
| - // If scale-to-fit is enabled then update the scaling ratios.
|
| - // We also force a full-frame refresh, in case the ratios changed.
|
| - if (scale_to_fit_) {
|
| - rectangle_decoder_->SetScaleRatios(view_->GetHorizontalScaleRatio(),
|
| - view_->GetVerticalScaleRatio());
|
| - rectangle_decoder_->RefreshFullFrame();
|
| + SkISize new_size = SkISize::Make(position.width(), position.height());
|
| + if (view_->SetViewSize(new_size)) {
|
| + if (mouse_input_filter_.get()) {
|
| + mouse_input_filter_->set_input_size(new_size);
|
| + }
|
| + rectangle_decoder_->SetOutputSize(new_size);
|
| }
|
|
|
| - // Notify the RectangleDecoder of the new clip rect.
|
| rectangle_decoder_->UpdateClipRect(
|
| SkIRect::MakeXYWH(clip.x(), clip.y(), clip.width(), clip.height()));
|
| }
|
|
|
| bool ChromotingInstance::HandleInputEvent(const pp::InputEvent& event) {
|
| DCHECK(plugin_message_loop_->BelongsToCurrentThread());
|
| - if (!input_handler_.get()) {
|
| +
|
| + // Never inject events if the end of the input pipeline doesn't exist.
|
| + // If it does exist but the pipeline doesn't, construct a pipeline.
|
| + // TODO(wez): This is really ugly. We should create the pipeline when
|
| + // the ConnectionToHost's InputStub exists.
|
| + if (!host_connection_.get()) {
|
| return false;
|
| + } else if (!input_handler_.get()) {
|
| + protocol::InputStub* input_stub = host_connection_->input_stub();
|
| + if (!input_stub)
|
| + return false;
|
| + mouse_input_filter_.reset(new MouseInputFilter(input_stub));
|
| + mouse_input_filter_->set_input_size(view_->get_view_size());
|
| + key_event_tracker_.reset(
|
| + new protocol::KeyEventTracker(mouse_input_filter_.get()));
|
| + input_handler_.reset(
|
| + new PepperInputHandler(key_event_tracker_.get()));
|
| }
|
|
|
| - PepperInputHandler* pih
|
| - = static_cast<PepperInputHandler*>(input_handler_.get());
|
| -
|
| - switch (event.GetType()) {
|
| - case PP_INPUTEVENT_TYPE_MOUSEDOWN: {
|
| - pih->HandleMouseButtonEvent(true, pp::MouseInputEvent(event));
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_MOUSEUP: {
|
| - pih->HandleMouseButtonEvent(false, pp::MouseInputEvent(event));
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
| - case PP_INPUTEVENT_TYPE_MOUSEENTER:
|
| - case PP_INPUTEVENT_TYPE_MOUSELEAVE: {
|
| - pih->HandleMouseMoveEvent(pp::MouseInputEvent(event));
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_WHEEL: {
|
| - pih->HandleMouseWheelEvent(pp::WheelInputEvent(event));
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_CONTEXTMENU: {
|
| - // We need to return true here or else we'll get a local (plugin) context
|
| - // menu instead of the mouseup event for the right click.
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_KEYDOWN: {
|
| - pp::KeyboardInputEvent key = pp::KeyboardInputEvent(event);
|
| - VLOG(3) << "PP_INPUTEVENT_TYPE_KEYDOWN" << " key=" << key.GetKeyCode();
|
| - pih->HandleKeyEvent(true, key);
|
| - return true;
|
| - }
|
| + // TODO(wez): When we have a good hook into Host dimensions changes, move
|
| + // this there.
|
| + mouse_input_filter_->set_output_size(view_->get_host_size());
|
|
|
| - case PP_INPUTEVENT_TYPE_KEYUP: {
|
| - pp::KeyboardInputEvent key = pp::KeyboardInputEvent(event);
|
| - VLOG(3) << "PP_INPUTEVENT_TYPE_KEYUP" << " key=" << key.GetKeyCode();
|
| - pih->HandleKeyEvent(false, key);
|
| - return true;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_CHAR: {
|
| - pih->HandleCharacterEvent(pp::KeyboardInputEvent(event));
|
| - return true;
|
| - }
|
| -
|
| - default: {
|
| - LOG(INFO) << "Unhandled input event: " << event.GetType();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| + return input_handler_->HandleInputEvent(event);
|
| }
|
|
|
| ChromotingScriptableObject* ChromotingInstance::GetScriptableObject() {
|
| @@ -280,25 +229,6 @@ ChromotingScriptableObject* ChromotingInstance::GetScriptableObject() {
|
| return NULL;
|
| }
|
|
|
| -void ChromotingInstance::SetScaleToFit(bool scale_to_fit) {
|
| - DCHECK(plugin_message_loop_->BelongsToCurrentThread());
|
| -
|
| - if (scale_to_fit == scale_to_fit_)
|
| - return;
|
| -
|
| - scale_to_fit_ = scale_to_fit;
|
| - if (scale_to_fit) {
|
| - rectangle_decoder_->SetScaleRatios(view_->GetHorizontalScaleRatio(),
|
| - view_->GetVerticalScaleRatio());
|
| - } else {
|
| - rectangle_decoder_->SetScaleRatios(1.0, 1.0);
|
| - }
|
| -
|
| - // TODO(wez): The RectangleDecoder should generate refresh events
|
| - // as necessary in response to any scaling change.
|
| - rectangle_decoder_->RefreshFullFrame();
|
| -}
|
| -
|
| // static
|
| void ChromotingInstance::RegisterLogMessageHandler() {
|
| base::AutoLock lock(g_logging_lock.Get());
|
| @@ -403,11 +333,9 @@ ChromotingStats* ChromotingInstance::GetStats() {
|
| }
|
|
|
| void ChromotingInstance::ReleaseAllKeys() {
|
| - if (!input_handler_.get()) {
|
| - return;
|
| + if (key_event_tracker_.get()) {
|
| + key_event_tracker_->ReleaseAllKeys();
|
| }
|
| -
|
| - input_handler_->ReleaseAllKeys();
|
| }
|
|
|
| } // namespace remoting
|
|
|