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