Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: device/hid/input_service_linux.cc

Issue 240583006: Added device types (bluetooth, usb, serio) to InputDeviceInfo. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase, slightly modified tests. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « device/hid/input_service_linux.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <libudev.h> 5 #include <libudev.h>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
11 #include "base/threading/thread_restrictions.h" 11 #include "base/threading/thread_restrictions.h"
12 #include "device/hid/input_service_linux.h" 12 #include "device/hid/input_service_linux.h"
13 13
14 namespace device { 14 namespace device {
15 15
16 namespace { 16 namespace {
17 17
18 const char kHidSubsystem[] = "hid"; 18 const char kSubsystemHid[] = "hid";
19 const char kInputSubsystem[] = "input"; 19 const char kSubsystemInput[] = "input";
20 const char kTypeBluetooth[] = "bluetooth";
21 const char kTypeUsb[] = "usb";
22 const char kTypeSerio[] = "serio";
20 const char kIdInputAccelerometer[] = "ID_INPUT_ACCELEROMETER"; 23 const char kIdInputAccelerometer[] = "ID_INPUT_ACCELEROMETER";
21 const char kIdInputJoystick[] = "ID_INPUT_JOYSTICK"; 24 const char kIdInputJoystick[] = "ID_INPUT_JOYSTICK";
22 const char kIdInputKey[] = "ID_INPUT_KEY"; 25 const char kIdInputKey[] = "ID_INPUT_KEY";
23 const char kIdInputKeyboard[] = "ID_INPUT_KEYBOARD"; 26 const char kIdInputKeyboard[] = "ID_INPUT_KEYBOARD";
24 const char kIdInputMouse[] = "ID_INPUT_MOUSE"; 27 const char kIdInputMouse[] = "ID_INPUT_MOUSE";
25 const char kIdInputTablet[] = "ID_INPUT_TABLET"; 28 const char kIdInputTablet[] = "ID_INPUT_TABLET";
26 const char kIdInputTouchpad[] = "ID_INPUT_TOUCHPAD"; 29 const char kIdInputTouchpad[] = "ID_INPUT_TOUCHPAD";
27 const char kIdInputTouchscreen[] = "ID_INPUT_TOUCHSCREEN"; 30 const char kIdInputTouchscreen[] = "ID_INPUT_TOUCHSCREEN";
28 31
29 // The instance will be reset when message loop destroys. 32 // The instance will be reset when message loop destroys.
30 base::LazyInstance<scoped_ptr<InputServiceLinux> >::Leaky 33 base::LazyInstance<scoped_ptr<InputServiceLinux> >::Leaky
31 g_input_service_linux_ptr = LAZY_INSTANCE_INITIALIZER; 34 g_input_service_linux_ptr = LAZY_INSTANCE_INITIALIZER;
32 35
33 bool GetBoolProperty(udev_device* device, const char* key) { 36 bool GetBoolProperty(udev_device* device, const char* key) {
34 CHECK(device); 37 CHECK(device);
35 CHECK(key); 38 CHECK(key);
36 const char* property = udev_device_get_property_value(device, key); 39 const char* property = udev_device_get_property_value(device, key);
37 if (!property) 40 if (!property)
38 return false; 41 return false;
39 int value; 42 int value;
40 if (!base::StringToInt(property, &value)) { 43 if (!base::StringToInt(property, &value)) {
41 LOG(ERROR) << "Not an integer value for " << key << " property"; 44 LOG(ERROR) << "Not an integer value for " << key << " property";
42 return false; 45 return false;
43 } 46 }
44 return (value != 0); 47 return (value != 0);
45 } 48 }
46 49
50 InputServiceLinux::InputDeviceInfo::Type GetDeviceType(udev_device* device) {
51 if (udev_device_get_parent_with_subsystem_devtype(
52 device, kTypeBluetooth, NULL)) {
53 return InputServiceLinux::InputDeviceInfo::TYPE_BLUETOOTH;
54 }
55 if (udev_device_get_parent_with_subsystem_devtype(device, kTypeUsb, NULL))
56 return InputServiceLinux::InputDeviceInfo::TYPE_USB;
57 if (udev_device_get_parent_with_subsystem_devtype(device, kTypeSerio, NULL))
58 return InputServiceLinux::InputDeviceInfo::TYPE_SERIO;
59 return InputServiceLinux::InputDeviceInfo::TYPE_UNKNOWN;
60 }
61
47 class InputServiceLinuxImpl : public InputServiceLinux, 62 class InputServiceLinuxImpl : public InputServiceLinux,
48 public DeviceMonitorLinux::Observer { 63 public DeviceMonitorLinux::Observer {
49 public: 64 public:
50 // Implements DeviceMonitorLinux::Observer: 65 // Implements DeviceMonitorLinux::Observer:
51 virtual void OnDeviceAdded(udev_device* device) OVERRIDE; 66 virtual void OnDeviceAdded(udev_device* device) OVERRIDE;
52 virtual void OnDeviceRemoved(udev_device* device) OVERRIDE; 67 virtual void OnDeviceRemoved(udev_device* device) OVERRIDE;
53 68
54 private: 69 private:
55 friend class InputServiceLinux; 70 friend class InputServiceLinux;
56 71
(...skipping 25 matching lines...) Expand all
82 InputDeviceInfo info; 97 InputDeviceInfo info;
83 info.id = path; 98 info.id = path;
84 99
85 const char* name = udev_device_get_property_value(device, "NAME"); 100 const char* name = udev_device_get_property_value(device, "NAME");
86 if (name) 101 if (name)
87 info.name = name; 102 info.name = name;
88 103
89 const char* subsystem = udev_device_get_subsystem(device); 104 const char* subsystem = udev_device_get_subsystem(device);
90 if (!subsystem) 105 if (!subsystem)
91 return; 106 return;
92 else if (strcmp(subsystem, kHidSubsystem) == 0) 107 else if (strcmp(subsystem, kSubsystemHid) == 0)
93 info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_HID; 108 info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_HID;
94 else if (strcmp(subsystem, kInputSubsystem) == 0) 109 else if (strcmp(subsystem, kSubsystemInput) == 0)
95 info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_INPUT; 110 info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_INPUT;
96 else 111 else
97 return; 112 return;
98 113
114 info.type = GetDeviceType(device);
115
99 info.is_accelerometer = GetBoolProperty(device, kIdInputAccelerometer); 116 info.is_accelerometer = GetBoolProperty(device, kIdInputAccelerometer);
100 info.is_joystick = GetBoolProperty(device, kIdInputJoystick); 117 info.is_joystick = GetBoolProperty(device, kIdInputJoystick);
101 info.is_key = GetBoolProperty(device, kIdInputKey); 118 info.is_key = GetBoolProperty(device, kIdInputKey);
102 info.is_keyboard = GetBoolProperty(device, kIdInputKeyboard); 119 info.is_keyboard = GetBoolProperty(device, kIdInputKeyboard);
103 info.is_mouse = GetBoolProperty(device, kIdInputMouse); 120 info.is_mouse = GetBoolProperty(device, kIdInputMouse);
104 info.is_tablet = GetBoolProperty(device, kIdInputTablet); 121 info.is_tablet = GetBoolProperty(device, kIdInputTablet);
105 info.is_touchpad = GetBoolProperty(device, kIdInputTouchpad); 122 info.is_touchpad = GetBoolProperty(device, kIdInputTouchpad);
106 info.is_touchscreen = GetBoolProperty(device, kIdInputTouchscreen); 123 info.is_touchscreen = GetBoolProperty(device, kIdInputTouchscreen);
107 124
108 AddDevice(info); 125 AddDevice(info);
109 } 126 }
110 127
111 void InputServiceLinuxImpl::OnDeviceRemoved(udev_device* device) { 128 void InputServiceLinuxImpl::OnDeviceRemoved(udev_device* device) {
112 DCHECK(CalledOnValidThread()); 129 DCHECK(CalledOnValidThread());
113 if (!device) 130 if (!device)
114 return; 131 return;
115 const char* path = udev_device_get_syspath(device); 132 const char* path = udev_device_get_syspath(device);
116 if (!path) 133 if (!path)
117 return; 134 return;
118 RemoveDevice(path); 135 RemoveDevice(path);
119 } 136 }
120 137
121 } // namespace 138 } // namespace
122 139
123 InputServiceLinux::InputDeviceInfo::InputDeviceInfo() 140 InputServiceLinux::InputDeviceInfo::InputDeviceInfo()
124 : subsystem(SUBSYSTEM_UNKNOWN), 141 : subsystem(SUBSYSTEM_UNKNOWN),
142 type(TYPE_UNKNOWN),
125 is_accelerometer(false), 143 is_accelerometer(false),
126 is_joystick(false), 144 is_joystick(false),
127 is_key(false), 145 is_key(false),
128 is_keyboard(false), 146 is_keyboard(false),
129 is_mouse(false), 147 is_mouse(false),
130 is_tablet(false), 148 is_tablet(false),
131 is_touchpad(false), 149 is_touchpad(false),
132 is_touchscreen(false) {} 150 is_touchscreen(false) {}
133 151
134 InputServiceLinux::InputServiceLinux() { 152 InputServiceLinux::InputServiceLinux() {
135 base::ThreadRestrictions::AssertIOAllowed(); 153 base::ThreadRestrictions::AssertIOAllowed();
136 base::MessageLoop::current()->AddDestructionObserver(this); 154 base::MessageLoop::current()->AddDestructionObserver(this);
137 } 155 }
138 156
139 InputServiceLinux::~InputServiceLinux() { 157 InputServiceLinux::~InputServiceLinux() {
140 DCHECK(CalledOnValidThread()); 158 DCHECK(CalledOnValidThread());
141 base::MessageLoop::current()->RemoveDestructionObserver(this); 159 base::MessageLoop::current()->RemoveDestructionObserver(this);
142 } 160 }
143 161
144 // static 162 // static
145 InputServiceLinux* InputServiceLinux::GetInstance() { 163 InputServiceLinux* InputServiceLinux::GetInstance() {
146 if (!HasInstance()) 164 if (!HasInstance())
147 g_input_service_linux_ptr.Get().reset(new InputServiceLinux()); 165 g_input_service_linux_ptr.Get().reset(new InputServiceLinuxImpl());
148 return g_input_service_linux_ptr.Get().get(); 166 return g_input_service_linux_ptr.Get().get();
149 } 167 }
150 168
151 // static 169 // static
152 bool InputServiceLinux::HasInstance() { 170 bool InputServiceLinux::HasInstance() {
153 return g_input_service_linux_ptr.Get().get(); 171 return g_input_service_linux_ptr.Get().get();
154 } 172 }
155 173
156 // static 174 // static
157 void InputServiceLinux::SetForTesting(InputServiceLinux* service) { 175 void InputServiceLinux::SetForTesting(InputServiceLinux* service) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 void InputServiceLinux::RemoveDevice(const std::string& id) { 219 void InputServiceLinux::RemoveDevice(const std::string& id) {
202 devices_.erase(id); 220 devices_.erase(id);
203 FOR_EACH_OBSERVER(Observer, observers_, OnInputDeviceRemoved(id)); 221 FOR_EACH_OBSERVER(Observer, observers_, OnInputDeviceRemoved(id));
204 } 222 }
205 223
206 bool InputServiceLinux::CalledOnValidThread() const { 224 bool InputServiceLinux::CalledOnValidThread() const {
207 return thread_checker_.CalledOnValidThread(); 225 return thread_checker_.CalledOnValidThread();
208 } 226 }
209 227
210 } // namespace device 228 } // namespace device
OLDNEW
« no previous file with comments | « device/hid/input_service_linux.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698