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