OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |