Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(824)

Unified Diff: media/base/user_input_monitor_linux.cc

Issue 21183002: Adding key press detection in the browser process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/user_input_monitor_linux.cc
diff --git a/remoting/host/local_input_monitor_linux.cc b/media/base/user_input_monitor_linux.cc
similarity index 55%
copy from remoting/host/local_input_monitor_linux.cc
copy to media/base/user_input_monitor_linux.cc
index 3d85bf8a2943873718f56befd4c7594316e936d7..875f90164c5708d484b08666953ac34935dcae00 100644
--- a/remoting/host/local_input_monitor_linux.cc
+++ b/media/base/user_input_monitor_linux.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright (c) 2013 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 "media/base/user_input_monitor.h"
#include <sys/select.h>
#include <unistd.h>
@@ -20,8 +20,8 @@
#include "base/posix/eintr_wrapper.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/skia/include/core/SkPoint.h"
+#include "ui/base/keycodes/keyboard_code_conversion_x.h"
// These includes need to be later than dictated by the style guide due to
// Xlib header pollution, specifically the min, max, and Status macros.
@@ -29,28 +29,30 @@
#include <X11/Xlibint.h>
#include <X11/extensions/record.h>
-namespace remoting {
+namespace media {
namespace {
-class LocalInputMonitorLinux : public base::NonThreadSafe,
- public LocalInputMonitor {
+class UserInputMonitorLinux : public base::NonThreadSafe,
+ public UserInputMonitor {
public:
- LocalInputMonitorLinux(
- scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
- base::WeakPtr<ClientSessionControl> client_session_control);
- virtual ~LocalInputMonitorLinux();
+ UserInputMonitorLinux(
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner,
+ uint8 input_event_mask,
+ const base::WeakPtr<UserInputObserver>& observer);
+ virtual ~UserInputMonitorLinux();
private:
- // The actual implementation resides in LocalInputMonitorLinux::Core class.
- class Core
- : public base::RefCountedThreadSafe<Core>,
- public base::MessagePumpLibevent::Watcher {
+ // The actual implementation resides in UserInputMonitorLinux::Core class.
+ class Core : public base::RefCountedThreadSafe<Core>,
+ public base::MessagePumpLibevent::Watcher {
public:
- Core(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
- base::WeakPtr<ClientSessionControl> client_session_control);
+ Core(
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner,
+ uint8 input_event_mask,
+ const base::WeakPtr<UserInputObserver>& observer);
void Start();
void Stop();
@@ -71,86 +73,75 @@ class LocalInputMonitorLinux : public base::NonThreadSafe,
static void ProcessReply(XPointer self, XRecordInterceptData* data);
- // Task runner on which public methods of this class must be called.
- scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
-
// Task runner on which X Window events are received.
- scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner_;
Sergey Ulanov 2013/08/08 01:25:48 Ouch. This shouldn't be a const ref. It will crash
jiayl 2013/08/09 23:30:14 Oops, find&replace error. Fixed.
+
+ // Task runner on which public methods of this class must be called.
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner_;
- // Points to the object receiving mouse event notifications and session
- // disconnect requests.
- base::WeakPtr<ClientSessionControl> client_session_control_;
+ // Points to the object receiving notifications.
+ const base::WeakPtr<UserInputObserver>& observer_;
Sergey Ulanov 2013/08/08 01:25:48 same here. It should be weak ptr member. Not a con
jiayl 2013/08/09 23:30:14 Done.
// Used to receive base::MessagePumpLibevent::Watcher events.
base::MessagePumpLibevent::FileDescriptorWatcher controller_;
- // True when Alt is pressed.
- bool alt_pressed_;
-
- // True when Ctrl is pressed.
- bool ctrl_pressed_;
-
Display* display_;
Display* x_record_display_;
XRecordRange* x_record_range_[2];
XRecordContext x_record_context_;
+ uint8 input_event_mask_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
scoped_refptr<Core> core_;
- DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorLinux);
+ DISALLOW_COPY_AND_ASSIGN(UserInputMonitorLinux);
};
-LocalInputMonitorLinux::LocalInputMonitorLinux(
- scoped_refptr<base::SingleThreadTaskRunner> caller_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)) {
+UserInputMonitorLinux::UserInputMonitorLinux(
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner,
+ uint8 input_event_mask,
+ const base::WeakPtr<UserInputObserver>& observer)
+ : core_(new Core(input_task_runner,
+ observer_task_runner,
+ input_event_mask,
+ observer)) {
core_->Start();
}
-LocalInputMonitorLinux::~LocalInputMonitorLinux() {
- core_->Stop();
-}
+UserInputMonitorLinux::~UserInputMonitorLinux() { core_->Stop(); }
-LocalInputMonitorLinux::Core::Core(
- scoped_refptr<base::SingleThreadTaskRunner> caller_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),
- client_session_control_(client_session_control),
- alt_pressed_(false),
- ctrl_pressed_(false),
+UserInputMonitorLinux::Core::Core(
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner,
+ uint8 input_event_mask,
+ const base::WeakPtr<UserInputObserver>& observer)
+ : input_task_runner_(input_task_runner),
+ observer_task_runner_(observer_task_runner),
+ observer_(observer),
display_(NULL),
x_record_display_(NULL),
- x_record_context_(0) {
- DCHECK(caller_task_runner_->BelongsToCurrentThread());
- DCHECK(client_session_control_.get());
+ x_record_context_(0),
+ input_event_mask_(input_event_mask) {
+ DCHECK(observer_.get());
x_record_range_[0] = NULL;
x_record_range_[1] = NULL;
}
-void LocalInputMonitorLinux::Core::Start() {
- DCHECK(caller_task_runner_->BelongsToCurrentThread());
-
+void UserInputMonitorLinux::Core::Start() {
input_task_runner_->PostTask(FROM_HERE,
base::Bind(&Core::StartOnInputThread, this));
}
-void LocalInputMonitorLinux::Core::Stop() {
- DCHECK(caller_task_runner_->BelongsToCurrentThread());
-
+void UserInputMonitorLinux::Core::Stop() {
input_task_runner_->PostTask(FROM_HERE,
base::Bind(&Core::StopOnInputThread, this));
}
-LocalInputMonitorLinux::Core::~Core() {
+UserInputMonitorLinux::Core::~Core() {
DCHECK(!display_);
DCHECK(!x_record_display_);
DCHECK(!x_record_range_[0]);
@@ -158,7 +149,7 @@ LocalInputMonitorLinux::Core::~Core() {
DCHECK(!x_record_context_);
}
-void LocalInputMonitorLinux::Core::StartOnInputThread() {
+void UserInputMonitorLinux::Core::StartOnInputThread() {
DCHECK(input_task_runner_->BelongsToCurrentThread());
DCHECK(!display_);
DCHECK(!x_record_display_);
@@ -190,21 +181,29 @@ void LocalInputMonitorLinux::Core::StartOnInputThread() {
LOG(ERROR) << "XRecordAllocRange failed.";
return;
}
- x_record_range_[0]->device_events.first = MotionNotify;
- x_record_range_[0]->device_events.last = MotionNotify;
- x_record_range_[1]->device_events.first = KeyPress;
- x_record_range_[1]->device_events.last = KeyRelease;
- XRecordClientSpec client_spec = XRecordAllClients;
+ if (input_event_mask_ & MOUSE_MOVEMENT) {
+ x_record_range_[0]->device_events.first = MotionNotify;
+ x_record_range_[0]->device_events.last = MotionNotify;
+ }
+ if (input_event_mask_ & KEYBOARD_EVENT) {
+ x_record_range_[1]->device_events.first = KeyPress;
+ x_record_range_[1]->device_events.last = KeyRelease;
+ }
- x_record_context_ = XRecordCreateContext(
- x_record_display_, 0, &client_spec, 1, x_record_range_,
- arraysize(x_record_range_));
+ XRecordClientSpec client_spec = XRecordAllClients;
+ x_record_context_ = XRecordCreateContext(x_record_display_,
Sergey Ulanov 2013/08/08 01:25:48 nit: IMO it's more readable when there are more th
jiayl 2013/08/09 23:30:14 This is auto formatted by "git-cl format".
+ 0,
+ &client_spec,
+ 1,
+ x_record_range_,
+ arraysize(x_record_range_));
if (!x_record_context_) {
LOG(ERROR) << "XRecordCreateContext failed.";
return;
}
- if (!XRecordEnableContextAsync(x_record_display_, x_record_context_,
+ if (!XRecordEnableContextAsync(x_record_display_,
+ x_record_context_,
&Core::ProcessReply,
reinterpret_cast<XPointer>(this))) {
LOG(ERROR) << "XRecordEnableContextAsync failed.";
@@ -232,7 +231,7 @@ void LocalInputMonitorLinux::Core::StartOnInputThread() {
}
}
-void LocalInputMonitorLinux::Core::StopOnInputThread() {
+void UserInputMonitorLinux::Core::StopOnInputThread() {
DCHECK(input_task_runner_->BelongsToCurrentThread());
// Context must be disabled via the control channel because we can't send
@@ -266,7 +265,7 @@ void LocalInputMonitorLinux::Core::StopOnInputThread() {
}
}
-void LocalInputMonitorLinux::Core::OnFileCanReadWithoutBlocking(int fd) {
+void UserInputMonitorLinux::Core::OnFileCanReadWithoutBlocking(int fd) {
DCHECK(input_task_runner_->BelongsToCurrentThread());
// Fetch pending events if any.
@@ -276,39 +275,39 @@ void LocalInputMonitorLinux::Core::OnFileCanReadWithoutBlocking(int fd) {
}
}
-void LocalInputMonitorLinux::Core::OnFileCanWriteWithoutBlocking(int fd) {
+void UserInputMonitorLinux::Core::OnFileCanWriteWithoutBlocking(int fd) {
NOTREACHED();
}
-void LocalInputMonitorLinux::Core::ProcessXEvent(xEvent* event) {
+void UserInputMonitorLinux::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));
- caller_task_runner_->PostTask(
- FROM_HERE, base::Bind(&ClientSessionControl::OnLocalMouseMoved,
- client_session_control_,
- position));
+ observer_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&UserInputObserver::OnMouseMoved, observer_, position));
} else {
- int key_code = event->u.u.detail;
- bool down = event->u.u.type == KeyPress;
- KeySym key_sym = XkbKeycodeToKeysym(display_, key_code, 0, 0);
- if (key_sym == XK_Control_L || key_sym == XK_Control_R) {
- ctrl_pressed_ = down;
- } 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_) {
- caller_task_runner_->PostTask(
- FROM_HERE, base::Bind(&ClientSessionControl::DisconnectSession,
- client_session_control_));
- }
+ ui::EventType type;
+ if (event->u.u.type == KeyPress)
+ type = ui::ET_KEY_PRESSED;
Sergey Ulanov 2013/08/08 01:25:48 add {} for multi-line if statement.
jiayl 2013/08/09 23:30:14 Done.
+ else if (event->u.u.type == KeyRelease)
+ type = ui::ET_KEY_RELEASED;
+ else
+ return;
+ KeySym key_sym = XkbKeycodeToKeysym(display_, event->u.u.detail, 0, 0);
+ ui::KeyboardCode key_code = ui::KeyboardCodeFromXKeysym(key_sym);
+ observer_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &UserInputObserver::OnKeyboardEvent, observer_, type, key_code));
}
}
// static
-void LocalInputMonitorLinux::Core::ProcessReply(XPointer self,
- XRecordInterceptData* data) {
+void UserInputMonitorLinux::Core::ProcessReply(XPointer self,
+ XRecordInterceptData* data) {
if (data->category == XRecordFromServer) {
xEvent* event = reinterpret_cast<xEvent*>(data->data);
reinterpret_cast<Core*>(self)->ProcessXEvent(event);
@@ -318,15 +317,14 @@ void LocalInputMonitorLinux::Core::ProcessReply(XPointer self,
} // namespace
-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,
- base::WeakPtr<ClientSessionControl> client_session_control) {
- return scoped_ptr<LocalInputMonitor>(
- new LocalInputMonitorLinux(caller_task_runner,
- input_task_runner,
- client_session_control));
+scoped_ptr<UserInputMonitor> UserInputMonitor::Create(
+ const scoped_refptr<base::SingleThreadTaskRunner>& input_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& observer_task_runner,
+ uint8 input_event_mask,
+ const base::WeakPtr<UserInputObserver>& observer) {
+ return scoped_ptr<UserInputMonitor>(new UserInputMonitorLinux(
+ input_task_runner, observer_task_runner, input_event_mask, observer));
}
-} // namespace remoting
+} // namespace media

Powered by Google App Engine
This is Rietveld 408576698