Prevent multiple HID elements of same usage type on OSX

On OSX, iterate the HID device's elements and only store the last of
each type to accommodate for flaky hardware
This commit is contained in:
Arthur Carlsson 2017-06-30 23:56:42 +02:00 committed by Léo Lam
parent 2b4bf8662a
commit 79a646a67d

View File

@ -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);
}