diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 303c62c29cc0..c7d39b8fbe1d 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn @@ -229,9 +229,6 @@ static_library("extensions") { sources -= [ "global_shortcut_listener_chromeos.cc", ] - deps -= [ - "//remoting/host/it2me:common", - ] } if (!use_ozone) { sources -= [ diff --git a/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc index fdb43188b74b..8dfb32c9afd5 100644 --- a/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc +++ b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc @@ -23,10 +23,8 @@ #include "extensions/common/switches.h" #include "extensions/common/url_pattern.h" #include "net/url_request/url_request_context_getter.h" -#if defined(USE_X11) #include "remoting/host/chromoting_host_context.h" #include "remoting/host/it2me/it2me_native_messaging_host.h" -# endif // defined(USE_X11) #include "ui/gfx/native_widget_types.h" #include "url/gurl.h" @@ -97,9 +95,6 @@ struct BuiltInHost { scoped_ptr(*create_function)(); }; -// Remote assistance currently only supports X11. -// TODO(kelvinp): Migrate to ozone once it is ready (crbug.com/426716). -#if defined(USE_X11) scoped_ptr CreateIt2MeHost() { if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableRemoteAssistance)) { @@ -130,19 +125,16 @@ const char* const kRemotingIt2MeOrigins[] = { "chrome-extension://dokpleeekgeeiehdhmdkeimnkmoifgdd/", "chrome-extension://ajoainacpilcemgiakehflpbkbfipojk/", "chrome-extension://hmboipgjngjoiaeicfdifdoeacilalgc/"}; -#endif // defined(USE_X11) static const BuiltInHost kBuiltInHost[] = { {"com.google.chrome.test.echo", // ScopedTestNativeMessagingHost::kHostName kEchoHostOrigins, arraysize(kEchoHostOrigins), &EchoHost::Create}, -#if defined(USE_X11) {"com.google.chrome.remote_assistance", kRemotingIt2MeOrigins, arraysize(kRemotingIt2MeOrigins), &CreateIt2MeHost}, -#endif // defined(USE_X11) }; bool MatchesSecurityOrigin(const BuiltInHost& host, diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index 273428c8971d..dd08ccfae35e 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -965,19 +965,13 @@ ], 'conditions': [ ['chromeos==1', { - 'conditions': [ - ['use_x11==1', { - 'dependencies': [ - '../remoting/remoting.gyp:remoting_it2me_host_static', - ], - 'include_dirs': [ - '../third_party/libjingle/source', - ], - }] + 'include_dirs': [ + '../third_party/libjingle/source', ], 'dependencies': [ '../build/linux/system.gyp:dbus', '../chromeos/ime/input_method.gyp:gencode', + '../remoting/remoting.gyp:remoting_it2me_host_static', '../third_party/libevent/libevent.gyp:libevent', ], 'sources': [ diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index d7be0c3c9965..6b36c9bd77ae 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn @@ -30,6 +30,7 @@ static_library("host") { "//remoting/base", "//remoting/protocol", "//remoting/resources", + "//ui/events/platform", "//ui/events:dom4_keycode_converter", ] @@ -43,7 +44,11 @@ static_library("host") { "//build/config/linux:x11", ] } else { - sources -= [ "clipboard_x11.cc" ] + sources -= [ + "clipboard_x11.cc", + "linux/x_server_clipboard.cc", + "linux/x_server_clipboard.h", + ] } if (is_chromeos) { @@ -63,19 +68,30 @@ static_library("host") { deps += [ "//ash" ] } + if (use_ozone) { + sources -= [ + "input_injector_x11.cc", + "local_input_monitor_x11.cc", + ] + } else { + sources -= [ + "chromeos/mouse_cursor_monitor_aura.cc", + "chromeos/mouse_cursor_monitor_aura.h", + "clipboard_x11.cc", + "input_injector_chromeos.cc", + "input_injector_chromeos.h", + "linux/x_server_clipboard.cc", + "linux/x_server_clipboard.h", + "local_input_monitor_chromeos.cc", + ] + } + sources -= [ - "clipboard_x11.cc", "continue_window_linux.cc", "disconnect_window_linux.cc", "policy_hack/policy_watcher_linux.cc", "remoting_me2me_host.cc", ] - - } else { - sources -= [ - "clipboard_aura.cc", - "clipboard_aura.h", - ] } if (is_mac) { diff --git a/remoting/host/basic_desktop_environment.cc b/remoting/host/basic_desktop_environment.cc index a5398bb3fb54..174248a2900f 100644 --- a/remoting/host/basic_desktop_environment.cc +++ b/remoting/host/basic_desktop_environment.cc @@ -11,6 +11,9 @@ #if defined(OS_CHROMEOS) #include "remoting/host/chromeos/aura_desktop_capturer.h" #endif +#if defined(OS_CHROMEOS) && defined(USE_OZONE) +#include "remoting/host/chromeos/mouse_cursor_monitor_aura.h" +#endif #include "remoting/host/client_session_control.h" #include "remoting/host/gnubby_auth_handler.h" #include "remoting/host/input_injector.h" @@ -45,8 +48,13 @@ scoped_ptr BasicDesktopEnvironment::CreateScreenControls() { scoped_ptr BasicDesktopEnvironment::CreateMouseCursorMonitor() { +#if defined(OS_CHROMEOS) && defined(USE_OZONE) + return make_scoped_ptr( + new MouseCursorMonitorAura(*desktop_capture_options_)); +#else return make_scoped_ptr(webrtc::MouseCursorMonitor::CreateForScreen( *desktop_capture_options_, webrtc::kFullDesktopScreenId)); +#endif } std::string BasicDesktopEnvironment::GetCapabilities() const { diff --git a/remoting/host/clipboard_aura.cc b/remoting/host/chromeos/clipboard_aura.cc similarity index 98% rename from remoting/host/clipboard_aura.cc rename to remoting/host/chromeos/clipboard_aura.cc index 2fd3be04c080..7fca2df7b3cc 100644 --- a/remoting/host/clipboard_aura.cc +++ b/remoting/host/chromeos/clipboard_aura.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "remoting/host/clipboard_aura.h" +#include "remoting/host/chromeos/clipboard_aura.h" #include "base/strings/utf_string_conversions.h" #include "base/timer/timer.h" diff --git a/remoting/host/clipboard_aura.h b/remoting/host/chromeos/clipboard_aura.h similarity index 100% rename from remoting/host/clipboard_aura.h rename to remoting/host/chromeos/clipboard_aura.h diff --git a/remoting/host/clipboard_aura_unittest.cc b/remoting/host/chromeos/clipboard_aura_unittest.cc similarity index 98% rename from remoting/host/clipboard_aura_unittest.cc rename to remoting/host/chromeos/clipboard_aura_unittest.cc index 8993592ee5c0..5201c11ee427 100644 --- a/remoting/host/clipboard_aura_unittest.cc +++ b/remoting/host/chromeos/clipboard_aura_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "remoting/host/clipboard_aura.h" +#include "remoting/host/chromeos/clipboard_aura.h" #include "base/bind.h" #include "base/bind_helpers.h" diff --git a/remoting/host/chromeos/mouse_cursor_monitor_aura.cc b/remoting/host/chromeos/mouse_cursor_monitor_aura.cc new file mode 100644 index 000000000000..68b89a8340a8 --- /dev/null +++ b/remoting/host/chromeos/mouse_cursor_monitor_aura.cc @@ -0,0 +1,35 @@ +// 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 "remoting/host/chromeos/mouse_cursor_monitor_aura.h" + +#include "base/logging.h" + +namespace remoting { + +MouseCursorMonitorAura::MouseCursorMonitorAura( + const webrtc::DesktopCaptureOptions& options) + : callback_(nullptr), + mode_(SHAPE_AND_POSITION) { +} + +MouseCursorMonitorAura::~MouseCursorMonitorAura() { + NOTIMPLEMENTED(); +} + +void MouseCursorMonitorAura::Init(Callback* callback, Mode mode) { + DCHECK(!callback_); + DCHECK(callback); + + callback_ = callback; + mode_ = mode; + + NOTIMPLEMENTED(); +} + +void MouseCursorMonitorAura::Capture() { + NOTIMPLEMENTED(); +} + +} // namespace remoting diff --git a/remoting/host/chromeos/mouse_cursor_monitor_aura.h b/remoting/host/chromeos/mouse_cursor_monitor_aura.h new file mode 100644 index 000000000000..687daf53f87e --- /dev/null +++ b/remoting/host/chromeos/mouse_cursor_monitor_aura.h @@ -0,0 +1,32 @@ +// 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. + +#ifndef REMOTING_HOST_CHROMEOS_MOUSE_CURSOR_MONITOR_AURA_H_ +#define REMOTING_HOST_CHROMEOS_MOUSE_CURSOR_MONITOR_AURA_H_ + +#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h" +#include "third_party/webrtc/modules/desktop_capture/mouse_cursor_monitor.h" + +namespace remoting { + +// A MouseCursorMonitor place holder implementation for Chrome OS with ozone. +// TODO(kelvinp): Implement this (See crbug.com/431457). +class MouseCursorMonitorAura : public webrtc::MouseCursorMonitor { + public: + explicit MouseCursorMonitorAura(const webrtc::DesktopCaptureOptions& options); + ~MouseCursorMonitorAura() override; + + void Init(Callback* callback, Mode mode) override; + void Capture() override; + + private: + Callback* callback_; + Mode mode_; + + DISALLOW_COPY_AND_ASSIGN(MouseCursorMonitorAura); +}; + +} // namespace remoting + +#endif // REMOTING_HOST_CHROMEOS_MOUSE_CURSOR_MONITOR_AURA_H_ diff --git a/remoting/host/desktop_shape_tracker_x11.cc b/remoting/host/desktop_shape_tracker_linux.cc similarity index 100% rename from remoting/host/desktop_shape_tracker_x11.cc rename to remoting/host/desktop_shape_tracker_linux.cc diff --git a/remoting/host/input_injector_chromeos.cc b/remoting/host/input_injector_chromeos.cc new file mode 100644 index 000000000000..a18b1cd2ce73 --- /dev/null +++ b/remoting/host/input_injector_chromeos.cc @@ -0,0 +1,58 @@ +// 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 "remoting/host/input_injector_chromeos.h" + +#include "base/logging.h" +#include "remoting/proto/internal.pb.h" + +namespace remoting { + +using protocol::ClipboardEvent; +using protocol::KeyEvent; +using protocol::MouseEvent; +using protocol::TextEvent; + +// TODO(kelvinp): Implement this class (See crbug.com/426716). +InputInjectorChromeos::InputInjectorChromeos( + scoped_refptr task_runner) + : input_task_runner_(task_runner) { + NOTIMPLEMENTED(); +} + +InputInjectorChromeos::~InputInjectorChromeos() { + NOTIMPLEMENTED(); +} + +void InputInjectorChromeos::InjectClipboardEvent(const ClipboardEvent& event) { + NOTIMPLEMENTED(); +} + +void InputInjectorChromeos::InjectKeyEvent(const KeyEvent& event) { + NOTIMPLEMENTED(); +} + +void InputInjectorChromeos::InjectTextEvent(const TextEvent& event) { + NOTIMPLEMENTED(); +} + +void InputInjectorChromeos::InjectMouseEvent(const MouseEvent& event) { + NOTIMPLEMENTED(); +} + +void InputInjectorChromeos::Start( + scoped_ptr client_clipboard) { + NOTIMPLEMENTED(); +} + +// static +scoped_ptr InputInjector::Create( + scoped_refptr input_task_runner, + scoped_refptr ui_task_runner) { + scoped_ptr injector(new InputInjectorChromeos( + ui_task_runner)); + return injector.Pass(); +} + +} // namespace remoting diff --git a/remoting/host/input_injector_chromeos.h b/remoting/host/input_injector_chromeos.h new file mode 100644 index 000000000000..7670591af622 --- /dev/null +++ b/remoting/host/input_injector_chromeos.h @@ -0,0 +1,42 @@ +// 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. + +#ifndef REMOTING_HOST_INPUT_INJECTOR_CHROMEOS_H_ +#define REMOTING_HOST_INPUT_INJECTOR_CHROMEOS_H_ + +#include "base/single_thread_task_runner.h" +#include "remoting/host/input_injector.h" + +namespace remoting { + +// InputInjector implementation that translates input to ui::Events and passes +// them to a supplied delegate for injection into ChromeOS. +class InputInjectorChromeos : public InputInjector { + public: + explicit InputInjectorChromeos( + scoped_refptr task_runner); + + ~InputInjectorChromeos() override; + + // Clipboard stub interface. + void InjectClipboardEvent(const protocol::ClipboardEvent& event) override; + + // InputStub interface. + void InjectKeyEvent(const protocol::KeyEvent& event) override; + void InjectTextEvent(const protocol::TextEvent& event) override; + void InjectMouseEvent(const protocol::MouseEvent& event) override; + + // InputInjector interface. + void Start(scoped_ptr client_clipboard) override; + + private: + // Task runner for input injection. + scoped_refptr input_task_runner_; + + DISALLOW_COPY_AND_ASSIGN(InputInjectorChromeos); +}; + +} // namespace remoting + +#endif // REMOTING_HOST_INPUT_INJECTOR_CHROMEOS_H_ \ No newline at end of file diff --git a/remoting/host/input_injector_linux.cc b/remoting/host/input_injector_x11.cc similarity index 91% rename from remoting/host/input_injector_linux.cc rename to remoting/host/input_injector_x11.cc index 523c71dab4e4..3b5d2b469220 100644 --- a/remoting/host/input_injector_linux.cc +++ b/remoting/host/input_injector_x11.cc @@ -87,12 +87,12 @@ bool FindKeycodeForUnicode(Display* display, // From third_party/WebKit/Source/web/gtk/WebInputEventFactory.cpp . const float kWheelTicksPerPixel = 3.0f / 160.0f; -// A class to generate events on Linux. -class InputInjectorLinux : public InputInjector { +// A class to generate events on X11. +class InputInjectorX11 : public InputInjector { public: - explicit InputInjectorLinux( + explicit InputInjectorX11( scoped_refptr task_runner); - ~InputInjectorLinux() override; + ~InputInjectorX11() override; bool Init(); @@ -108,7 +108,7 @@ class InputInjectorLinux : public InputInjector { void Start(scoped_ptr client_clipboard) override; private: - // The actual implementation resides in InputInjectorLinux::Core class. + // The actual implementation resides in InputInjectorX11::Core class. class Core : public base::RefCountedThreadSafe { public: explicit Core(scoped_refptr task_runner); @@ -180,44 +180,44 @@ class InputInjectorLinux : public InputInjector { scoped_refptr core_; - DISALLOW_COPY_AND_ASSIGN(InputInjectorLinux); + DISALLOW_COPY_AND_ASSIGN(InputInjectorX11); }; -InputInjectorLinux::InputInjectorLinux( +InputInjectorX11::InputInjectorX11( scoped_refptr task_runner) { core_ = new Core(task_runner); } -InputInjectorLinux::~InputInjectorLinux() { +InputInjectorX11::~InputInjectorX11() { core_->Stop(); } -bool InputInjectorLinux::Init() { +bool InputInjectorX11::Init() { return core_->Init(); } -void InputInjectorLinux::InjectClipboardEvent(const ClipboardEvent& event) { +void InputInjectorX11::InjectClipboardEvent(const ClipboardEvent& event) { core_->InjectClipboardEvent(event); } -void InputInjectorLinux::InjectKeyEvent(const KeyEvent& event) { +void InputInjectorX11::InjectKeyEvent(const KeyEvent& event) { core_->InjectKeyEvent(event); } -void InputInjectorLinux::InjectTextEvent(const TextEvent& event) { +void InputInjectorX11::InjectTextEvent(const TextEvent& event) { core_->InjectTextEvent(event); } -void InputInjectorLinux::InjectMouseEvent(const MouseEvent& event) { +void InputInjectorX11::InjectMouseEvent(const MouseEvent& event) { core_->InjectMouseEvent(event); } -void InputInjectorLinux::Start( +void InputInjectorX11::Start( scoped_ptr client_clipboard) { core_->Start(client_clipboard.Pass()); } -InputInjectorLinux::Core::Core( +InputInjectorX11::Core::Core( scoped_refptr task_runner) : task_runner_(task_runner), latest_mouse_position_(-1, -1), @@ -228,7 +228,7 @@ InputInjectorLinux::Core::Core( saved_auto_repeat_enabled_(false) { } -bool InputInjectorLinux::Core::Init() { +bool InputInjectorX11::Core::Init() { CHECK(display_); if (!task_runner_->BelongsToCurrentThread()) @@ -252,7 +252,7 @@ bool InputInjectorLinux::Core::Init() { return true; } -void InputInjectorLinux::Core::InjectClipboardEvent( +void InputInjectorX11::Core::InjectClipboardEvent( const ClipboardEvent& event) { if (!task_runner_->BelongsToCurrentThread()) { task_runner_->PostTask( @@ -264,7 +264,7 @@ void InputInjectorLinux::Core::InjectClipboardEvent( clipboard_->InjectClipboardEvent(event); } -void InputInjectorLinux::Core::InjectKeyEvent(const KeyEvent& event) { +void InputInjectorX11::Core::InjectKeyEvent(const KeyEvent& event) { // HostEventDispatcher should filter events missing the pressed field. if (!event.has_pressed() || !event.has_usb_keycode()) return; @@ -313,7 +313,7 @@ void InputInjectorLinux::Core::InjectKeyEvent(const KeyEvent& event) { XFlush(display_); } -void InputInjectorLinux::Core::InjectTextEvent(const TextEvent& event) { +void InputInjectorX11::Core::InjectTextEvent(const TextEvent& event) { if (!task_runner_->BelongsToCurrentThread()) { task_runner_->PostTask(FROM_HERE, base::Bind(&Core::InjectTextEvent, this, event)); @@ -344,16 +344,16 @@ void InputInjectorLinux::Core::InjectTextEvent(const TextEvent& event) { XFlush(display_); } -InputInjectorLinux::Core::~Core() { +InputInjectorX11::Core::~Core() { CHECK(pressed_keys_.empty()); } -void InputInjectorLinux::Core::InitClipboard() { +void InputInjectorX11::Core::InitClipboard() { DCHECK(task_runner_->BelongsToCurrentThread()); clipboard_ = Clipboard::Create(); } -bool InputInjectorLinux::Core::IsAutoRepeatEnabled() { +bool InputInjectorX11::Core::IsAutoRepeatEnabled() { XKeyboardState state; if (!XGetKeyboardControl(display_, &state)) { LOG(ERROR) << "Failed to get keyboard auto-repeat status, assuming ON."; @@ -362,13 +362,13 @@ bool InputInjectorLinux::Core::IsAutoRepeatEnabled() { return state.global_auto_repeat == AutoRepeatModeOn; } -void InputInjectorLinux::Core::SetAutoRepeatEnabled(bool mode) { +void InputInjectorX11::Core::SetAutoRepeatEnabled(bool mode) { XKeyboardControl control; control.auto_repeat_mode = mode ? AutoRepeatModeOn : AutoRepeatModeOff; XChangeKeyboardControl(display_, KBAutoRepeatMode, &control); } -void InputInjectorLinux::Core::InjectScrollWheelClicks(int button, int count) { +void InputInjectorX11::Core::InjectScrollWheelClicks(int button, int count) { if (button < 0) { LOG(WARNING) << "Ignoring unmapped scroll wheel button"; return; @@ -380,7 +380,7 @@ void InputInjectorLinux::Core::InjectScrollWheelClicks(int button, int count) { } } -void InputInjectorLinux::Core::InjectMouseEvent(const MouseEvent& event) { +void InputInjectorX11::Core::InjectMouseEvent(const MouseEvent& event) { if (!task_runner_->BelongsToCurrentThread()) { task_runner_->PostTask(FROM_HERE, base::Bind(&Core::InjectMouseEvent, this, event)); @@ -471,7 +471,7 @@ void InputInjectorLinux::Core::InjectMouseEvent(const MouseEvent& event) { XFlush(display_); } -void InputInjectorLinux::Core::InitMouseButtonMap() { +void InputInjectorX11::Core::InitMouseButtonMap() { // TODO(rmsousa): Run this on global/device mapping change events. // Do not touch global pointer mapping, since this may affect the local user. @@ -547,7 +547,7 @@ void InputInjectorLinux::Core::InitMouseButtonMap() { XCloseDevice(display_, device); } -int InputInjectorLinux::Core::MouseButtonToX11ButtonNumber( +int InputInjectorX11::Core::MouseButtonToX11ButtonNumber( MouseEvent::MouseButton button) { switch (button) { case MouseEvent::BUTTON_LEFT: @@ -565,17 +565,17 @@ int InputInjectorLinux::Core::MouseButtonToX11ButtonNumber( } } -int InputInjectorLinux::Core::HorizontalScrollWheelToX11ButtonNumber(int dx) { +int InputInjectorX11::Core::HorizontalScrollWheelToX11ButtonNumber(int dx) { return (dx > 0 ? pointer_button_map_[5] : pointer_button_map_[6]); } -int InputInjectorLinux::Core::VerticalScrollWheelToX11ButtonNumber(int dy) { +int InputInjectorX11::Core::VerticalScrollWheelToX11ButtonNumber(int dy) { // Positive y-values are wheel scroll-up events (button 4), negative y-values // are wheel scroll-down events (button 5). return (dy > 0 ? pointer_button_map_[3] : pointer_button_map_[4]); } -void InputInjectorLinux::Core::Start( +void InputInjectorX11::Core::Start( scoped_ptr client_clipboard) { if (!task_runner_->BelongsToCurrentThread()) { task_runner_->PostTask( @@ -589,7 +589,7 @@ void InputInjectorLinux::Core::Start( clipboard_->Start(client_clipboard.Pass()); } -void InputInjectorLinux::Core::Stop() { +void InputInjectorX11::Core::Stop() { if (!task_runner_->BelongsToCurrentThread()) { task_runner_->PostTask(FROM_HERE, base::Bind(&Core::Stop, this)); return; @@ -603,8 +603,8 @@ void InputInjectorLinux::Core::Stop() { scoped_ptr InputInjector::Create( scoped_refptr main_task_runner, scoped_refptr ui_task_runner) { - scoped_ptr injector( - new InputInjectorLinux(main_task_runner)); + scoped_ptr injector( + new InputInjectorX11(main_task_runner)); if (!injector->Init()) return nullptr; return injector.Pass(); diff --git a/remoting/host/local_input_monitor_chromeos.cc b/remoting/host/local_input_monitor_chromeos.cc new file mode 100644 index 000000000000..abd76515caa9 --- /dev/null +++ b/remoting/host/local_input_monitor_chromeos.cc @@ -0,0 +1,143 @@ +// 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 "remoting/host/local_input_monitor.h" + +#include "base/bind.h" +#include "base/callback.h" +#include "base/location.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/non_thread_safe.h" +#include "remoting/host/client_session_control.h" +#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" +#include "ui/events/event.h" +#include "ui/events/event_utils.h" +#include "ui/events/keycodes/keyboard_codes.h" +#include "ui/events/platform/platform_event_observer.h" +#include "ui/events/platform/platform_event_source.h" + +namespace remoting { + +namespace { + +class LocalInputMonitorChromeos : public LocalInputMonitor { + public: + LocalInputMonitorChromeos( + scoped_refptr caller_task_runner, + scoped_refptr input_task_runner, + base::WeakPtr client_session_control); + virtual ~LocalInputMonitorChromeos(); + + private: + class Core : ui::PlatformEventObserver { + public: + Core(scoped_refptr caller_task_runner, + base::WeakPtr client_session_control); + ~Core(); + + void Start(); + + // ui::PlatformEventObserver interface. + void WillProcessEvent(const ui::PlatformEvent& event) override; + void DidProcessEvent(const ui::PlatformEvent& event) override; + + private: + void HandleMouseMove(const ui::PlatformEvent& event); + void HandleKeyPressed(const ui::PlatformEvent& event); + + scoped_refptr caller_task_runner_; + + // Points to the object receiving mouse event notifications and session + // disconnect requests. Must be called on the |caller_task_runner_|. + base::WeakPtr client_session_control_; + + DISALLOW_COPY_AND_ASSIGN(Core); + }; + + // Task runner on which ui::events are received. + scoped_refptr input_task_runner_; + scoped_ptr core_; + + DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorChromeos); +}; + +LocalInputMonitorChromeos::LocalInputMonitorChromeos( + scoped_refptr caller_task_runner, + scoped_refptr input_task_runner, + base::WeakPtr client_session_control) + : input_task_runner_(input_task_runner), + core_(new Core(caller_task_runner, client_session_control)) { + input_task_runner_->PostTask( + FROM_HERE, base::Bind(&Core::Start, base::Unretained(core_.get()))); +} + +LocalInputMonitorChromeos::~LocalInputMonitorChromeos() { + input_task_runner_->DeleteSoon(FROM_HERE, core_.release()); +} + +LocalInputMonitorChromeos::Core::Core( + scoped_refptr caller_task_runner, + base::WeakPtr client_session_control) + : caller_task_runner_(caller_task_runner), + client_session_control_(client_session_control) { + DCHECK(client_session_control_.get()); +} + +void LocalInputMonitorChromeos::Core::Start() { + ui::PlatformEventSource::GetInstance()->AddPlatformEventObserver(this); +} + +LocalInputMonitorChromeos::Core::~Core() { + ui::PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this); +} + +void LocalInputMonitorChromeos::Core::WillProcessEvent( + const ui::PlatformEvent& event) { + // No need to handle this callback. +} + +void LocalInputMonitorChromeos::Core::DidProcessEvent( + const ui::PlatformEvent& event) { + ui::EventType type = ui::EventTypeFromNative(event); + if (type == ui::ET_MOUSE_MOVED) { + HandleMouseMove(event); + } else if (type == ui::ET_KEY_PRESSED) { + HandleKeyPressed(event); + } +} + +void LocalInputMonitorChromeos::Core::HandleMouseMove( + const ui::PlatformEvent& event) { + gfx::Point mouse_position = ui::EventLocationFromNative(event); + caller_task_runner_->PostTask( + FROM_HERE, + base::Bind( + &ClientSessionControl::OnLocalMouseMoved, client_session_control_, + webrtc::DesktopVector(mouse_position.x(), mouse_position.y()))); +} + +void LocalInputMonitorChromeos::Core::HandleKeyPressed( + const ui::PlatformEvent& event) { + ui::KeyEvent key_event(event); + DCHECK(key_event.is_char()); + if (key_event.IsControlDown() && key_event.IsAltDown() && + key_event.key_code() == ui::VKEY_ESCAPE) { + caller_task_runner_->PostTask( + FROM_HERE, base::Bind(&ClientSessionControl::DisconnectSession, + client_session_control_)); + } +} + +} // namespace + +scoped_ptr LocalInputMonitor::Create( + scoped_refptr caller_task_runner, + scoped_refptr input_task_runner, + scoped_refptr ui_task_runner, + base::WeakPtr client_session_control) { + return make_scoped_ptr(new LocalInputMonitorChromeos( + caller_task_runner, input_task_runner, client_session_control)); +} + +} // namespace remoting diff --git a/remoting/host/local_input_monitor_linux.cc b/remoting/host/local_input_monitor_x11.cc similarity index 91% rename from remoting/host/local_input_monitor_linux.cc rename to remoting/host/local_input_monitor_x11.cc index b0493dddf6d3..1da192f0a50a 100644 --- a/remoting/host/local_input_monitor_linux.cc +++ b/remoting/host/local_input_monitor_x11.cc @@ -32,17 +32,17 @@ namespace remoting { namespace { -class LocalInputMonitorLinux : public base::NonThreadSafe, +class LocalInputMonitorX11 : public base::NonThreadSafe, public LocalInputMonitor { public: - LocalInputMonitorLinux( + LocalInputMonitorX11( scoped_refptr caller_task_runner, scoped_refptr input_task_runner, base::WeakPtr client_session_control); - ~LocalInputMonitorLinux() override; + ~LocalInputMonitorX11() override; private: - // The actual implementation resides in LocalInputMonitorLinux::Core class. + // The actual implementation resides in LocalInputMonitorX11::Core class. class Core : public base::RefCountedThreadSafe, public base::MessagePumpLibevent::Watcher { @@ -99,10 +99,10 @@ class LocalInputMonitorLinux : public base::NonThreadSafe, scoped_refptr core_; - DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorLinux); + DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorX11); }; -LocalInputMonitorLinux::LocalInputMonitorLinux( +LocalInputMonitorX11::LocalInputMonitorX11( scoped_refptr caller_task_runner, scoped_refptr input_task_runner, base::WeakPtr client_session_control) @@ -112,11 +112,11 @@ LocalInputMonitorLinux::LocalInputMonitorLinux( core_->Start(); } -LocalInputMonitorLinux::~LocalInputMonitorLinux() { +LocalInputMonitorX11::~LocalInputMonitorX11() { core_->Stop(); } -LocalInputMonitorLinux::Core::Core( +LocalInputMonitorX11::Core::Core( scoped_refptr caller_task_runner, scoped_refptr input_task_runner, base::WeakPtr client_session_control) @@ -135,21 +135,21 @@ LocalInputMonitorLinux::Core::Core( x_record_range_[1] = NULL; } -void LocalInputMonitorLinux::Core::Start() { +void LocalInputMonitorX11::Core::Start() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); input_task_runner_->PostTask(FROM_HERE, base::Bind(&Core::StartOnInputThread, this)); } -void LocalInputMonitorLinux::Core::Stop() { +void LocalInputMonitorX11::Core::Stop() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); input_task_runner_->PostTask(FROM_HERE, base::Bind(&Core::StopOnInputThread, this)); } -LocalInputMonitorLinux::Core::~Core() { +LocalInputMonitorX11::Core::~Core() { DCHECK(!display_); DCHECK(!x_record_display_); DCHECK(!x_record_range_[0]); @@ -157,7 +157,7 @@ LocalInputMonitorLinux::Core::~Core() { DCHECK(!x_record_context_); } -void LocalInputMonitorLinux::Core::StartOnInputThread() { +void LocalInputMonitorX11::Core::StartOnInputThread() { DCHECK(input_task_runner_->BelongsToCurrentThread()); DCHECK(!display_); DCHECK(!x_record_display_); @@ -231,7 +231,7 @@ void LocalInputMonitorLinux::Core::StartOnInputThread() { } } -void LocalInputMonitorLinux::Core::StopOnInputThread() { +void LocalInputMonitorX11::Core::StopOnInputThread() { DCHECK(input_task_runner_->BelongsToCurrentThread()); // Context must be disabled via the control channel because we can't send @@ -265,7 +265,7 @@ void LocalInputMonitorLinux::Core::StopOnInputThread() { } } -void LocalInputMonitorLinux::Core::OnFileCanReadWithoutBlocking(int fd) { +void LocalInputMonitorX11::Core::OnFileCanReadWithoutBlocking(int fd) { DCHECK(input_task_runner_->BelongsToCurrentThread()); // Fetch pending events if any. @@ -275,11 +275,11 @@ void LocalInputMonitorLinux::Core::OnFileCanReadWithoutBlocking(int fd) { } } -void LocalInputMonitorLinux::Core::OnFileCanWriteWithoutBlocking(int fd) { +void LocalInputMonitorX11::Core::OnFileCanWriteWithoutBlocking(int fd) { NOTREACHED(); } -void LocalInputMonitorLinux::Core::ProcessXEvent(xEvent* event) { +void LocalInputMonitorX11::Core::ProcessXEvent(xEvent* event) { DCHECK(input_task_runner_->BelongsToCurrentThread()); if (event->u.u.type == MotionNotify) { @@ -306,7 +306,7 @@ void LocalInputMonitorLinux::Core::ProcessXEvent(xEvent* event) { } // static -void LocalInputMonitorLinux::Core::ProcessReply(XPointer self, +void LocalInputMonitorX11::Core::ProcessReply(XPointer self, XRecordInterceptData* data) { if (data->category == XRecordFromServer) { xEvent* event = reinterpret_cast(data->data); @@ -322,7 +322,7 @@ scoped_ptr LocalInputMonitor::Create( scoped_refptr input_task_runner, scoped_refptr ui_task_runner, base::WeakPtr client_session_control) { - return make_scoped_ptr(new LocalInputMonitorLinux( + return make_scoped_ptr(new LocalInputMonitorX11( caller_task_runner, input_task_runner, client_session_control)); } diff --git a/remoting/remoting_host.gypi b/remoting/remoting_host.gypi index 08d6639fa680..efe36d11484f 100644 --- a/remoting/remoting_host.gypi +++ b/remoting/remoting_host.gypi @@ -21,7 +21,8 @@ 'enable_it2me_host': 0, 'enable_remoting_host': 0, }], - ['chromeos==1 and use_x11==1', { + ['chromeos==1', { + 'enable_remoting_host': 1, 'enable_me2me_host': 0, 'enable_it2me_host': 1, }], @@ -60,13 +61,23 @@ ], 'conditions': [ ['OS=="linux"', { - 'dependencies': [ - '../build/linux/system.gyp:x11', - '../build/linux/system.gyp:xext', - '../build/linux/system.gyp:xfixes', - '../build/linux/system.gyp:xi', - '../build/linux/system.gyp:xrandr', - '../build/linux/system.gyp:xtst', + 'conditions': [ + ['use_x11==1', { + 'dependencies': [ + '../build/linux/system.gyp:x11', + '../build/linux/system.gyp:xext', + '../build/linux/system.gyp:xfixes', + '../build/linux/system.gyp:xi', + '../build/linux/system.gyp:xrandr', + '../build/linux/system.gyp:xtst', + ], + }], + ['chromeos==0 and use_ozone==0', { + 'dependencies': [ + # use GTK on Linux, even for Aura builds. + '../build/linux/system.gyp:gtk', + ], + }] ], 'link_settings': { 'libraries': [ @@ -74,12 +85,6 @@ ], }, }], - ['OS=="linux" and chromeos==0 and use_ozone==0', { - 'dependencies' : [ - # Always use GTK on Linux, even for Aura builds. - '../build/linux/system.gyp:gtk', - ], - }], ['chromeos==1', { 'dependencies' : [ '../cc/cc.gyp:cc', @@ -90,6 +95,7 @@ '../ui/aura/aura.gyp:aura', '../ui/compositor/compositor.gyp:compositor', '../ui/events/events.gyp:events', + '../ui/events/platform/events_platform.gyp:events_platform', '../ui/views/views.gyp:views', ], 'include_dirs': [ @@ -99,21 +105,22 @@ 'host/clipboard_x11.cc', 'host/continue_window_linux.cc', 'host/disconnect_window_linux.cc', + 'host/linux/x_server_clipboard.cc', + 'host/linux/x_server_clipboard.h', 'host/policy_hack/policy_watcher_linux.cc', 'host/remoting_me2me_host.cc', - ] - }, { # chromeos==0 - 'sources!' : [ - 'host/chromeos/aura_desktop_capturer.cc', - 'host/chromeos/aura_desktop_capturer.h', - 'host/chromeos/message_box.cc', - 'host/chromeos/message_box.h', - 'host/clipboard_aura.cc', - 'host/clipboard_aura.h', - 'host/continue_window_chromeos.cc', - 'host/disconnect_window_chromeos.cc', - 'host/policy_hack/policy_watcher_chromeos.cc', - ], + ], + 'conditions': [ + ['use_ozone==0', { + 'sources!': [ + 'host/input_injector_chromeos.cc', + 'host/input_injector_chromeos.h', + 'host/local_input_monitor_chromeos.cc', + 'host/chromeos/mouse_cursor_monitor_aura.cc', + 'host/chromeos/mouse_cursor_monitor_aura.h', + ], + }], + ], }], ['OS=="mac"', { 'dependencies': [ diff --git a/remoting/remoting_host_srcs.gypi b/remoting/remoting_host_srcs.gypi index c28af6a705de..2f42525096f0 100644 --- a/remoting/remoting_host_srcs.gypi +++ b/remoting/remoting_host_srcs.gypi @@ -24,8 +24,12 @@ 'host/capture_scheduler.h', 'host/chromeos/aura_desktop_capturer.cc', 'host/chromeos/aura_desktop_capturer.h', + 'host/chromeos/clipboard_aura.cc', + 'host/chromeos/clipboard_aura.h', 'host/chromeos/message_box.cc', 'host/chromeos/message_box.h', + 'host/chromeos/mouse_cursor_monitor_aura.cc', + 'host/chromeos/mouse_cursor_monitor_aura.h', 'host/chromium_port_allocator_factory.cc', 'host/chromium_port_allocator_factory.h', 'host/chromoting_host.cc', @@ -40,8 +44,6 @@ 'host/client_session.h', 'host/client_session_control.h', 'host/clipboard.h', - 'host/clipboard_aura.cc', - 'host/clipboard_aura.h', 'host/clipboard_mac.mm', 'host/clipboard_win.cc', 'host/clipboard_x11.cc', @@ -78,7 +80,7 @@ 'host/desktop_shape_tracker.h', 'host/desktop_shape_tracker_mac.cc', 'host/desktop_shape_tracker_win.cc', - 'host/desktop_shape_tracker_x11.cc', + 'host/desktop_shape_tracker_linux.cc', 'host/disconnect_window_chromeos.cc', 'host/disconnect_window_linux.cc', 'host/disconnect_window_mac.h', @@ -123,9 +125,11 @@ 'host/in_memory_host_config.cc', 'host/in_memory_host_config.h', 'host/input_injector.h', - 'host/input_injector_linux.cc', + 'host/input_injector_chromeos.cc', + 'host/input_injector_chromeos.h', 'host/input_injector_mac.cc', 'host/input_injector_win.cc', + 'host/input_injector_x11.cc', 'host/ipc_audio_capturer.cc', 'host/ipc_audio_capturer.h', 'host/ipc_constants.cc', @@ -158,9 +162,10 @@ 'host/linux/x_server_clipboard.cc', 'host/linux/x_server_clipboard.h', 'host/local_input_monitor.h', - 'host/local_input_monitor_linux.cc', + 'host/local_input_monitor_chromeos.cc', 'host/local_input_monitor_mac.mm', 'host/local_input_monitor_win.cc', + 'host/local_input_monitor_x11.cc', 'host/logging.h', 'host/logging_posix.cc', 'host/logging_win.cc', diff --git a/remoting/remoting_test.gypi b/remoting/remoting_test.gypi index a01692999b96..dd94e32a24a9 100644 --- a/remoting/remoting_test.gypi +++ b/remoting/remoting_test.gypi @@ -136,10 +136,10 @@ 'host/branding.h', 'host/capture_scheduler_unittest.cc', 'host/chromeos/aura_desktop_capturer_unittest.cc', + 'host/chromeos/clipboard_aura_unittest.cc', 'host/chromoting_host_context_unittest.cc', 'host/chromoting_host_unittest.cc', 'host/client_session_unittest.cc', - 'host/clipboard_aura_unittest.cc', 'host/config_file_watcher_unittest.cc', 'host/daemon_process_unittest.cc', 'host/desktop_process_unittest.cc', @@ -251,6 +251,10 @@ 'host/chromeos/aura_desktop_capturer_unittest.cc', 'host/clipboard_aura_unittest.cc', ], + }, { # chromeos==1 + 'sources!': [ + 'host/linux/x_server_clipboard_unittest.cc', + ], }], ['enable_remoting_host == 0', { 'dependencies!': [