Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <linux/input.h> | |
| 6 #include <cstdint> | |
| 7 #include <map> | |
| 8 | |
| 9 #include "base/macros.h" | |
| 10 #include "ui/events/ozone/gamepad/gamepad_mapping.h" | |
| 11 #include "ui/events/ozone/gamepad/webgamepad_constants.h" | |
| 12 | |
| 13 namespace ui { | |
| 14 using KeyMapType = std::map<uint16_t, uint16_t>; | |
| 15 using AbsMapType = std::map<uint16_t, std::pair<GamepadEventType, uint16_t>>; | |
| 16 #define TO_BTN(code, mapped_code) \ | |
| 17 { \ | |
| 18 code, { GamepadEventType::BUTTON, mapped_code } \ | |
| 19 } | |
| 20 | |
| 21 #define TO_ABS(code, mapped_code) \ | |
| 22 { \ | |
| 23 code, { GamepadEventType::AXIS, mapped_code } \ | |
| 24 } | |
| 25 | |
| 26 bool DoGamepadMapping(const KeyMapType& key_mapping, | |
| 27 const AbsMapType& abs_mapping, | |
| 28 uint16_t type, | |
| 29 uint16_t code, | |
| 30 GamepadEventType* mapped_type, | |
| 31 uint16_t* mapped_code) { | |
| 32 if (type == EV_KEY) { | |
| 33 auto ite = key_mapping.find(code); | |
| 34 if (ite == key_mapping.end()) { | |
| 35 return false; | |
| 36 } | |
| 37 *mapped_type = GamepadEventType::BUTTON; | |
| 38 *mapped_code = ite->second; | |
| 39 } else { | |
| 40 auto ite = abs_mapping.find(code); | |
| 41 if (ite == abs_mapping.end()) { | |
| 42 return false; | |
| 43 } | |
| 44 *mapped_type = ite->second.first; | |
| 45 *mapped_code = ite->second.second; | |
| 46 } | |
| 47 return true; | |
| 48 } | |
| 49 | |
| 50 // this mapper mapps gamepads compatible with xbox gamepad. | |
| 51 bool XInputStyleMapper(uint16_t type, | |
| 52 uint16_t code, | |
| 53 GamepadEventType* mapped_type, | |
| 54 uint16_t* mapped_code) { | |
| 55 static KeyMapType key_mapping = { | |
| 56 {BTN_A, WG_BUTTON_A}, // btn_a = 304 / 0x130 | |
| 57 {BTN_B, WG_BUTTON_B}, // btn_b = 305 / 0x131 | |
| 58 {BTN_X, WG_BUTTON_X}, // btn_x = 307 / 0x133 | |
| 59 {BTN_Y, WG_BUTTON_Y}, // btn_y = 308 / 0x134 | |
| 60 {BTN_TL, WG_BUTTON_L1}, // btn_tl = 310 / 0x136 | |
| 61 {BTN_TR, WG_BUTTON_R1}, // btn_tr = 311 / 0x137 | |
| 62 {BTN_SELECT, WG_BUTTON_SELECT}, // btn_select = 314 / 0x13a | |
| 63 {BTN_START, WG_BUTTON_START}, // btn_start = 315 / 0x13b | |
| 64 {BTN_THUMBL, WG_BUTTON_THUMBL}, // btn_thumbl = 317 / 0x13d | |
| 65 {BTN_THUMBR, WG_BUTTON_THUMBR}, // btn_thumbr = 318 / 0x13e | |
| 66 {BTN_MODE, WG_BUTTON_MODE} // btn_mode = 316 / 0x13c | |
| 67 }; | |
| 68 | |
| 69 static AbsMapType abs_mapping = { | |
| 70 TO_ABS(ABS_X, WG_ABS_X), // ABS_X = 0x00 | |
| 71 TO_ABS(ABS_Y, WG_ABS_Y), // ABS_Y = 0x01 | |
| 72 TO_ABS(ABS_RX, WG_ABS_Z), // ABS_RX = 0x03 | |
| 73 TO_ABS(ABS_RY, WG_ABS_RZ), // ABS_RZ = 0x04 | |
| 74 TO_BTN(ABS_Z, WG_BUTTON_L2), // ABS_Z = 0x02 | |
| 75 TO_BTN(ABS_RZ, WG_BUTTON_R2), // ABS_RZ = 0x05 | |
| 76 TO_BTN(ABS_HAT0X, kHAT_X), // HAT0X = 0x10 | |
| 77 TO_BTN(ABS_HAT0Y, kHAT_Y) // HAT0Y = 0x11 | |
| 78 }; | |
| 79 | |
| 80 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 81 mapped_code); | |
| 82 } | |
| 83 | |
| 84 bool PlaystationSixAxisMapper(uint16_t type, | |
| 85 uint16_t code, | |
| 86 GamepadEventType* mapped_type, | |
| 87 uint16_t* mapped_code) { | |
| 88 static KeyMapType key_mapping = { | |
| 89 {0x12e, WG_BUTTON_A}, | |
| 90 {0x12d, WG_BUTTON_B}, | |
| 91 {BTN_DEAD, WG_BUTTON_X}, | |
| 92 {0x12c, WG_BUTTON_Y}, | |
| 93 {BTN_BASE5, WG_BUTTON_L1}, | |
| 94 {BTN_BASE6, WG_BUTTON_R1}, | |
| 95 {BTN_BASE3, WG_BUTTON_L2}, | |
| 96 {BTN_BASE4, WG_BUTTON_R2}, | |
| 97 {BTN_TRIGGER, WG_BUTTON_SELECT}, | |
| 98 {BTN_TOP, WG_BUTTON_START}, | |
| 99 {BTN_THUMB, WG_BUTTON_THUMBL}, | |
| 100 {BTN_THUMB2, WG_BUTTON_THUMBR}, | |
| 101 {BTN_TOP2, WG_BUTTON_DPAD_UP}, | |
| 102 {BTN_BASE, WG_BUTTON_DPAD_DOWN}, | |
| 103 {BTN_BASE2, WG_BUTTON_DPAD_LEFT}, | |
| 104 {BTN_PINKIE, WG_BUTTON_DPAD_RIGHT}, | |
| 105 {BTN_TRIGGER_HAPPY17, WG_BUTTON_MODE}, | |
| 106 }; | |
| 107 | |
| 108 static AbsMapType abs_mapping = {TO_ABS(ABS_X, WG_ABS_X), | |
| 109 TO_ABS(ABS_Y, WG_ABS_Y), | |
| 110 TO_ABS(ABS_Z, WG_ABS_Z), | |
| 111 TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 112 TO_BTN(ABS_MT_TOUCH_MAJOR, WG_BUTTON_L2), | |
| 113 TO_BTN(ABS_MT_TOUCH_MINOR, WG_BUTTON_R2)}; | |
| 114 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 115 mapped_code); | |
| 116 } | |
| 117 | |
| 118 bool IBuffalocClassicMapper(uint16_t type, | |
| 119 uint16_t code, | |
| 120 GamepadEventType* mapped_type, | |
| 121 uint16_t* mapped_code) { | |
| 122 static KeyMapType key_mapping = { | |
| 123 {BTN_TRIGGER, WG_BUTTON_A}, {BTN_THUMB, WG_BUTTON_B}, | |
| 124 {BTN_THUMB2, WG_BUTTON_X}, {BTN_TOP, WG_BUTTON_Y}, | |
| 125 {BTN_BASE, WG_BUTTON_L1}, {BTN_BASE2, WG_BUTTON_R1}, | |
| 126 {BTN_TOP2, WG_BUTTON_L2}, {BTN_PINKIE, WG_BUTTON_R2}}; | |
| 127 | |
| 128 static AbsMapType abs_mapping = { | |
| 129 TO_BTN(ABS_X, kHAT_X), TO_BTN(ABS_Y, kHAT_Y), | |
| 130 }; | |
| 131 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 132 mapped_code); | |
| 133 } | |
| 134 | |
| 135 bool ClassicNESMapper(uint16_t type, | |
| 136 uint16_t code, | |
| 137 GamepadEventType* mapped_type, | |
| 138 uint16_t* mapped_code) { | |
| 139 static KeyMapType key_mapping = { | |
| 140 {BTN_THUMB, WG_BUTTON_A}, {BTN_THUMB2, WG_BUTTON_B}, | |
| 141 {BTN_TRIGGER, WG_BUTTON_X}, {BTN_TOP, WG_BUTTON_Y}, | |
| 142 {BTN_TOP2, WG_BUTTON_L1}, {BTN_PINKIE, WG_BUTTON_R1}, | |
| 143 {BTN_BASE3, WG_BUTTON_SELECT}, {BTN_BASE4, WG_BUTTON_START}}; | |
| 144 | |
| 145 static AbsMapType abs_mapping = { | |
| 146 TO_BTN(ABS_X, kHAT_X), TO_BTN(ABS_Y, kHAT_Y), | |
| 147 }; | |
| 148 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 149 mapped_code); | |
| 150 } | |
| 151 | |
| 152 bool SNesRetroMapper(uint16_t type, | |
| 153 uint16_t code, | |
| 154 GamepadEventType* mapped_type, | |
| 155 uint16_t* mapped_code) { | |
| 156 static KeyMapType key_mapping = { | |
| 157 {BTN_C, WG_BUTTON_A}, {BTN_B, WG_BUTTON_B}, | |
| 158 {BTN_X, WG_BUTTON_X}, {BTN_A, WG_BUTTON_Y}, | |
| 159 {BTN_Y, WG_BUTTON_L1}, {BTN_Z, WG_BUTTON_R1}, | |
| 160 {BTN_TL2, WG_BUTTON_SELECT}, {BTN_TR2, WG_BUTTON_START}}; | |
| 161 | |
| 162 static AbsMapType abs_mapping = { | |
| 163 TO_ABS(ABS_X, kHAT_X), TO_ABS(ABS_Y, kHAT_Y), | |
| 164 }; | |
| 165 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 166 mapped_code); | |
| 167 } | |
| 168 | |
| 169 bool ADT1Mapper(uint16_t type, | |
| 170 uint16_t code, | |
| 171 GamepadEventType* mapped_type, | |
| 172 uint16_t* mapped_code) { | |
| 173 static KeyMapType key_mapping = { | |
| 174 {BTN_A, WG_BUTTON_A}, {BTN_B, WG_BUTTON_B}, | |
| 175 {BTN_X, WG_BUTTON_X}, {BTN_Y, WG_BUTTON_Y}, | |
| 176 {BTN_TL, WG_BUTTON_L1}, {BTN_TR, WG_BUTTON_R1}, | |
| 177 {BTN_THUMBL, WG_BUTTON_THUMBL}, {BTN_THUMBR, WG_BUTTON_THUMBR}, | |
| 178 {BTN_MODE, WG_BUTTON_START}, {KEY_BACK, WG_BUTTON_SELECT}, | |
| 179 {KEY_HOMEPAGE, WG_BUTTON_MODE}}; | |
| 180 | |
| 181 static AbsMapType abs_mapping = { | |
| 182 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 183 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 184 TO_BTN(ABS_BRAKE, WG_BUTTON_L2), TO_BTN(ABS_GAS, WG_BUTTON_R2), | |
| 185 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 186 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 187 mapped_code); | |
| 188 } | |
| 189 | |
| 190 bool Vendor_1d79Product_0009Mapper(uint16_t type, | |
| 191 uint16_t code, | |
| 192 GamepadEventType* mapped_type, | |
| 193 uint16_t* mapped_code) { | |
| 194 static KeyMapType key_mapping = {{BTN_A, WG_BUTTON_A}, | |
| 195 {BTN_B, WG_BUTTON_B}, | |
| 196 {BTN_X, WG_BUTTON_X}, | |
| 197 {BTN_Y, WG_BUTTON_Y}, | |
| 198 {BTN_TL, WG_BUTTON_L1}, | |
| 199 {BTN_TR, WG_BUTTON_R1}, | |
| 200 {BTN_START, WG_BUTTON_START}, | |
| 201 {BTN_THUMBL, WG_BUTTON_THUMBL}, | |
| 202 {BTN_THUMBR, WG_BUTTON_THUMBR}, | |
| 203 {KEY_UP, WG_BUTTON_DPAD_UP}, | |
| 204 {KEY_DOWN, WG_BUTTON_DPAD_DOWN}, | |
| 205 {KEY_LEFT, WG_BUTTON_DPAD_LEFT}, | |
| 206 {KEY_RIGHT, WG_BUTTON_DPAD_RIGHT}, | |
| 207 {KEY_BACK, WG_BUTTON_SELECT}, | |
| 208 {KEY_HOMEPAGE, WG_BUTTON_MODE}}; | |
| 209 | |
| 210 static AbsMapType abs_mapping = { | |
| 211 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 212 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 213 TO_BTN(ABS_BRAKE, WG_BUTTON_L2), TO_BTN(ABS_GAS, WG_BUTTON_R2), | |
| 214 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 215 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 216 mapped_code); | |
| 217 } | |
| 218 | |
| 219 bool Vendor_046dProduct_b501Mapper(uint16_t type, | |
| 220 uint16_t code, | |
| 221 GamepadEventType* mapped_type, | |
| 222 uint16_t* mapped_code) { | |
| 223 static KeyMapType key_mapping = {{BTN_A, WG_BUTTON_A}, | |
| 224 {BTN_B, WG_BUTTON_B}, | |
| 225 {BTN_X, WG_BUTTON_X}, | |
| 226 {BTN_Y, WG_BUTTON_Y}, | |
| 227 {BTN_TL, WG_BUTTON_L1}, | |
| 228 {BTN_TR, WG_BUTTON_R1}, | |
| 229 {BTN_TL2, WG_BUTTON_L2}, | |
| 230 {BTN_TR2, WG_BUTTON_R2}, | |
| 231 {BTN_SELECT, WG_BUTTON_SELECT}, | |
| 232 {BTN_START, WG_BUTTON_START}, | |
| 233 {BTN_THUMBL, WG_BUTTON_THUMBL}, | |
| 234 {BTN_THUMBR, WG_BUTTON_THUMBR}, | |
| 235 {KEY_UP, WG_BUTTON_DPAD_UP}, | |
| 236 {KEY_DOWN, WG_BUTTON_DPAD_DOWN}, | |
| 237 {KEY_LEFT, WG_BUTTON_DPAD_LEFT}, | |
| 238 {KEY_RIGHT, WG_BUTTON_DPAD_RIGHT}, | |
| 239 {BTN_MODE, WG_BUTTON_MODE}}; | |
| 240 | |
| 241 static AbsMapType abs_mapping = { | |
| 242 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 243 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 244 TO_BTN(ABS_BRAKE, WG_BUTTON_L2), TO_BTN(ABS_GAS, WG_BUTTON_R2), | |
| 245 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 246 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 247 mapped_code); | |
| 248 } | |
| 249 | |
| 250 bool Vendor_046dProduct_c216Mapper(uint16_t type, | |
| 251 uint16_t code, | |
| 252 GamepadEventType* mapped_type, | |
| 253 uint16_t* mapped_code) { | |
| 254 static KeyMapType key_mapping = { | |
| 255 {BTN_TRIGGER, WG_BUTTON_A}, {BTN_TOP, WG_BUTTON_B}, | |
| 256 {BTN_THUMB, WG_BUTTON_X}, {BTN_THUMB2, WG_BUTTON_Y}, | |
| 257 {BTN_TOP2, WG_BUTTON_L1}, {BTN_PINKIE, WG_BUTTON_R1}, | |
| 258 {BTN_BASE, WG_BUTTON_L2}, {BTN_BASE2, WG_BUTTON_R2}, | |
| 259 {BTN_BASE3, WG_BUTTON_SELECT}, {BTN_BASE4, WG_BUTTON_START}, | |
| 260 {BTN_BASE5, WG_BUTTON_THUMBL}, {BTN_BASE6, WG_BUTTON_THUMBR}}; | |
| 261 | |
| 262 static AbsMapType abs_mapping = { | |
| 263 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 264 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 265 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 266 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 267 mapped_code); | |
| 268 } | |
| 269 | |
| 270 bool Vendor_046dProduct_c219Mapper(uint16_t type, | |
| 271 uint16_t code, | |
| 272 GamepadEventType* mapped_type, | |
| 273 uint16_t* mapped_code) { | |
| 274 static KeyMapType key_mapping = { | |
| 275 {BTN_B, WG_BUTTON_A}, {BTN_C, WG_BUTTON_B}, | |
| 276 {BTN_A, WG_BUTTON_X}, {BTN_X, WG_BUTTON_Y}, | |
| 277 {BTN_Y, WG_BUTTON_L1}, {BTN_Z, WG_BUTTON_R1}, | |
| 278 {BTN_TL, WG_BUTTON_L2}, {BTN_TR, WG_BUTTON_R2}, | |
| 279 {BTN_TR2, WG_BUTTON_START}, {BTN_SELECT, WG_BUTTON_THUMBL}, | |
| 280 {BTN_START, WG_BUTTON_THUMBR}, {BTN_TL2, WG_BUTTON_SELECT}}; | |
| 281 | |
| 282 static AbsMapType abs_mapping = { | |
| 283 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 284 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 285 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 286 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 287 mapped_code); | |
| 288 } | |
| 289 | |
| 290 bool Vendor_1038Product_1412Mapper(uint16_t type, | |
| 291 uint16_t code, | |
| 292 GamepadEventType* mapped_type, | |
| 293 uint16_t* mapped_code) { | |
| 294 static KeyMapType key_mapping = { | |
| 295 {BTN_A, WG_BUTTON_A}, {BTN_B, WG_BUTTON_B}, | |
| 296 {BTN_X, WG_BUTTON_X}, {BTN_Y, WG_BUTTON_Y}, | |
| 297 {BTN_TL, WG_BUTTON_L1}, {BTN_TR, WG_BUTTON_R1}, | |
| 298 {BTN_MODE, WG_BUTTON_SELECT}, {BTN_START, WG_BUTTON_START}, | |
| 299 }; | |
| 300 | |
| 301 static AbsMapType abs_mapping = { | |
| 302 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 303 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 304 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 305 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 306 mapped_code); | |
| 307 } | |
| 308 | |
| 309 bool Vendor_1689Product_fd00Mapper(uint16_t type, | |
| 310 uint16_t code, | |
| 311 GamepadEventType* mapped_type, | |
| 312 uint16_t* mapped_code) { | |
| 313 static KeyMapType key_mapping = {{BTN_A, WG_BUTTON_A}, | |
| 314 {BTN_B, WG_BUTTON_B}, | |
| 315 {BTN_X, WG_BUTTON_X}, | |
| 316 {BTN_Y, WG_BUTTON_Y}, | |
| 317 {BTN_TL, WG_BUTTON_L1}, | |
| 318 {BTN_TR, WG_BUTTON_R1}, | |
| 319 {BTN_START, WG_BUTTON_START}, | |
| 320 {BTN_THUMBL, WG_BUTTON_THUMBL}, | |
| 321 {BTN_THUMBR, WG_BUTTON_THUMBR}, | |
| 322 {BTN_TRIGGER_HAPPY3, WG_BUTTON_DPAD_UP}, | |
| 323 {BTN_TRIGGER_HAPPY4, WG_BUTTON_DPAD_DOWN}, | |
| 324 {BTN_TRIGGER_HAPPY1, WG_BUTTON_DPAD_LEFT}, | |
| 325 {BTN_TRIGGER_HAPPY2, WG_BUTTON_DPAD_RIGHT}, | |
| 326 {BTN_SELECT, WG_BUTTON_SELECT}, | |
| 327 {BTN_MODE, WG_BUTTON_MODE}}; | |
| 328 | |
| 329 static AbsMapType abs_mapping = { | |
| 330 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 331 TO_ABS(ABS_RX, WG_ABS_Z), TO_ABS(ABS_RY, WG_ABS_RZ), | |
| 332 TO_BTN(ABS_Z, WG_BUTTON_L2), TO_BTN(ABS_RZ, WG_BUTTON_R2)}; | |
| 333 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 334 mapped_code); | |
| 335 } | |
| 336 | |
| 337 bool GenericMapper(uint16_t type, | |
| 338 uint16_t code, | |
| 339 GamepadEventType* mapped_type, | |
| 340 uint16_t* mapped_code) { | |
| 341 static KeyMapType key_mapping = {{BTN_A, WG_BUTTON_A}, | |
| 342 {BTN_B, WG_BUTTON_B}, | |
| 343 {BTN_X, WG_BUTTON_X}, | |
| 344 {BTN_Y, WG_BUTTON_Y}, | |
| 345 {BTN_TL, WG_BUTTON_L1}, | |
| 346 {BTN_TR, WG_BUTTON_R1}, | |
| 347 {BTN_TL2, WG_BUTTON_L2}, | |
| 348 {BTN_TR2, WG_BUTTON_R2}, | |
| 349 {BTN_THUMBL, WG_BUTTON_THUMBL}, | |
| 350 {BTN_THUMBR, WG_BUTTON_THUMBR}, | |
| 351 {KEY_BACK, WG_BUTTON_SELECT}, | |
| 352 {KEY_HOMEPAGE, WG_BUTTON_MODE}, | |
| 353 {KEY_UP, WG_BUTTON_DPAD_UP}, | |
| 354 {KEY_DOWN, WG_BUTTON_DPAD_DOWN}, | |
| 355 {KEY_LEFT, WG_BUTTON_DPAD_LEFT}, | |
| 356 {KEY_RIGHT, WG_BUTTON_DPAD_RIGHT}, | |
| 357 {BTN_SELECT, WG_BUTTON_SELECT}, | |
| 358 {BTN_START, WG_BUTTON_START}, | |
| 359 {BTN_MODE, WG_BUTTON_MODE}}; | |
| 360 | |
| 361 static AbsMapType abs_mapping = { | |
| 362 TO_ABS(ABS_X, WG_ABS_X), TO_ABS(ABS_Y, WG_ABS_Y), | |
| 363 TO_ABS(ABS_Z, WG_ABS_Z), TO_ABS(ABS_RZ, WG_ABS_RZ), | |
| 364 TO_BTN(ABS_BRAKE, WG_BUTTON_L2), TO_BTN(ABS_GAS, WG_BUTTON_R2), | |
| 365 TO_BTN(ABS_HAT0X, kHAT_X), TO_BTN(ABS_HAT0Y, kHAT_Y)}; | |
| 366 return DoGamepadMapping(key_mapping, abs_mapping, type, code, mapped_type, | |
| 367 mapped_code); | |
| 368 } | |
| 369 | |
| 370 static struct MappingData { | |
|
spang
2017/04/21 05:38:46
Please make all this stuff const.
I do not think
jkwang
2017/04/25 21:16:41
Sure.
spang
2017/05/03 22:00:37
I'm confident you could compute joydev mappings fr
| |
| 371 uint16_t vendor_id; | |
| 372 uint16_t product_id; | |
| 373 GamepadMapper mapper; | |
| 374 } AvailableMappings[] = { | |
| 375 // xbox style gamepad | |
| 376 {0x045e, 0x028e, XInputStyleMapper}, // xbox 360 wired | |
| 377 {0x045e, 0x028f, XInputStyleMapper}, // xbox 360 wireless | |
| 378 {0x045e, 0x02a1, XInputStyleMapper}, // xbox 360 wireless | |
| 379 {0x045e, 0x02d1, XInputStyleMapper}, // xbox one wired | |
| 380 {0x045e, 0x02dd, XInputStyleMapper}, // xbox one wired (2015 fw) | |
| 381 {0x045e, 0x02e3, XInputStyleMapper}, // xbox elite wired | |
| 382 {0x045e, 0x02ea, XInputStyleMapper}, // xbox one s (usb) | |
| 383 {0x045e, 0x0719, XInputStyleMapper}, // xbox 360 wireless | |
| 384 {0x046d, 0xc21d, XInputStyleMapper}, // logitech f310 | |
| 385 {0x046d, 0xc21e, XInputStyleMapper}, // logitech f510 | |
| 386 {0x046d, 0xc21f, XInputStyleMapper}, // logitech f710 | |
| 387 {0x2378, 0x1008, XInputStyleMapper}, // onlive controller (bluetooth) | |
| 388 {0x2378, 0x100a, XInputStyleMapper}, // onlive controller (wired) | |
| 389 {0x1bad, 0xf016, XInputStyleMapper}, // madcatz gamepad | |
| 390 {0x1bad, 0xf023, XInputStyleMapper}, // mad catz mlg gamepad for xbox360 | |
| 391 {0x1bad, 0xf027, XInputStyleMapper}, // madcatz fps pro | |
| 392 {0x1bad, 0xf036, XInputStyleMapper}, // madcatz generic xbox controller | |
| 393 {0x1689, 0xfd01, XInputStyleMapper}, // razer xbox 360 gamepad | |
| 394 {0x1689, 0xfe00, XInputStyleMapper}, // razer sabertooth elite | |
| 395 // sony gamepads | |
| 396 {0x054c, 0x0268, PlaystationSixAxisMapper}, // playstation 3 | |
| 397 // nes style gamepad | |
| 398 {0x0583, 0x2060, IBuffalocClassicMapper}, // ibuffaloclassic | |
| 399 {0x0079, 0x0011, ClassicNESMapper}, // classic nes controller | |
| 400 {0x12bd, 0xd015, SNesRetroMapper}, // hitgaming snes retro | |
| 401 // android gamepad | |
| 402 {0x0b05, 0x4500, ADT1Mapper}, // nexus player controller (asus gamepad) | |
| 403 {0x1532, 0x0900, ADT1Mapper}, // razer serval | |
| 404 {0x18d1, 0x2c40, ADT1Mapper}, // adt-1 controller (odie) | |
| 405 // other gamepad | |
| 406 {0x1d79, 0x0009, | |
| 407 Vendor_1d79Product_0009Mapper}, // nyko playpad / playpad pro | |
| 408 {0x046d, 0xb501, Vendor_046dProduct_b501Mapper}, // logitech redhawk | |
| 409 // logitech dual action controller | |
| 410 {0x046d, 0xc216, Vendor_046dProduct_c216Mapper}, | |
| 411 // logitech cordless rumblepad2 | |
| 412 {0x046d, 0xc219, Vendor_046dProduct_c219Mapper}, | |
| 413 {0x1038, 0x1412, Vendor_1038Product_1412Mapper}, // steelseries free | |
| 414 // razer onza tournment edition | |
| 415 {0x1689, 0xfd00, Vendor_1689Product_fd00Mapper}}; | |
| 416 | |
| 417 GamepadMapper GetGamepadMapper(uint16_t vendor_id, uint16_t product_id) { | |
| 418 for (size_t i = 0; i < arraysize(AvailableMappings); i++) { | |
| 419 if (AvailableMappings[i].vendor_id == vendor_id && | |
| 420 AvailableMappings[i].product_id == product_id) { | |
| 421 return AvailableMappings[i].mapper; | |
| 422 } | |
| 423 } | |
| 424 return GenericMapper; | |
| 425 } | |
| 426 | |
| 427 } // namespace ui | |
| OLD | NEW |