1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_GamepadRemapping_h_
#define mozilla_dom_GamepadRemapping_h_
#include "mozilla/dom/GamepadBinding.h"
#include "mozilla/dom/GamepadLightIndicator.h"
#include "mozilla/dom/GamepadPoseState.h"
#include "mozilla/dom/GamepadTouchState.h"
namespace mozilla::dom {
// GamepadId is (vendorId << 16) | productId)
enum class GamepadId : uint32_t {
// Nexus Player Controller
kAsusTekProduct4500 = 0x0b054500,
// 2Axes 8Keys Game Pad
kDragonRiseProduct0011 = 0x00790011,
// ADT-1 Controller
kGoogleProduct2c40 = 0x18d12c40,
// Stadia Controller
kGoogleProduct9400 = 0x18d19400,
// Logitech F310, D-mode
kLogitechProductc216 = 0x046dc216,
// Logitech F510, D-mode
kLogitechProductc218 = 0x046dc218,
// Logitech F710, D-mode
kLogitechProductc219 = 0x046dc219,
// Microsoft Xbox 360
kMicrosoftProductXbox360 = 0x045e028e,
// Microsoft Xbox 360 Wireless
kMicrosoftProductXbox360Wireless = 0x045e028f,
// Microsoft Xbox 360 Wireless
kMicrosoftProductXbox360Wireless2 = 0x045e0719,
// Microsoft Xbox One 2013
kMicrosoftProductXbox2013 = 0x045e02d1,
// Microsoft Xbox One (2015 FW)
kMicrosoftProductXbox2015 = 0x045e02dd,
// Microsoft Xbox One S
kMicrosoftProductXboxOneS = 0x045e02ea,
// Microsoft Xbox One S Wireless
kMicrosoftProductXboxOneSWireless = 0x045e02e0,
// Microsoft Xbox One Elite
kMicrosoftProductXboxOneElite = 0x045e02e3,
// Microsoft Xbox One Elite 2
kMicrosoftProductXboxOneElite2 = 0x045e0b00,
// Microsoft Xbox One Elite 2 Wireless
kMicrosoftProductXboxOneElite2Wireless = 0x045e0b05,
// Xbox One S Wireless (2016 FW)
kMicrosoftProductXboxOneSWireless2016 = 0x045e02fd,
// Microsoft Xbox Adaptive
kMicrosoftProductXboxAdaptive = 0x045e0b0a,
// Microsoft Xbox Adaptive Wireless
kMicrosoftProductXboxAdaptiveWireless = 0x045e0b0c,
// Microsoft Xbox Series X Wireless
kMicrosoftProductXboxSeriesXWireless = 0x045e0b13,
// Switch Joy-Con L
kNintendoProduct2006 = 0x057e2006,
// Switch Joy-Con R
kNintendoProduct2007 = 0x057e2007,
// Switch Pro Controller
kNintendoProduct2009 = 0x057e2009,
// Switch Charging Grip
kNintendoProduct200e = 0x057e200e,
// Nvidia Shield gamepad (2015)
kNvidiaProduct7210 = 0x09557210,
// Nvidia Shield gamepad (2017)
kNvidiaProduct7214 = 0x09557214,
// iBuffalo Classic
kPadixProduct2060 = 0x05832060,
// XSkills Gamecube USB adapter
kPlayComProduct0005 = 0x0b430005,
// boom PSX+N64 USB Converter
kPrototypeVendorProduct0667 = 0x66660667,
// Analog game controller
kPrototypeVendorProduct9401 = 0x66669401,
// Razer Serval Controller
kRazer1532Product0900 = 0x15320900,
// Playstation 3 Controller
kSonyProduct0268 = 0x054c0268,
// Playstation Dualshock 4
kSonyProduct05c4 = 0x054c05c4,
// Dualshock 4 (PS4 Slim)
kSonyProduct09cc = 0x054c09cc,
// Dualshock 4 USB receiver
kSonyProduct0ba0 = 0x054c0ba0,
// Moga Pro Controller (HID mode)
kVendor20d6Product6271 = 0x20d66271,
// OnLive Controller (Bluetooth)
kVendor2378Product1008 = 0x23781008,
// OnLive Controller (Wired)
kVendor2378Product100a = 0x2378100a,
// OUYA Controller
kVendor2836Product0001 = 0x28360001,
};
// Follow the canonical ordering recommendation for the "Standard Gamepad"
// from https://www.w3.org/TR/gamepad/#remapping.
enum CanonicalButtonIndex {
BUTTON_INDEX_PRIMARY,
BUTTON_INDEX_SECONDARY,
BUTTON_INDEX_TERTIARY,
BUTTON_INDEX_QUATERNARY,
BUTTON_INDEX_LEFT_SHOULDER,
BUTTON_INDEX_RIGHT_SHOULDER,
BUTTON_INDEX_LEFT_TRIGGER,
BUTTON_INDEX_RIGHT_TRIGGER,
BUTTON_INDEX_BACK_SELECT,
BUTTON_INDEX_START,
BUTTON_INDEX_LEFT_THUMBSTICK,
BUTTON_INDEX_RIGHT_THUMBSTICK,
BUTTON_INDEX_DPAD_UP,
BUTTON_INDEX_DPAD_DOWN,
BUTTON_INDEX_DPAD_LEFT,
BUTTON_INDEX_DPAD_RIGHT,
BUTTON_INDEX_META,
BUTTON_INDEX_COUNT
};
enum CanonicalAxisIndex {
AXIS_INDEX_LEFT_STICK_X,
AXIS_INDEX_LEFT_STICK_Y,
AXIS_INDEX_RIGHT_STICK_X,
AXIS_INDEX_RIGHT_STICK_Y,
AXIS_INDEX_COUNT
};
static inline bool AxisNegativeAsButton(double input) { return input < -0.5; }
static inline bool AxisPositiveAsButton(double input) { return input > 0.5; }
class GamepadRemapper {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GamepadRemapper)
public:
virtual uint32_t GetAxisCount() const = 0;
virtual uint32_t GetButtonCount() const = 0;
virtual uint32_t GetLightIndicatorCount() const { return 0; }
virtual void GetLightIndicators(
nsTArray<GamepadLightIndicatorType>& aTypes) const {}
virtual uint32_t GetTouchEventCount() const { return 0; }
virtual void GetLightColorReport(uint8_t aRed, uint8_t aGreen, uint8_t aBlue,
std::vector<uint8_t>& aReport) const {}
virtual uint32_t GetMaxInputReportLength() const { return 0; }
virtual void SetAxisCount(uint32_t aButtonCount) {}
virtual void SetButtonCount(uint32_t aButtonCount) {}
virtual GamepadMappingType GetMappingType() const {
return GamepadMappingType::Standard;
}
virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) {}
virtual void RemapAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis,
double aValue) const = 0;
virtual void RemapButtonEvent(GamepadHandle aHandle, uint32_t aButton,
bool aPressed) const = 0;
protected:
GamepadRemapper() = default;
virtual ~GamepadRemapper() = default;
};
struct GamepadRemappingData {
GamepadId id;
RefPtr<GamepadRemapper> remapping;
};
already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
const uint16_t aProductId,
bool& aUsingDefault);
} // namespace mozilla::dom
#endif // mozilla_dom_GamepadRemapping_h_
|