input_service_linux.h revision a02191e04bc25c4935f804f2c080ae28663d096d
1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef DEVICE_HID_INPUT_SERVICE_LINUX_H_ 6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define DEVICE_HID_INPUT_SERVICE_LINUX_H_ 7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string> 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector> 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/compiler_specific.h" 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/containers/hash_tables.h" 13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/macros.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h" 15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h" 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/observer_list.h" 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/threading/thread_checker.h" 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "device/hid/device_monitor_linux.h" 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace device { 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This class provides information and notifications about 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// connected/disconnected input/HID devices. This class is *NOT* 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// thread-safe and all methods must be called from the FILE thread. 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass InputServiceLinux : public base::MessageLoop::DestructionObserver, 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public DeviceMonitorLinux::Observer { 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch struct InputDeviceInfo { 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum Subsystem { SUBSYSTEM_HID, SUBSYSTEM_INPUT, SUBSYSTEM_UNKNOWN }; 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InputDeviceInfo(); 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string id; 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string name; 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Subsystem subsystem; 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_accelerometer : 1; 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_joystick : 1; 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_key : 1; 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_keyboard : 1; 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_mouse : 1; 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_tablet : 1; 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_touchpad : 1; 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_touchscreen : 1; 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch class Observer { 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~Observer() {} 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnInputDeviceAdded(const InputDeviceInfo& info) = 0; 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnInputDeviceRemoved(const std::string& id) = 0; 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InputServiceLinux(); 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static InputServiceLinux* GetInstance(); 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static bool HasInstance(); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void AddObserver(Observer* observer); 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void RemoveObserver(Observer* observer); 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns list of all currently connected input/hid devices. 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void GetDevices(std::vector<InputDeviceInfo>* devices); 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns an info about input device identified by |id|. When there're 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // no input or hid device with such id, returns false and doesn't 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // modify |info|. 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool GetDeviceInfo(const std::string& id, InputDeviceInfo* info) const; 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Implements base::MessageLoop::DestructionObserver 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void WillDestroyCurrentMessageLoop() OVERRIDE; 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Implements DeviceMonitorLinux::Observer: 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnDeviceAdded(udev_device* device) OVERRIDE; 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnDeviceRemoved(udev_device* device) OVERRIDE; 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch friend struct base::DefaultDeleter<InputServiceLinux>; 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef base::hash_map<std::string, InputDeviceInfo> DeviceMap; 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~InputServiceLinux(); 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DeviceMap devices_; 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ObserverList<Observer> observers_; 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::ThreadChecker thread_checker_; 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(InputServiceLinux); 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace device 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // DEVICE_HID_INPUT_SERVICE_LINUX_H_ 94