From 55ed69fc9aebd5f137cd64e719e5f43bcac92849 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 24 May 2023 10:03:22 -0700
Subject: [PATCH] Fixed building SDL_hidapi.c with new hidapi
---
src/hidapi/SDL_hidapi.c | 263 ++++++++++++++++++++++++----------------
1 file changed, 158 insertions(+), 105 deletions(-)
diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c
index 3cc01f5d8003..24a27fdb5859 100644
--- a/src/hidapi/SDL_hidapi.c
+++ b/src/hidapi/SDL_hidapi.c
@@ -524,32 +524,41 @@ static void HIDAPI_ShutdownDiscovery(void)
/* Platform HIDAPI Implementation */
+struct PLATFORM_hid_device_;
+typedef struct PLATFORM_hid_device_ PLATFORM_hid_device;
+
+#define api_version PLATFORM_api_version
+#define create_device_info_for_device PLATFORM_create_device_info_for_device
+#define free_hid_device PLATFORM_free_hid_device
+#define hid_close PLATFORM_hid_close
#define hid_device PLATFORM_hid_device
#define hid_device_ PLATFORM_hid_device_
-#define hid_init PLATFORM_hid_init
-#define hid_exit PLATFORM_hid_exit
#define hid_enumerate PLATFORM_hid_enumerate
+#define hid_error PLATFORM_hid_error
+#define hid_exit PLATFORM_hid_exit
#define hid_free_enumeration PLATFORM_hid_free_enumeration
-#define hid_open PLATFORM_hid_open
-#define hid_open_path PLATFORM_hid_open_path
-#define hid_write PLATFORM_hid_write
-#define hid_read_timeout PLATFORM_hid_read_timeout
-#define hid_read PLATFORM_hid_read
-#define hid_set_nonblocking PLATFORM_hid_set_nonblocking
-#define hid_send_feature_report PLATFORM_hid_send_feature_report
+#define hid_get_device_info PLATFORM_hid_get_device_info
#define hid_get_feature_report PLATFORM_hid_get_feature_report
-#define hid_close PLATFORM_hid_close
+#define hid_get_indexed_string PLATFORM_hid_get_indexed_string
#define hid_get_manufacturer_string PLATFORM_hid_get_manufacturer_string
#define hid_get_product_string PLATFORM_hid_get_product_string
+#define hid_get_report_descriptor PLATFORM_hid_get_report_descriptor
#define hid_get_serial_number_string PLATFORM_hid_get_serial_number_string
-#define hid_get_indexed_string PLATFORM_hid_get_indexed_string
-#define hid_error PLATFORM_hid_error
-#define new_hid_device PLATFORM_new_hid_device
-#define free_hid_device PLATFORM_free_hid_device
+#define hid_init PLATFORM_hid_init
+#define hid_open_path PLATFORM_hid_open_path
+#define hid_open PLATFORM_hid_open
+#define hid_read PLATFORM_hid_read
+#define hid_read_timeout PLATFORM_hid_read_timeout
+#define hid_send_feature_report PLATFORM_hid_send_feature_report
+#define hid_set_nonblocking PLATFORM_hid_set_nonblocking
+#define hid_version PLATFORM_hid_version
+#define hid_version_str PLATFORM_hid_version_str
+#define hid_write PLATFORM_hid_write
#define input_report PLATFORM_input_report
-#define return_data PLATFORM_return_data
#define make_path PLATFORM_make_path
+#define new_hid_device PLATFORM_new_hid_device
#define read_thread PLATFORM_read_thread
+#define return_data PLATFORM_return_data
#undef HIDAPI_H__
#ifdef __LINUX__
@@ -557,21 +566,22 @@ static void HIDAPI_ShutdownDiscovery(void)
#ifdef SDL_USE_LIBUDEV
static const SDL_UDEV_Symbols *udev_ctx = NULL;
+#define udev_device_get_devnode udev_ctx->udev_device_get_devnode
+#define udev_device_get_parent_with_subsystem_devtype udev_ctx->udev_device_get_parent_with_subsystem_devtype
#define udev_device_get_sysattr_value udev_ctx->udev_device_get_sysattr_value
-#define udev_new udev_ctx->udev_new
-#define udev_unref udev_ctx->udev_unref
+#define udev_device_get_syspath udev_ctx->udev_device_get_syspath
#define udev_device_new_from_devnum udev_ctx->udev_device_new_from_devnum
-#define udev_device_get_parent_with_subsystem_devtype udev_ctx->udev_device_get_parent_with_subsystem_devtype
+#define udev_device_new_from_syspath udev_ctx->udev_device_new_from_syspath
#define udev_device_unref udev_ctx->udev_device_unref
-#define udev_enumerate_new udev_ctx->udev_enumerate_new
#define udev_enumerate_add_match_subsystem udev_ctx->udev_enumerate_add_match_subsystem
-#define udev_enumerate_scan_devices udev_ctx->udev_enumerate_scan_devices
#define udev_enumerate_get_list_entry udev_ctx->udev_enumerate_get_list_entry
+#define udev_enumerate_new udev_ctx->udev_enumerate_new
+#define udev_enumerate_scan_devices udev_ctx->udev_enumerate_scan_devices
+#define udev_enumerate_unref udev_ctx->udev_enumerate_unref
#define udev_list_entry_get_name udev_ctx->udev_list_entry_get_name
-#define udev_device_new_from_syspath udev_ctx->udev_device_new_from_syspath
-#define udev_device_get_devnode udev_ctx->udev_device_get_devnode
#define udev_list_entry_get_next udev_ctx->udev_list_entry_get_next
-#define udev_enumerate_unref udev_ctx->udev_enumerate_unref
+#define udev_new udev_ctx->udev_new
+#define udev_unref udev_ctx->udev_unref
#include "linux/hid.c"
#define HAVE_PLATFORM_BACKEND 1
@@ -582,6 +592,19 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL;
#define HAVE_PLATFORM_BACKEND 1
#define udev_ctx 1
#elif defined(__WINDOWS__) || defined(__WINGDK__)
+/* Define standard library functions in terms of SDL */
+#define calloc SDL_calloc
+#define free SDL_free
+#define malloc SDL_malloc
+#define memcmp SDL_memcmp
+#define swprintf SDL_swprintf
+#define towupper SDL_toupper
+#define wcscmp SDL_wcscmp
+#define _wcsdup SDL_wcsdup
+#define wcslen SDL_wcslen
+#define wcsncpy SDL_wcslcpy
+#define wcsstr SDL_wcsstr
+#define wcstol SDL_wcstol
#include "windows/hid.c"
#define HAVE_PLATFORM_BACKEND 1
#define udev_ctx 1
@@ -597,32 +620,38 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL;
#define udev_ctx 1
#endif
+#undef api_version
+#undef create_device_info_for_device
+#undef free_hid_device
+#undef hid_close
#undef hid_device
#undef hid_device_
-#undef hid_init
-#undef hid_exit
#undef hid_enumerate
+#undef hid_error
+#undef hid_exit
#undef hid_free_enumeration
-#undef hid_open
-#undef hid_open_path
-#undef hid_write
-#undef hid_read_timeout
-#undef hid_read
-#undef hid_set_nonblocking
-#undef hid_send_feature_report
+#undef hid_get_device_info
#undef hid_get_feature_report
-#undef hid_close
+#undef hid_get_indexed_string
#undef hid_get_manufacturer_string
#undef hid_get_product_string
+#undef hid_get_report_descriptor
#undef hid_get_serial_number_string
-#undef hid_get_indexed_string
-#undef hid_error
-#undef new_hid_device
-#undef free_hid_device
+#undef hid_init
+#undef hid_open
+#undef hid_open_path
+#undef hid_read
+#undef hid_read_timeout
+#undef hid_send_feature_report
+#undef hid_set_nonblocking
+#undef hid_version
+#undef hid_version_str
+#undef hid_write
#undef input_report
-#undef return_data
#undef make_path
+#undef new_hid_device
#undef read_thread
+#undef return_data
#ifdef SDL_JOYSTICK_HIDAPI_STEAMXBOX
#define HAVE_DRIVER_BACKEND 1
@@ -632,26 +661,30 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL;
/* DRIVER HIDAPI Implementation */
+struct DRIVER_hid_device_;
+typedef struct DRIVER_hid_device_ DRIVER_hid_device;
+
+#define hid_close DRIVER_hid_close
#define hid_device DRIVER_hid_device
#define hid_device_ DRIVER_hid_device_
-#define hid_init DRIVER_hid_init
-#define hid_exit DRIVER_hid_exit
#define hid_enumerate DRIVER_hid_enumerate
+#define hid_error DRIVER_hid_error
+#define hid_exit DRIVER_hid_exit
#define hid_free_enumeration DRIVER_hid_free_enumeration
-#define hid_open DRIVER_hid_open
-#define hid_open_path DRIVER_hid_open_path
-#define hid_write DRIVER_hid_write
-#define hid_read_timeout DRIVER_hid_read_timeout
-#define hid_read DRIVER_hid_read
-#define hid_set_nonblocking DRIVER_hid_set_nonblocking
-#define hid_send_feature_report DRIVER_hid_send_feature_report
#define hid_get_feature_report DRIVER_hid_get_feature_report
-#define hid_close DRIVER_hid_close
+#define hid_get_indexed_string DRIVER_hid_get_indexed_string
#define hid_get_manufacturer_string DRIVER_hid_get_manufacturer_string
#define hid_get_product_string DRIVER_hid_get_product_string
+#define hid_get_report_descriptor DRIVER_hid_get_report_descriptor
#define hid_get_serial_number_string DRIVER_hid_get_serial_number_string
-#define hid_get_indexed_string DRIVER_hid_get_indexed_string
-#define hid_error DRIVER_hid_error
+#define hid_init DRIVER_hid_init
+#define hid_open DRIVER_hid_open
+#define hid_open_path DRIVER_hid_open_path
+#define hid_read DRIVER_hid_read
+#define hid_read_timeout DRIVER_hid_read_timeout
+#define hid_send_feature_report DRIVER_hid_send_feature_report
+#define hid_set_nonblocking DRIVER_hid_set_nonblocking
+#define hid_write DRIVER_hid_write
#ifdef SDL_JOYSTICK_HIDAPI_STEAMXBOX
#undef HIDAPI_H__
@@ -660,26 +693,27 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL;
#error Need a driver hid.c for this platform!
#endif
+#undef hid_close
#undef hid_device
#undef hid_device_
-#undef hid_init
-#undef hid_exit
#undef hid_enumerate
+#undef hid_error
+#undef hid_exit
#undef hid_free_enumeration
-#undef hid_open
-#undef hid_open_path
-#undef hid_write
-#undef hid_read_timeout
-#undef hid_read
-#undef hid_set_nonblocking
-#undef hid_send_feature_report
#undef hid_get_feature_report
-#undef hid_close
+#undef hid_get_indexed_string
#undef hid_get_manufacturer_string
#undef hid_get_product_string
+#undef hid_get_report_descriptor
#undef hid_get_serial_number_string
-#undef hid_get_indexed_string
-#undef hid_error
+#undef hid_init
+#undef hid_open
+#undef hid_open_path
+#undef hid_read
+#undef hid_read_timeout
+#undef hid_send_feature_report
+#undef hid_set_nonblocking
+#undef hid_write
#endif /* HAVE_DRIVER_BACKEND */
@@ -707,9 +741,12 @@ static struct
);
void (LIBUSB_CALL *free_config_descriptor)(struct libusb_config_descriptor *config);
uint8_t (LIBUSB_CALL *get_bus_number)(libusb_device *dev);
+ int (LIBUSB_CALL *get_port_numbers)(libusb_device *dev, uint8_t *port_numbers, int port_numbers_len);
uint8_t (LIBUSB_CALL *get_device_address)(libusb_device *dev);
+ int (LIBUSB_CALL *wrap_sys_device)(libusb_context *ctx, intptr_t sys_dev, libusb_device_handle **dev_handle);
int (LIBUSB_CALL *open)(libusb_device *dev, libusb_device_handle **dev_handle);
void (LIBUSB_CALL *close)(libusb_device_handle *dev_handle);
+ libusb_device *(LIBUSB_CALL *get_device)(libusb_device_handle *dev_handle);
int (LIBUSB_CALL *claim_interface)(libusb_device_handle *dev_handle, int interface_number);
int (LIBUSB_CALL *release_interface)(libusb_device_handle *dev_handle, int interface_number);
int (LIBUSB_CALL *kernel_driver_active)(libusb_device_handle *dev_handle, int interface_number);
@@ -754,9 +791,12 @@ static struct
#define libusb_get_config_descriptor libusb_ctx.get_config_descriptor
#define libusb_free_config_descriptor libusb_ctx.free_config_descriptor
#define libusb_get_bus_number libusb_ctx.get_bus_number
+#define libusb_get_port_numbers libusb_ctx.get_port_numbers
#define libusb_get_device_address libusb_ctx.get_device_address
+#define libusb_wrap_sys_device libusb_ctx.wrap_sys_device
#define libusb_open libusb_ctx.open
#define libusb_close libusb_ctx.close
+#define libusb_get_device libusb_ctx.get_device
#define libusb_claim_interface libusb_ctx.claim_interface
#define libusb_release_interface libusb_ctx.release_interface
#define libusb_kernel_driver_active libusb_ctx.kernel_driver_active
@@ -773,32 +813,37 @@ static struct
#define libusb_handle_events_completed libusb_ctx.handle_events_completed
#define libusb_error_name libusb_ctx.error_name
+struct LIBUSB_hid_device_;
+typedef struct LIBUSB_hid_device_ LIBUSB_hid_device;
+
+#define free_hid_device LIBUSB_free_hid_device
+#define hid_close LIBUSB_hid_close
#define hid_device LIBUSB_hid_device
#define hid_device_ LIBUSB_hid_device_
-#define hid_init LIBUSB_hid_init
-#define hid_exit LIBUSB_hid_exit
#define hid_enumerate LIBUSB_hid_enumerate
+#define hid_error LIBUSB_hid_error
+#define hid_exit LIBUSB_hid_exit
#define hid_free_enumeration LIBUSB_hid_free_enumeration
-#define hid_open LIBUSB_hid_open
-#define hid_open_path LIBUSB_hid_open_path
-#define hid_write LIBUSB_hid_write
-#define hid_read_timeout LIBUSB_hid_read_timeout
-#define hid_read LIBUSB_hid_read
-#define hid_set_nonblocking LIBUSB_hid_set_nonblocking
-#define hid_send_feature_report LIBUSB_hid_send_feature_report
#define hid_get_feature_report LIBUSB_hid_get_feature_report
-#define hid_close LIBUSB_hid_close
+#define hid_get_input_report LIBUSB_hid_get_input_report
+#define hid_get_indexed_string LIBUSB_hid_get_indexed_string
#define hid_get_manufacturer_string LIBUSB_hid_get_manufacturer_string
#define hid_get_product_string LIBUSB_hid_get_product_string
+#define hid_get_report_descriptor LIBUSB_hid_get_report_descriptor
#define hid_get_serial_number_string LIBUSB_hid_get_serial_number_string
-#define hid_get_indexed_string LIBUSB_hid_get_indexed_string
-#define hid_error LIBUSB_hid_error
-#define new_hid_device LIBUSB_new_hid_device
-#define free_hid_device LIBUSB_free_hid_device
+#define hid_init LIBUSB_hid_init
+#define hid_open LIBUSB_hid_open
+#define hid_open_path LIBUSB_hid_open_path
+#define hid_read LIBUSB_hid_read
+#define hid_read_timeout LIBUSB_hid_read_timeout
+#define hid_send_feature_report LIBUSB_hid_send_feature_report
+#define hid_set_nonblocking LIBUSB_hid_set_nonblocking
+#define hid_write LIBUSB_hid_write
#define input_report LIBUSB_input_report
-#define return_data LIBUSB_return_data
#define make_path LIBUSB_make_path
+#define new_hid_device LIBUSB_new_hid_device
#define read_thread LIBUSB_read_thread
+#define return_data LIBUSB_return_data
#ifndef __FreeBSD__
/* this is awkwardly inlined, so we need to re-implement it here
@@ -825,9 +870,12 @@ static int SDL_libusb_get_string_descriptor(libusb_device_handle *dev,
#undef libusb_get_config_descriptor
#undef libusb_free_config_descriptor
#undef libusb_get_bus_number
+#undef libusb_get_port_numbers
#undef libusb_get_device_address
+#undef libusb_wrap_sys_device
#undef libusb_open
#undef libusb_close
+#undef libusb_get_device
#undef libusb_claim_interface
#undef libusb_release_interface
#undef libusb_kernel_driver_active
@@ -844,32 +892,34 @@ static int SDL_libusb_get_string_descriptor(libusb_device_handle *dev,
#undef libusb_handle_events_completed
#undef libusb_error_name
+#undef free_hid_device
+#undef hid_close
#undef hid_device
#undef hid_device_
-#undef hid_init
-#undef hid_exit
#undef hid_enumerate
+#undef hid_error
+#undef hid_exit
#undef hid_free_enumeration
-#undef hid_open
-#undef hid_open_path
-#undef hid_write
-#undef hid_read_timeout
-#undef hid_read
-#undef hid_set_nonblocking
-#undef hid_send_feature_report
#undef hid_get_feature_report
-#undef hid_close
+#undef hid_get_input_report
+#undef hid_get_indexed_string
#undef hid_get_manufacturer_string
#undef hid_get_product_string
+#undef hid_get_report_descriptor
#undef hid_get_serial_number_string
-#undef hid_get_indexed_string
-#undef hid_error
-#undef new_hid_device
-#undef free_hid_device
+#undef hid_init
+#undef hid_open
+#undef hid_open_path
+#undef hid_read
+#undef hid_read_timeout
+#undef hid_send_feature_report
+#undef hid_set_nonblocking
+#undef hid_write
#undef input_report
-#undef return_data
#undef make_path
+#undef new_hid_device
#undef read_thread
+#undef return_data
#endif /* HAVE_LIBUSB */
@@ -995,7 +1045,7 @@ DeleteHIDDeviceWrapper(SDL_hid_device *device)
}
static void
-CopyHIDDeviceInfo(struct SDL_hid_device_info *pSrc, struct SDL_hid_device_info *pDst)
+CopyHIDDeviceInfo(struct hid_device_info *pSrc, struct SDL_hid_device_info *pDst)
{
COPY_IF_EXISTS(path)
pDst->vendor_id = pSrc->vendor_id;
@@ -1007,9 +1057,9 @@ CopyHIDDeviceInfo(struct SDL_hid_device_info *pSrc, struct SDL_hid_device_info *
pDst->usage_page = pSrc->usage_page;
pDst->usage = pSrc->usage;
pDst->interface_number = pSrc->interface_number;
- pDst->interface_class = pSrc->interface_class;
- pDst->interface_subclass = pSrc->interface_subclass;
- pDst->interface_protocol = pSrc->interface_protocol;
+ //pDst->interface_class = pSrc->interface_class;
+ //pDst->interface_subclass = pSrc->interface_subclass;
+ //pDst->interface_protocol = pSrc->interface_protocol;
pDst->next = NULL;
}
@@ -1089,9 +1139,12 @@ int SDL_hid_init(void)
LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device *, uint8_t, struct libusb_config_descriptor **), get_config_descriptor)
LOAD_LIBUSB_SYMBOL(void (LIBUSB_CALL *)(struct libusb_config_descriptor *), free_config_descriptor)
LOAD_LIBUSB_SYMBOL(uint8_t (LIBUSB_CALL *)(libusb_device *), get_bus_number)
+ LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device *dev, uint8_t *port_numbers, int port_numbers_len), get_port_numbers)
LOAD_LIBUSB_SYMBOL(uint8_t (LIBUSB_CALL *)(libusb_device *), get_device_address)
+ LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_context *ctx, intptr_t sys_dev, libusb_device_handle **dev_handle), wrap_sys_device)
LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device *, libusb_device_handle **), open)
LOAD_LIBUSB_SYMBOL(void (LIBUSB_CALL *)(libusb_device_handle *), close)
+ LOAD_LIBUSB_SYMBOL(libusb_device * (LIBUSB_CALL *)(libusb_device_handle *dev_handle), get_device)
LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device_handle *, int), claim_interface)
LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device_handle *, int), release_interface)
LOAD_LIBUSB_SYMBOL(int (LIBUSB_CALL *)(libusb_device_handle *, int), kernel_driver_active)
@@ -1210,16 +1263,16 @@ struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned
{
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
#ifdef HAVE_LIBUSB
- struct SDL_hid_device_info *usb_devs = NULL;
- struct SDL_hid_device_info *usb_dev;
+ struct hid_device_info *usb_devs = NULL;
+ struct hid_device_info *usb_dev;
#endif
#ifdef HAVE_DRIVER_BACKEND
- struct SDL_hid_device_info *driver_devs = NULL;
- struct SDL_hid_device_info *driver_dev;
+ struct hid_device_info *driver_devs = NULL;
+ struct hid_device_info *driver_dev;
#endif
#ifdef HAVE_PLATFORM_BACKEND
- struct SDL_hid_device_info *raw_devs = NULL;
- struct SDL_hid_device_info *raw_dev;
+ struct hid_device_info *raw_devs = NULL;
+ struct hid_device_info *raw_dev;
#endif
struct SDL_hid_device_info *devs = NULL, *last = NULL, *new_dev;
@@ -1409,7 +1462,7 @@ SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */
#ifdef HAVE_PLATFORM_BACKEND
if (udev_ctx) {
- pDevice = PLATFORM_hid_open_path(path, bExclusive);
+ pDevice = PLATFORM_hid_open_path(path);
if (pDevice != NULL) {
return CreateHIDDeviceWrapper(pDevice, &PLATFORM_Backend);
}
@@ -1417,7 +1470,7 @@ SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */
#endif /* HAVE_PLATFORM_BACKEND */
#ifdef HAVE_DRIVER_BACKEND
- pDevice = DRIVER_hid_open_path(path, bExclusive);
+ pDevice = DRIVER_hid_open_path(path);
if (pDevice != NULL) {
return CreateHIDDeviceWrapper(pDevice, &DRIVER_Backend);
}
@@ -1425,7 +1478,7 @@ SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */
#ifdef HAVE_LIBUSB
if (libusb_ctx.libhandle != NULL) {
- pDevice = LIBUSB_hid_open_path(path, bExclusive);
+ pDevice = LIBUSB_hid_open_path(path);
if (pDevice != NULL) {
return CreateHIDDeviceWrapper(pDevice, &LIBUSB_Backend);
}