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. 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass InputServiceLinux : public base::MessageLoop::DestructionObserver { 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch struct InputDeviceInfo { 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum Subsystem { SUBSYSTEM_HID, SUBSYSTEM_INPUT, SUBSYSTEM_UNKNOWN }; 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch enum Type { TYPE_BLUETOOTH, TYPE_USB, TYPE_SERIO, TYPE_UNKNOWN }; 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InputDeviceInfo(); 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string id; 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string name; 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Subsystem subsystem; 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Type type; 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_accelerometer : 1; 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_joystick : 1; 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_key : 1; 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_keyboard : 1; 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_mouse : 1; 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_tablet : 1; 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_touchpad : 1; 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_touchscreen : 1; 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch class Observer { 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~Observer() {} 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnInputDeviceAdded(const InputDeviceInfo& info) = 0; 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnInputDeviceRemoved(const std::string& id) = 0; 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InputServiceLinux(); 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static InputServiceLinux* GetInstance(); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static bool HasInstance(); 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static void SetForTesting(InputServiceLinux* service); 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void AddObserver(Observer* observer); 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void RemoveObserver(Observer* observer); 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns list of all currently connected input/hid devices. 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void GetDevices(std::vector<InputDeviceInfo>* devices); 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns an info about input device identified by |id|. When there're 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // no input or hid device with such id, returns false and doesn't 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // modify |info|. 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool GetDeviceInfo(const std::string& id, InputDeviceInfo* info) const; 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Implements base::MessageLoop::DestructionObserver 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void WillDestroyCurrentMessageLoop() OVERRIDE; 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected: 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~InputServiceLinux(); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void AddDevice(const InputDeviceInfo& info); 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void RemoveDevice(const std::string& id); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool CalledOnValidThread() const; 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch friend struct base::DefaultDeleter<InputServiceLinux>; 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef base::hash_map<std::string, InputDeviceInfo> DeviceMap; 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DeviceMap devices_; 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ObserverList<Observer> observers_; 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::ThreadChecker thread_checker_; 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(InputServiceLinux); 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace device 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // DEVICE_HID_INPUT_SERVICE_LINUX_H_ 99