• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef MEDIA_BASE_USER_INPUT_MONITOR_H_
6 #define MEDIA_BASE_USER_INPUT_MONITOR_H_
7 
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/observer_list_threadsafe.h"
11 #include "base/synchronization/lock.h"
12 #include "media/base/media_export.h"
13 
14 struct SkIPoint;
15 
16 namespace base {
17 class SingleThreadTaskRunner;
18 }  // namespace base
19 
20 namespace media {
21 
22 // Monitors and notifies about mouse movements and keyboard events.
23 // Thread safe. The listeners are called on the thread where the listeners are
24 // added.
25 class MEDIA_EXPORT UserInputMonitor {
26  public:
27   // The interface to receive mouse movement events.
28   class MEDIA_EXPORT MouseEventListener {
29    public:
30     // |position| is the new mouse position.
31     virtual void OnMouseMoved(const SkIPoint& position) = 0;
32 
33    protected:
~MouseEventListener()34     virtual ~MouseEventListener() {}
35   };
36   typedef ObserverListThreadSafe<UserInputMonitor::MouseEventListener>
37       MouseListenerList;
38 
39   UserInputMonitor();
40   virtual ~UserInputMonitor();
41 
42   // Creates a platform-specific instance of UserInputMonitor.
43   // |io_task_runner| is the task runner for an IO thread.
44   // |ui_task_runner| is the task runner for a UI thread.
45   static scoped_ptr<UserInputMonitor> Create(
46       const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
47       const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner);
48 
49   // The same |listener| should only be added once.
50   // The clients should make sure to call Remove*Listener before |listener| is
51   // destroyed.
52   void AddMouseListener(MouseEventListener* listener);
53   void RemoveMouseListener(MouseEventListener* listener);
54 
55   // A caller must call EnableKeyPressMonitoring and
56   // DisableKeyPressMonitoring in pair.
57   void EnableKeyPressMonitoring();
58   void DisableKeyPressMonitoring();
59 
60   // Returns the number of keypresses. The starting point from when it is
61   // counted is not guaranteed, but consistent within the pair of calls of
62   // EnableKeyPressMonitoring and DisableKeyPressMonitoring. So a caller can
63   // use the difference between the values returned at two times to get the
64   // number of keypresses happened within that time period, but should not make
65   // any assumption on the initial value.
66   virtual size_t GetKeyPressCount() const = 0;
67 
68  protected:
mouse_listeners()69   scoped_refptr<MouseListenerList> mouse_listeners() {
70     return mouse_listeners_;
71   }
72 
73  private:
74   virtual void StartKeyboardMonitoring() = 0;
75   virtual void StopKeyboardMonitoring() = 0;
76   virtual void StartMouseMonitoring() = 0;
77   virtual void StopMouseMonitoring() = 0;
78 
79   base::Lock lock_;
80   size_t key_press_counter_references_;
81   size_t mouse_listeners_count_;
82   scoped_refptr<MouseListenerList> mouse_listeners_;
83 
84   DISALLOW_COPY_AND_ASSIGN(UserInputMonitor);
85 };
86 
87 }  // namespace media
88 
89 #endif  // MEDIA_BASE_USER_INPUT_MONITOR_H_
90