Merge remote-tracking branch 'joystick/feat-usb-detection'

# Conflicts:
#	src/internal.h
This commit is contained in:
Reece Wilson 2023-11-04 23:56:30 +00:00
commit e4edc29fb3
3 changed files with 73 additions and 7 deletions

View File

@ -67,21 +67,68 @@ static GLFWbool initJoysticks(void)
return _glfw.joysticksInitialized = GLFW_TRUE;
}
// Finds a mapping based on joystick GUID
//
static _GLFWmapping* findMapping(const char* guid)
{
int i;
#if defined(GLFW_BUILD_LINUX_JOYSTICK)
for (i = 0; i < _glfw.mappingCount; i++)
uint16_t parseHexDigit(char c)
{
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
assert(GLFW_FALSE);
}
struct vendor_product
{
uint16_t vendor;
uint16_t product;
};
static struct vendor_product parseGUID(const char* guid)
{
struct vendor_product result;
result.vendor = parseHexDigit(guid[8]) | (parseHexDigit(guid[9]) << 8);
result.product = parseHexDigit(guid[16]) | (parseHexDigit(guid[17]) << 8);
return result;
}
static _GLFWmapping* findMappingUSBVendorProduct(const char* guid)
{
struct vendor_product this;
this = parseGUID(guid);
for (int i = 0; i < _glfw.mappingCount; i++)
{
if (strcmp(_glfw.mappings[i].guid, guid) == 0)
struct vendor_product that = parseGUID(_glfw.mappings[i].guid);
if (memcmp(&this, &that, sizeof(struct vendor_product)) == 0)
return _glfw.mappings + i;
}
return NULL;
}
#endif
// Finds a mapping based on joystick GUID
//
static _GLFWmapping* findMapping(const char* guid)
{
// exact match
for (int i = 0; i < _glfw.mappingCount; i++)
{
if (strncmp(_glfw.mappings[i].guid, guid, 32) == 0)
return _glfw.mappings + i;
}
#if defined(GLFW_BUILD_LINUX_JOYSTICK)
// only match vendor id, product id
return findMappingUSBVendorProduct(guid);
#else
return NULL;
#endif
}
// Checks whether a gamepad mapping element is present in the hardware
//
static GLFWbool isValidElementForJoystick(const _GLFWmapelement* e,

View File

@ -76,6 +76,7 @@ typedef struct _GLFWmonitor _GLFWmonitor;
typedef struct _GLFWcursor _GLFWcursor;
typedef struct _GLFWmapelement _GLFWmapelement;
typedef struct _GLFWmapping _GLFWmapping;
typedef struct _GLFWusbinfo _GLFWusbinfo;
typedef struct _GLFWjoystick _GLFWjoystick;
typedef struct _GLFWtls _GLFWtls;
typedef struct _GLFWmutex _GLFWmutex;
@ -673,6 +674,16 @@ struct _GLFWmapping
_GLFWmapelement axes[6];
};
// USB vendor, product, version
//
struct _GLFWusbinfo
{
uint16_t bustype;
uint16_t vendor;
uint16_t product;
uint16_t version;
};
// Joystick structure
//
struct _GLFWjoystick
@ -688,6 +699,7 @@ struct _GLFWjoystick
char name[128];
void* userPointer;
char guid[33];
_GLFWusbinfo usbInfo;
_GLFWmapping* mapping;
// This is defined in platform.h

View File

@ -172,6 +172,12 @@ static GLFWbool openJoystickDevice(const char* path)
char guid[33] = "";
_GLFWusbinfo usbinfo;
usbinfo.bustype = id.bustype;
usbinfo.vendor = id.vendor;
usbinfo.product = id.product;
usbinfo.version = id.version;
// Generate a joystick GUID that matches the SDL 2.0.5+ one
if (id.vendor && id.product && id.version)
{
@ -231,6 +237,7 @@ static GLFWbool openJoystickDevice(const char* path)
close(linjs.fd);
return GLFW_FALSE;
}
js->usbInfo = usbinfo;
strncpy(linjs.path, path, sizeof(linjs.path) - 1);
memcpy(&js->linjs, &linjs, sizeof(linjs));