packages/sdl2/fix-hidapi.patch

166 lines
5.3 KiB
Diff

--- a/src/hidapi/SDL_hidapi.c Sun Jun 28 17:45:07 2020 -0400
+++ a/src/hidapi/SDL_hidapi.c Mon Jul 06 10:47:27 2020 +0200
@@ -301,7 +301,7 @@
#include "hidapi.h"
struct hidapi_backend {
-#define F(x) typeof(x) *x
+#define F(x) __typeof__(x) *x
F(hid_write);
F(hid_read_timeout);
F(hid_read);
@@ -458,8 +458,9 @@
#ifdef SDL_LIBUSB_DYNAMIC
libusb_ctx.libhandle = SDL_LoadObject(SDL_LIBUSB_DYNAMIC);
if (libusb_ctx.libhandle != NULL) {
+ SDL_bool loaded = SDL_TRUE;
#define LOAD_LIBUSB_SYMBOL(func) \
- libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle, "libusb_" #func);
+ if (!(libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle, "libusb_" #func))) {loaded = SDL_FALSE;}
LOAD_LIBUSB_SYMBOL(init)
LOAD_LIBUSB_SYMBOL(exit)
LOAD_LIBUSB_SYMBOL(get_device_list)
@@ -488,9 +489,17 @@
LOAD_LIBUSB_SYMBOL(handle_events_completed)
#undef LOAD_LIBUSB_SYMBOL
- if ((err = LIBUSB_hid_init()) < 0) {
+ if (loaded == SDL_TRUE) {
+ if ((err = LIBUSB_hid_init()) < 0) {
+ SDL_UnloadObject(libusb_ctx.libhandle);
+ libusb_ctx.libhandle = NULL;
+ return err;
+ }
+ } else {
SDL_UnloadObject(libusb_ctx.libhandle);
- return err;
+ libusb_ctx.libhandle = NULL;
+ /* SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, SDL_LIBUSB_DYNAMIC " found but could not load function."); */
+ /* ignore error: continue without libusb */
}
}
#endif /* SDL_LIBUSB_DYNAMIC */
@@ -502,13 +511,16 @@
if (udev_ctx && (err = PLATFORM_hid_init()) < 0) {
#ifdef SDL_LIBUSB_DYNAMIC
if (libusb_ctx.libhandle) {
+ LIBUSB_hid_exit();
SDL_UnloadObject(libusb_ctx.libhandle);
+ libusb_ctx.libhandle = NULL;
}
#endif /* SDL_LIBUSB_DYNAMIC */
return err;
}
#endif /* HAVE_PLATFORM_BACKEND */
+ SDL_hidapi_wasinit = SDL_TRUE;
return 0;
}
@@ -519,6 +531,7 @@
if (SDL_hidapi_wasinit == SDL_FALSE) {
return 0;
}
+ SDL_hidapi_wasinit = SDL_FALSE;
#if HAVE_PLATFORM_BACKEND
if (udev_ctx) {
@@ -529,6 +542,7 @@
if (libusb_ctx.libhandle) {
err |= LIBUSB_hid_exit(); /* Ehhhhh */
SDL_UnloadObject(libusb_ctx.libhandle);
+ libusb_ctx.libhandle = NULL;
}
#endif /* SDL_LIBUSB_DYNAMIC */
return err;
@@ -546,16 +560,30 @@
#endif
struct hid_device_info *devs = NULL, *last = NULL, *new_dev;
- if (SDL_hidapi_wasinit == SDL_FALSE) {
- hid_init();
+ if (hid_init() != 0) {
+ return NULL;
}
#ifdef SDL_LIBUSB_DYNAMIC
if (libusb_ctx.libhandle) {
usb_devs = LIBUSB_hid_enumerate(vendor_id, product_id);
+ #ifdef DEBUG_HIDAPI
+ SDL_Log("libusb devices found:");
+ #endif
for (usb_dev = usb_devs; usb_dev; usb_dev = usb_dev->next) {
new_dev = (struct hid_device_info*) SDL_malloc(sizeof(struct hid_device_info));
+ if (!new_dev) {
+ LIBUSB_hid_free_enumeration(usb_devs);
+ hid_free_enumeration(devs);
+ SDL_OutOfMemory();
+ return NULL;
+ }
LIBUSB_CopyHIDDeviceInfo(usb_dev, new_dev);
+ #ifdef DEBUG_HIDAPI
+ SDL_Log(" - %ls %ls 0x%.4hx 0x%.4hx",
+ usb_dev->manufacturer_string, usb_dev->product_string,
+ usb_dev->vendor_id, usb_dev->product_id);
+ #endif
if (last != NULL) {
last->next = new_dev;
@@ -570,8 +598,16 @@
#if HAVE_PLATFORM_BACKEND
if (udev_ctx) {
raw_devs = PLATFORM_hid_enumerate(vendor_id, product_id);
+#ifdef DEBUG_HIDAPI
+ SDL_Log("hidraw devices found:");
+#endif
for (raw_dev = raw_devs; raw_dev; raw_dev = raw_dev->next) {
SDL_bool bFound = SDL_FALSE;
+#ifdef DEBUG_HIDAPI
+ SDL_Log(" - %ls %ls 0x%.4hx 0x%.4hx",
+ raw_dev->manufacturer_string, raw_dev->product_string,
+ raw_dev->vendor_id, raw_dev->product_id);
+#endif
#ifdef SDL_LIBUSB_DYNAMIC
for (usb_dev = usb_devs; usb_dev; usb_dev = usb_dev->next) {
if (raw_dev->vendor_id == usb_dev->vendor_id &&
@@ -584,6 +620,17 @@
#endif
if (!bFound) {
new_dev = (struct hid_device_info*) SDL_malloc(sizeof(struct hid_device_info));
+ if (!new_dev) {
+#ifdef SDL_LIBUSB_DYNAMIC
+ if (libusb_ctx.libhandle) {
+ LIBUSB_hid_free_enumeration(usb_devs);
+ }
+#endif
+ PLATFORM_hid_free_enumeration(raw_devs);
+ hid_free_enumeration(devs);
+ SDL_OutOfMemory();
+ return NULL;
+ }
PLATFORM_CopyHIDDeviceInfo(raw_dev, new_dev);
new_dev->next = NULL;
@@ -624,8 +671,8 @@
{
hid_device *pDevice = NULL;
- if (SDL_hidapi_wasinit == SDL_FALSE) {
- hid_init();
+ if (hid_init() != 0) {
+ return NULL;
}
#if HAVE_PLATFORM_BACKEND
@@ -651,8 +698,8 @@
{
hid_device *pDevice = NULL;
- if (SDL_hidapi_wasinit == SDL_FALSE) {
- hid_init();
+ if (hid_init() != 0) {
+ return NULL;
}
#if HAVE_PLATFORM_BACKEND