summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerInterface
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface')
-rw-r--r--Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm17
1 files changed, 17 insertions, 0 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
index 9bbd953a4b..ecbef721a5 100644
--- a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
+++ b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
@@ -2,6 +2,7 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
+#include <algorithm>
#include <sstream>
#include <Foundation/Foundation.h>
@@ -49,11 +50,26 @@ Joystick::Joystick(IOHIDDeviceRef device, std::string name)
if (axes)
{
+ std::vector<IOHIDElementRef> elems;
for (int i = 0; i < CFArrayGetCount(axes); i++)
{
IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(axes, i);
// DeviceElementDebugPrint(e, nullptr);
+ uint32_t usage = IOHIDElementGetUsage(e);
+ // Check for any existing elements with the same usage
+ auto it = std::find_if(elems.begin(), elems.end(), [usage](const auto& ref) {
+ return usage == IOHIDElementGetUsage(ref);
+ });
+
+ if (it == elems.end())
+ elems.push_back(e);
+ else
+ *it = e;
+ }
+
+ for (auto e : elems)
+ {
if (IOHIDElementGetUsage(e) == kHIDUsage_GD_Hatswitch)
{
AddInput(new Hat(e, m_device, Hat::up));
@@ -67,6 +83,7 @@ Joystick::Joystick(IOHIDDeviceRef device, std::string name)
new Axis(e, m_device, Axis::positive));
}
}
+
CFRelease(axes);
}