summaryrefslogtreecommitdiffstats
path: root/dom/gamepad/GamepadRemapping.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/gamepad/GamepadRemapping.h')
-rw-r--r--dom/gamepad/GamepadRemapping.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/dom/gamepad/GamepadRemapping.h b/dom/gamepad/GamepadRemapping.h
new file mode 100644
index 0000000000..0a508fe134
--- /dev/null
+++ b/dom/gamepad/GamepadRemapping.h
@@ -0,0 +1,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_