summaryrefslogtreecommitdiffstats
path: root/media/base/user_input_monitor.h
diff options
context:
space:
mode:
authorjiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-15 22:02:40 +0000
committerjiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-15 22:02:40 +0000
commit61f697f26142f5081aaee176ccd82a2af170eabf (patch)
tree2dab2a85e1824e8b94ff4beafbaaff180f5778e0 /media/base/user_input_monitor.h
parent92be5a41c4a56014723da338a53f5cbed515fe77 (diff)
downloadchromium_src-61f697f26142f5081aaee176ccd82a2af170eabf.zip
chromium_src-61f697f26142f5081aaee176ccd82a2af170eabf.tar.gz
chromium_src-61f697f26142f5081aaee176ccd82a2af170eabf.tar.bz2
Adding key press detection in the browser process.
It works like this on the browser side: A new object UserInputMonitor is created on BrowserMainLoop and passed to AudioInputRendererHost to pass to AudioInputController. AudioInputController::DoRecord calls UserInputMonitor::AddKeyStrokeListener --> UserInputMonitor listens to system key events (only implemented on Linux) --> AudioInputController::OnKeyPressed is called and sets key_pressed_ --> When AudioInputController::OnData called, it writes key_pressed_ to shared memory along with the audio data buffer. On the renderer side a new param "key_pressed" is added through the code path of passing the flag to the webrtc voice engine. This CL includes all these changes except the implementation of UserInputMonitor for Windows and Mac. The impl of UserInputMonitor is mostly copied from remoting/host/local_input_monitor_linux.cc BUG= Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=217768 Review URL: https://chromiumcodereview.appspot.com/21183002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217844 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/user_input_monitor.h')
-rw-r--r--media/base/user_input_monitor.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/media/base/user_input_monitor.h b/media/base/user_input_monitor.h
new file mode 100644
index 0000000..9eb82f3
--- /dev/null
+++ b/media/base/user_input_monitor.h
@@ -0,0 +1,99 @@
+// Copyright 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.
+
+#ifndef MEDIA_BASE_USER_INPUT_MONITOR_H_
+#define MEDIA_BASE_USER_INPUT_MONITOR_H_
+
+#include <set>
+
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
+#include "base/synchronization/lock.h"
+#include "media/base/media_export.h"
+#include "ui/base/events/event_constants.h"
+#include "ui/base/keycodes/keyboard_codes.h"
+
+struct SkIPoint;
+
+namespace base {
+class SingleThreadTaskRunner;
+} // namespace base
+
+namespace media {
+
+// Monitors and notifies about mouse movements and keyboard events.
+// Thread safe. The thread on which the listenters are called is not guaranteed.
+// The callers should not perform expensive/blocking tasks in the callback since
+// it might be called on the browser UI/IO threads.
+class MEDIA_EXPORT UserInputMonitor {
+ public:
+ // The interface to receive mouse movement events.
+ class MEDIA_EXPORT MouseEventListener {
+ public:
+ // |position| is the new mouse position.
+ virtual void OnMouseMoved(const SkIPoint& position) = 0;
+
+ protected:
+ virtual ~MouseEventListener() {}
+ };
+ // The interface to receive key stroke events.
+ class MEDIA_EXPORT KeyStrokeListener {
+ public:
+ // Called when any key is pressed. Called only once until the key is
+ // released, i.e. holding down a key for a long period will generate one
+ // callback just when the key is pressed down.
+ virtual void OnKeyStroke() = 0;
+
+ protected:
+ virtual ~KeyStrokeListener() {}
+ };
+
+ virtual ~UserInputMonitor();
+
+ // Creates a platform-specific instance of UserInputMonitor.
+ // |io_task_runner| is the task runner for an IO thread.
+ // |ui_task_runner| is the task runner for a UI thread.
+ static scoped_ptr<UserInputMonitor> Create(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner);
+
+ // The same |listener| should only be added once.
+ // The clients should make sure to call Remove*Listener before |listener| is
+ // destroyed.
+ void AddMouseListener(MouseEventListener* listener);
+ void RemoveMouseListener(MouseEventListener* listener);
+ void AddKeyStrokeListener(KeyStrokeListener* listener);
+ void RemoveKeyStrokeListener(KeyStrokeListener* listener);
+
+ protected:
+ UserInputMonitor();
+
+ // Called by the platform-specific sub-classes to propagate the events to the
+ // listeners.
+ void OnMouseEvent(const SkIPoint& position);
+ void OnKeyboardEvent(ui::EventType event, ui::KeyboardCode key_code);
+
+ private:
+ virtual void StartMouseMonitoring() = 0;
+ virtual void StopMouseMonitoring() = 0;
+ virtual void StartKeyboardMonitoring() = 0;
+ virtual void StopKeyboardMonitoring() = 0;
+
+ base::Lock lock_;
+ ObserverList<MouseEventListener, true> mouse_listeners_;
+ ObserverList<KeyStrokeListener, true> key_stroke_listeners_;
+ bool monitoring_mouse_;
+ bool monitoring_keyboard_;
+ // The set of keys currently held down. Used for convering raw keyboard events
+ // into KeyStrokeListener callbacks.
+ std::set<ui::KeyboardCode> pressed_keys_;
+
+ DISALLOW_COPY_AND_ASSIGN(UserInputMonitor);
+};
+
+} // namespace media
+
+#endif // MEDIA_BASE_USER_INPUT_MONITOR_H_