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

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

Issue 2805793002: ozone: evdev: Add gamepad support (Closed)
Patch Set: Support Gamepad in Ozone. Created 3 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
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698