15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_USER_INPUT_MONITOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_USER_INPUT_MONITOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list_threadsafe.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SkIPoint; 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Monitors and notifies about mouse movements and keyboard events. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Thread safe. The listeners are called on the thread where the listeners are 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// added. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT UserInputMonitor { 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The interface to receive mouse movement events. 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class MEDIA_EXPORT MouseEventListener { 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |position| is the new mouse position. 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void OnMouseMoved(const SkIPoint& position) = 0; 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MouseEventListener() {} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ObserverListThreadSafe<UserInputMonitor::MouseEventListener> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseListenerList; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserInputMonitor(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UserInputMonitor(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a platform-specific instance of UserInputMonitor. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |io_task_runner| is the task runner for an IO thread. 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |ui_task_runner| is the task runner for a UI thread. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_ptr<UserInputMonitor> Create( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The same |listener| should only be added once. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The clients should make sure to call Remove*Listener before |listener| is 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddMouseListener(MouseEventListener* listener); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveMouseListener(MouseEventListener* listener); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A caller must call EnableKeyPressMonitoring and 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DisableKeyPressMonitoring in pair. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableKeyPressMonitoring(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableKeyPressMonitoring(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of keypresses. The starting point from when it is 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // counted is not guaranteed, but consistent within the pair of calls of 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EnableKeyPressMonitoring and DisableKeyPressMonitoring. So a caller can 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the difference between the values returned at two times to get the 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number of keypresses happened within that time period, but should not make 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any assumption on the initial value. 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual size_t GetKeyPressCount() const = 0; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MouseListenerList> mouse_listeners() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_listeners_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartKeyboardMonitoring() = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StopKeyboardMonitoring() = 0; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartMouseMonitoring() = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StopMouseMonitoring() = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock lock_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t key_press_counter_references_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t mouse_listeners_count_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MouseListenerList> mouse_listeners_; 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserInputMonitor); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_USER_INPUT_MONITOR_H_ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)