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

Side by Side Diff: ui/events/platform/x11/x11_hotplug_event_handler.cc

Issue 798453002: events: x11: Use device path to detect internal keyboards (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
« no previous file with comments | « no previous file | 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 "ui/events/platform/x11/x11_hotplug_event_handler.h" 5 #include "ui/events/platform/x11/x11_hotplug_event_handler.h"
6 6
7 #include <X11/Xatom.h> 7 #include <X11/Xatom.h>
8 #include <X11/extensions/XInput.h> 8 #include <X11/extensions/XInput.h>
9 #include <X11/extensions/XInput2.h> 9 #include <X11/extensions/XInput2.h>
10 10
(...skipping 18 matching lines...) Expand all
29 #include "ui/events/devices/device_util_linux.h" 29 #include "ui/events/devices/device_util_linux.h"
30 #include "ui/events/devices/input_device.h" 30 #include "ui/events/devices/input_device.h"
31 #include "ui/events/devices/keyboard_device.h" 31 #include "ui/events/devices/keyboard_device.h"
32 #include "ui/events/devices/touchscreen_device.h" 32 #include "ui/events/devices/touchscreen_device.h"
33 #include "ui/gfx/x/x11_types.h" 33 #include "ui/gfx/x/x11_types.h"
34 34
35 namespace ui { 35 namespace ui {
36 36
37 namespace { 37 namespace {
38 38
39 // The name of the xinput device corresponding to the AT internal keyboard.
40 const char kATKeyboardName[] = "AT Translated Set 2 keyboard";
41
42 // The prefix of xinput devices corresponding to CrOS EC internal keyboards.
43 const char kCrosEcKeyboardPrefix[] = "cros-ec";
44
45 // Names of all known internal devices that should not be considered as 39 // Names of all known internal devices that should not be considered as
46 // keyboards. 40 // keyboards.
47 // TODO(rsadam@): Identify these devices using udev rules. (Crbug.com/420728.) 41 // TODO(rsadam@): Identify these devices using udev rules. (Crbug.com/420728.)
48 const char* kKnownInvalidKeyboardDeviceNames[] = {"Power Button", 42 const char* kKnownInvalidKeyboardDeviceNames[] = {"Power Button",
49 "Sleep Button", 43 "Sleep Button",
50 "Video Bus"}; 44 "Video Bus"};
51 45
52 const char* kCachedAtomList[] = { 46 const char* kCachedAtomList[] = {
53 "Abs MT Position X", 47 "Abs MT Position X",
54 "Abs MT Position Y", 48 "Abs MT Position Y",
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 // Returns true if |name| is the name of a known invalid keyboard device. Note, 141 // Returns true if |name| is the name of a known invalid keyboard device. Note,
148 // this may return false negatives. 142 // this may return false negatives.
149 bool IsKnownInvalidKeyboardDevice(const std::string& name) { 143 bool IsKnownInvalidKeyboardDevice(const std::string& name) {
150 for (const char* device_name : kKnownInvalidKeyboardDeviceNames) { 144 for (const char* device_name : kKnownInvalidKeyboardDeviceNames) {
151 if (name == device_name) 145 if (name == device_name)
152 return true; 146 return true;
153 } 147 }
154 return false; 148 return false;
155 } 149 }
156 150
157 // Returns true if |name| is the name of a known internal keyboard device. Note,
158 // this may return false negatives.
159 bool IsInternalKeyboard(const std::string& name) {
160 // TODO(rsadam@): Come up with a more generic way of identifying internal
161 // keyboards. See crbug.com/420728.
162 if (name == kATKeyboardName)
163 return true;
164 return name.compare(
165 0u, strlen(kCrosEcKeyboardPrefix), kCrosEcKeyboardPrefix) == 0;
166 }
167
168 // Returns true if |name| is the name of a known XTEST device. Note, this may 151 // Returns true if |name| is the name of a known XTEST device. Note, this may
169 // return false negatives. 152 // return false negatives.
170 bool IsTestKeyboard(const std::string& name) { 153 bool IsTestKeyboard(const std::string& name) {
171 return name.find("XTEST") != std::string::npos; 154 return name.find("XTEST") != std::string::npos;
172 } 155 }
173 156
174 base::FilePath GetDevicePath(XDisplay* dpy, const XIDeviceInfo& device) { 157 base::FilePath GetDevicePath(XDisplay* dpy, const XIDeviceInfo& device) {
175 #if !defined(OS_CHROMEOS) 158 #if !defined(OS_CHROMEOS)
176 return base::FilePath(); 159 return base::FilePath();
177 #else 160 #else
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 const KeyboardDeviceCallback& callback) { 216 const KeyboardDeviceCallback& callback) {
234 std::vector<KeyboardDevice> devices; 217 std::vector<KeyboardDevice> devices;
235 218
236 for (const DeviceInfo& device_info : device_infos) { 219 for (const DeviceInfo& device_info : device_infos) {
237 if (!device_info.enabled || device_info.use != XISlaveKeyboard) 220 if (!device_info.enabled || device_info.use != XISlaveKeyboard)
238 continue; // Assume all keyboards are keyboard slaves 221 continue; // Assume all keyboards are keyboard slaves
239 std::string device_name(device_info.name); 222 std::string device_name(device_info.name);
240 base::TrimWhitespaceASCII(device_name, base::TRIM_TRAILING, &device_name); 223 base::TrimWhitespaceASCII(device_name, base::TRIM_TRAILING, &device_name);
241 if (IsTestKeyboard(device_name)) 224 if (IsTestKeyboard(device_name))
242 continue; // Skip test devices. 225 continue; // Skip test devices.
243 InputDeviceType type; 226 if (IsKnownInvalidKeyboardDevice(device_name))
244 if (IsInternalKeyboard(device_name)) { 227 continue; // Skip invalid devices.
245 type = InputDeviceType::INPUT_DEVICE_INTERNAL; 228 InputDeviceType type = GetInputDeviceTypeFromPath(device_info.path);
246 } else if (IsKnownInvalidKeyboardDevice(device_name)) {
247 type = InputDeviceType::INPUT_DEVICE_UNKNOWN;
248 } else {
249 type = InputDeviceType::INPUT_DEVICE_EXTERNAL;
250 }
251 devices.push_back( 229 devices.push_back(
252 KeyboardDevice(device_info.id, type, device_name)); 230 KeyboardDevice(device_info.id, type, device_name));
253 } 231 }
254 232
255 reply_runner->PostTask(FROM_HERE, base::Bind(callback, devices)); 233 reply_runner->PostTask(FROM_HERE, base::Bind(callback, devices));
256 } 234 }
257 235
258 // Helper used to parse touchscreen information. When it is done it uses 236 // Helper used to parse touchscreen information. When it is done it uses
259 // |reply_runner| and |callback| to update the state on the UI thread. 237 // |reply_runner| and |callback| to update the state on the UI thread.
260 void HandleTouchscreenDevicesInWorker( 238 void HandleTouchscreenDevicesInWorker(
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 base::WorkerPool::PostTask(FROM_HERE, 350 base::WorkerPool::PostTask(FROM_HERE,
373 base::Bind(&HandleHotplugEventInWorker, 351 base::Bind(&HandleHotplugEventInWorker,
374 device_infos, 352 device_infos,
375 display_state, 353 display_state,
376 base::ThreadTaskRunnerHandle::Get(), 354 base::ThreadTaskRunnerHandle::Get(),
377 callbacks), 355 callbacks),
378 true /* task_is_slow */); 356 true /* task_is_slow */);
379 } 357 }
380 358
381 } // namespace ui 359 } // namespace ui
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698