Index: remoting/host/local_input_monitor_linux.cc |
diff --git a/remoting/host/local_input_monitor_linux.cc b/remoting/host/local_input_monitor_linux.cc |
index 241b1b42cc21a26aa778bc842d20494749513e24..31238321bfcaab5a3bed676544e3e5a37340f492 100644 |
--- a/remoting/host/local_input_monitor_linux.cc |
+++ b/remoting/host/local_input_monitor_linux.cc |
@@ -19,7 +19,8 @@ |
#include "base/message_pump_libevent.h" |
#include "base/posix/eintr_wrapper.h" |
#include "base/single_thread_task_runner.h" |
-#include "remoting/host/mouse_move_observer.h" |
+#include "base/threading/non_thread_safe.h" |
+#include "remoting/host/client_session_control.h" |
#include "third_party/skia/include/core/SkPoint.h" |
// These includes need to be later than dictated by the style guide due to |
@@ -32,17 +33,15 @@ namespace remoting { |
namespace { |
-class LocalInputMonitorLinux : public LocalInputMonitor { |
+class LocalInputMonitorLinux : public base::NonThreadSafe, |
+ public LocalInputMonitor { |
public: |
LocalInputMonitorLinux( |
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner); |
+ scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
+ base::WeakPtr<ClientSessionControl> client_session_control); |
virtual ~LocalInputMonitorLinux(); |
- virtual void Start(MouseMoveObserver* mouse_move_observer, |
- const base::Closure& disconnect_callback) OVERRIDE; |
- virtual void Stop() OVERRIDE; |
- |
private: |
// The actual implementation resides in LocalInputMonitorLinux::Core class. |
class Core |
@@ -50,10 +49,10 @@ class LocalInputMonitorLinux : public LocalInputMonitor { |
public base::MessagePumpLibevent::Watcher { |
public: |
Core(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner); |
+ scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
+ base::WeakPtr<ClientSessionControl> client_session_control); |
- void Start(MouseMoveObserver* mouse_move_observer, |
- const base::Closure& disconnect_callback); |
+ void Start(); |
void Stop(); |
private: |
@@ -67,13 +66,6 @@ class LocalInputMonitorLinux : public LocalInputMonitor { |
virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; |
virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; |
- // Posts OnLocalMouseMoved() notification to |mouse_move_observer_| on |
- // the |caller_task_runner_| thread. |
- void OnLocalMouseMoved(const SkIPoint& position); |
- |
- // Posts |disconnect_callback_| on the |caller_task_runner_| thread. |
- void OnDisconnectShortcut(); |
- |
// Processes key and mouse events. |
void ProcessXEvent(xEvent* event); |
@@ -85,12 +77,9 @@ class LocalInputMonitorLinux : public LocalInputMonitor { |
// Task runner on which X Window events are received. |
scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_; |
- // Invoked in the |caller_task_runner_| thread to report local mouse events. |
- MouseMoveObserver* mouse_move_observer_; |
- |
- // Posted to the |caller_task_runner_| thread every time the disconnect key |
- // combination is pressed. |
- base::Closure disconnect_callback_; |
+ // Points to the object receiving mouse event notifications and session |
+ // disconnect requests. |
+ base::WeakPtr<ClientSessionControl> client_session_control_; |
// Used to receive base::MessagePumpLibevent::Watcher events. |
base::MessagePumpLibevent::FileDescriptorWatcher controller_; |
@@ -116,51 +105,40 @@ class LocalInputMonitorLinux : public LocalInputMonitor { |
LocalInputMonitorLinux::LocalInputMonitorLinux( |
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner) |
- : core_(new Core(caller_task_runner, input_task_runner)) { |
+ scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
+ base::WeakPtr<ClientSessionControl> client_session_control) |
+ : core_(new Core(caller_task_runner, |
+ input_task_runner, |
+ client_session_control)) { |
+ core_->Start(); |
} |
LocalInputMonitorLinux::~LocalInputMonitorLinux() { |
-} |
- |
-void LocalInputMonitorLinux::Start( |
- MouseMoveObserver* mouse_move_observer, |
- const base::Closure& disconnect_callback) { |
- core_->Start(mouse_move_observer, disconnect_callback); |
-} |
- |
-void LocalInputMonitorLinux::Stop() { |
core_->Stop(); |
} |
LocalInputMonitorLinux::Core::Core( |
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner) |
+ scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
+ base::WeakPtr<ClientSessionControl> client_session_control) |
: caller_task_runner_(caller_task_runner), |
input_task_runner_(input_task_runner), |
- mouse_move_observer_(NULL), |
+ client_session_control_(client_session_control), |
alt_pressed_(false), |
ctrl_pressed_(false), |
display_(NULL), |
x_record_display_(NULL), |
x_record_context_(0) { |
DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
+ DCHECK(client_session_control_); |
x_record_range_[0] = NULL; |
x_record_range_[1] = NULL; |
} |
-void LocalInputMonitorLinux::Core::Start( |
- MouseMoveObserver* mouse_move_observer, |
- const base::Closure& disconnect_callback) { |
+void LocalInputMonitorLinux::Core::Start() { |
DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
- DCHECK(disconnect_callback_.is_null()); |
- DCHECK(!disconnect_callback.is_null()); |
- DCHECK(!mouse_move_observer_); |
- DCHECK(mouse_move_observer); |
- disconnect_callback_ = disconnect_callback; |
- mouse_move_observer_ = mouse_move_observer; |
input_task_runner_->PostTask(FROM_HERE, |
base::Bind(&Core::StartOnInputThread, this)); |
} |
@@ -168,15 +146,11 @@ void LocalInputMonitorLinux::Core::Start( |
void LocalInputMonitorLinux::Core::Stop() { |
DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
- disconnect_callback_.Reset(); |
- mouse_move_observer_ = NULL; |
input_task_runner_->PostTask(FROM_HERE, |
base::Bind(&Core::StopOnInputThread, this)); |
} |
LocalInputMonitorLinux::Core::~Core() { |
- DCHECK(disconnect_callback_.is_null()); |
- DCHECK(!mouse_move_observer_); |
DCHECK(!display_); |
DCHECK(!x_record_display_); |
DCHECK(!x_record_range_[0]); |
@@ -303,35 +277,16 @@ void LocalInputMonitorLinux::Core::OnFileCanWriteWithoutBlocking(int fd) { |
NOTREACHED(); |
} |
-void LocalInputMonitorLinux::Core::OnLocalMouseMoved(const SkIPoint& position) { |
- if (!caller_task_runner_->BelongsToCurrentThread()) { |
- caller_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&Core::OnLocalMouseMoved, this, position)); |
- return; |
- } |
- |
- if (mouse_move_observer_) |
- mouse_move_observer_->OnLocalMouseMoved(position); |
-} |
- |
-void LocalInputMonitorLinux::Core::OnDisconnectShortcut() { |
- if (!caller_task_runner_->BelongsToCurrentThread()) { |
- caller_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&Core::OnDisconnectShortcut, this)); |
- return; |
- } |
- |
- if (!disconnect_callback_.is_null()) |
- disconnect_callback_.Run(); |
-} |
- |
void LocalInputMonitorLinux::Core::ProcessXEvent(xEvent* event) { |
DCHECK(input_task_runner_->BelongsToCurrentThread()); |
if (event->u.u.type == MotionNotify) { |
SkIPoint position(SkIPoint::Make(event->u.keyButtonPointer.rootX, |
event->u.keyButtonPointer.rootY)); |
- OnLocalMouseMoved(position); |
+ caller_task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&ClientSessionControl::OnLocalMouseMoved, |
+ client_session_control_, |
+ position)); |
} else { |
int key_code = event->u.u.detail; |
bool down = event->u.u.type == KeyPress; |
@@ -341,7 +296,9 @@ void LocalInputMonitorLinux::Core::ProcessXEvent(xEvent* event) { |
} else if (key_sym == XK_Alt_L || key_sym == XK_Alt_R) { |
alt_pressed_ = down; |
} else if (key_sym == XK_Escape && down && alt_pressed_ && ctrl_pressed_) { |
- OnDisconnectShortcut(); |
+ caller_task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&ClientSessionControl::DisconnectSession, |
+ client_session_control_)); |
} |
} |
} |
@@ -361,9 +318,12 @@ void LocalInputMonitorLinux::Core::ProcessReply(XPointer self, |
scoped_ptr<LocalInputMonitor> LocalInputMonitor::Create( |
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ base::WeakPtr<ClientSessionControl> client_session_control) { |
return scoped_ptr<LocalInputMonitor>( |
- new LocalInputMonitorLinux(caller_task_runner, input_task_runner)); |
+ new LocalInputMonitorLinux(caller_task_runner, |
+ input_task_runner, |
+ client_session_control)); |
} |
} // namespace remoting |