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

Side by Side Diff: ui/events/ozone/gamepad/static_gamepad_mapping.cc

Issue 2899893003: Add generic mapping for gamepad (Closed)
Patch Set: Created 3 years, 7 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
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 <linux/input.h> 5 #include <linux/input.h>
6 #include <cstdint> 6 #include <cstdint>
7 #include <list>
7 #include <map> 8 #include <map>
9 #include <vector>
8 10
9 #include "base/macros.h" 11 #include "base/macros.h"
10 #include "ui/events/ozone/gamepad/gamepad_mapping.h" 12 #include "ui/events/ozone/evdev/event_device_info.h"
13 #include "ui/events/ozone/gamepad/static_gamepad_mapping.h"
11 #include "ui/events/ozone/gamepad/webgamepad_constants.h" 14 #include "ui/events/ozone/gamepad/webgamepad_constants.h"
12 15
13 namespace ui { 16 namespace ui {
14 17
15 // KeyMap maps evdev key code to web gamepad code. 18 typedef bool (*GamepadMapperFunction)(uint16_t key,
16 struct KeyMapEntry { 19 uint16_t code,
17 uint16_t evdev_code; 20 GamepadEventType* mapped_type,
18 uint16_t mapped_code; 21 uint16_t* mapped_code);
19 };
20
21 // AbsMap maps evdev abs code to web gamepad (type, code).
22 struct AbsMapEntry {
23 uint16_t evdev_code;
24 GamepadEventType mapped_type;
25 uint16_t mapped_code;
26 };
27
28 using KeyMapType = const KeyMapEntry[];
29 using AbsMapType = const AbsMapEntry[];
30
31 #define TO_BTN(code, mapped_code) \
32 { code, GamepadEventType::BUTTON, mapped_code }
33
34 #define TO_ABS(code, mapped_code) \
35 { code, GamepadEventType::AXIS, mapped_code }
36 22
37 #define DO_MAPPING \ 23 #define DO_MAPPING \
38 DoGamepadMapping(key_mapping, arraysize(key_mapping), abs_mapping, \ 24 DoGamepadMapping(key_mapping, arraysize(key_mapping), abs_mapping, \
39 arraysize(abs_mapping), type, code, mapped_type, \ 25 arraysize(abs_mapping), type, code, mapped_type, \
40 mapped_code) 26 mapped_code)
41 27
42 bool DoGamepadMapping(const KeyMapEntry* key_mapping, 28 bool DoGamepadMapping(const KeyMapEntry* key_mapping,
43 size_t key_map_size, 29 size_t key_map_size,
44 const AbsMapEntry* abs_mapping, 30 const AbsMapEntry* abs_mapping,
45 size_t abs_map_size, 31 size_t abs_map_size,
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 181
196 bool ADT1Mapper(uint16_t type, 182 bool ADT1Mapper(uint16_t type,
197 uint16_t code, 183 uint16_t code,
198 GamepadEventType* mapped_type, 184 GamepadEventType* mapped_type,
199 uint16_t* mapped_code) { 185 uint16_t* mapped_code) {
200 static const KeyMapType key_mapping = { 186 static const KeyMapType key_mapping = {
201 {BTN_A, WG_BUTTON_A}, {BTN_B, WG_BUTTON_B}, 187 {BTN_A, WG_BUTTON_A}, {BTN_B, WG_BUTTON_B},
202 {BTN_X, WG_BUTTON_X}, {BTN_Y, WG_BUTTON_Y}, 188 {BTN_X, WG_BUTTON_X}, {BTN_Y, WG_BUTTON_Y},
203 {BTN_TL, WG_BUTTON_L1}, {BTN_TR, WG_BUTTON_R1}, 189 {BTN_TL, WG_BUTTON_L1}, {BTN_TR, WG_BUTTON_R1},
204 {BTN_THUMBL, WG_BUTTON_THUMBL}, {BTN_THUMBR, WG_BUTTON_THUMBR}, 190 {BTN_THUMBL, WG_BUTTON_THUMBL}, {BTN_THUMBR, WG_BUTTON_THUMBR},
205 {BTN_MODE, WG_BUTTON_START}, {KEY_BACK, WG_BUTTON_SELECT}, 191 {BTN_MODE, WG_BUTTON_MODE}, {KEY_BACK, WG_BUTTON_SELECT},
206 {KEY_HOMEPAGE, WG_BUTTON_MODE}}; 192 {KEY_HOMEPAGE, WG_BUTTON_START}};
207 193
208 static const AbsMapType abs_mapping = { 194 static const AbsMapType abs_mapping = {
209 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), 195 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y),
210 TO_ABS(ABS_Z, WG_ABS_RX), TO_ABS(ABS_RZ, WG_ABS_RY), 196 TO_ABS(ABS_Z, WG_ABS_RX), TO_ABS(ABS_RZ, WG_ABS_RY),
211 TO_BTN(ABS_BRAKE, WG_BUTTON_LT), TO_BTN(ABS_GAS, WG_BUTTON_RT), 197 TO_BTN(ABS_BRAKE, WG_BUTTON_LT), TO_BTN(ABS_GAS, WG_BUTTON_RT),
212 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; 198 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)};
213 return DO_MAPPING; 199 return DO_MAPPING;
214 } 200 }
215 201
216 bool Vendor_1d79Product_0009Mapper(uint16_t type, 202 bool Vendor_1d79Product_0009Mapper(uint16_t type,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 TO_ABS(ABS_RX, WG_ABS_RX), TO_ABS(ABS_RY, WG_ABS_RY), 370 TO_ABS(ABS_RX, WG_ABS_RX), TO_ABS(ABS_RY, WG_ABS_RY),
385 TO_ABS(ABS_Z, WG_ABS_RX), TO_ABS(ABS_RZ, WG_ABS_RY), 371 TO_ABS(ABS_Z, WG_ABS_RX), TO_ABS(ABS_RZ, WG_ABS_RY),
386 TO_BTN(ABS_BRAKE, WG_BUTTON_LT), TO_BTN(ABS_GAS, WG_BUTTON_RT), 372 TO_BTN(ABS_BRAKE, WG_BUTTON_LT), TO_BTN(ABS_GAS, WG_BUTTON_RT),
387 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; 373 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)};
388 return DO_MAPPING; 374 return DO_MAPPING;
389 } 375 }
390 376
391 static const struct MappingData { 377 static const struct MappingData {
392 uint16_t vendor_id; 378 uint16_t vendor_id;
393 uint16_t product_id; 379 uint16_t product_id;
394 GamepadMapper mapper; 380 GamepadMapperFunction mapper;
395 } AvailableMappings[] = { 381 } AvailableMappings[] = {
396 // Xbox style gamepad. 382 // Xbox style gamepad.
397 {0x045e, 0x028e, XInputStyleMapper}, // Xbox 360 wired. 383 {0x045e, 0x028e, XInputStyleMapper}, // Xbox 360 wired.
398 {0x045e, 0x028f, XInputStyleMapper}, // Xbox 360 wireless. 384 {0x045e, 0x028f, XInputStyleMapper}, // Xbox 360 wireless.
399 {0x045e, 0x02a1, XInputStyleMapper}, // Xbox 360 wireless. 385 {0x045e, 0x02a1, XInputStyleMapper}, // Xbox 360 wireless.
400 {0x045e, 0x02d1, XInputStyleMapper}, // Xbox one wired. 386 {0x045e, 0x02d1, XInputStyleMapper}, // Xbox one wired.
401 {0x045e, 0x02dd, XInputStyleMapper}, // Xbox one wired (2015 fw). 387 {0x045e, 0x02dd, XInputStyleMapper}, // Xbox one wired (2015 fw).
402 {0x045e, 0x02e3, XInputStyleMapper}, // Xbox elite wired. 388 {0x045e, 0x02e3, XInputStyleMapper}, // Xbox elite wired.
403 {0x045e, 0x02ea, XInputStyleMapper}, // Xbox one s (usb). 389 {0x045e, 0x02ea, XInputStyleMapper}, // Xbox one s (usb).
404 {0x045e, 0x0719, XInputStyleMapper}, // Xbox 360 wireless. 390 {0x045e, 0x0719, XInputStyleMapper}, // Xbox 360 wireless.
(...skipping 23 matching lines...) Expand all
428 Vendor_1d79Product_0009Mapper}, // Nyko playpad / Playpad pro. 414 Vendor_1d79Product_0009Mapper}, // Nyko playpad / Playpad pro.
429 {0x046d, 0xb501, Vendor_046dProduct_b501Mapper}, // Logitech redhawk. 415 {0x046d, 0xb501, Vendor_046dProduct_b501Mapper}, // Logitech redhawk.
430 // Logitech dual action controller. 416 // Logitech dual action controller.
431 {0x046d, 0xc216, Vendor_046dProduct_c216Mapper}, 417 {0x046d, 0xc216, Vendor_046dProduct_c216Mapper},
432 // Logitech cordless rumblepad2. 418 // Logitech cordless rumblepad2.
433 {0x046d, 0xc219, Vendor_046dProduct_c219Mapper}, 419 {0x046d, 0xc219, Vendor_046dProduct_c219Mapper},
434 {0x1038, 0x1412, Vendor_1038Product_1412Mapper}, // Steelseries free. 420 {0x1038, 0x1412, Vendor_1038Product_1412Mapper}, // Steelseries free.
435 // Razer onza tournment edition. 421 // Razer onza tournment edition.
436 {0x1689, 0xfd00, Vendor_1689Product_fd00Mapper}}; 422 {0x1689, 0xfd00, Vendor_1689Product_fd00Mapper}};
437 423
438 GamepadMapper GetGamepadMapper(uint16_t vendor_id, uint16_t product_id) { 424 class StaticGamepadMapper : public GamepadMapper {
425 public:
426 StaticGamepadMapper(GamepadMapperFunction fp) : mapper_fp_(fp) {}
427
428 bool operator()(uint16_t type,
429 uint16_t code,
430 GamepadEventType* mapped_type,
431 uint16_t* mapped_code) override {
432 return mapper_fp_(type, code, mapped_type, mapped_code);
433 };
434
435 private:
436 GamepadMapperFunction mapper_fp_;
437 };
438
439 GamepadMapper* GetStaticGamepadMapper(uint16_t vendor_id, uint16_t product_id) {
439 for (size_t i = 0; i < arraysize(AvailableMappings); i++) { 440 for (size_t i = 0; i < arraysize(AvailableMappings); i++) {
440 if (AvailableMappings[i].vendor_id == vendor_id && 441 if (AvailableMappings[i].vendor_id == vendor_id &&
441 AvailableMappings[i].product_id == product_id) { 442 AvailableMappings[i].product_id == product_id) {
442 return AvailableMappings[i].mapper; 443 return new StaticGamepadMapper(AvailableMappings[i].mapper);
443 } 444 }
444 } 445 }
445 return GenericMapper; 446 return nullptr;
446 } 447 }
447 448
448 } // namespace ui 449 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698