|
@@ -37,6 +37,9 @@
|
|
|
|
|
|
#define VALVE_USB_VID 0x28DE
|
|
|
|
|
|
+/* As defined in AppKit.h, but we don't need the entire AppKit for a single constant. */
|
|
|
+extern const double NSAppKitVersionNumber;
|
|
|
+
|
|
|
/* Barrier implementation because Mac OSX doesn't have pthread_barrier.
|
|
|
It also doesn't have clock_gettime(). So much for POSIX and SUSv2.
|
|
|
This implementation came from Brent Priddy and was posted on
|
|
@@ -131,6 +134,7 @@ struct hid_device_list_node
|
|
|
};
|
|
|
|
|
|
static IOHIDManagerRef hid_mgr = 0x0;
|
|
|
+static int is_macos_10_10_or_greater = 0;
|
|
|
static struct hid_device_list_node *device_list = 0x0;
|
|
|
|
|
|
static hid_device *new_hid_device(void)
|
|
@@ -485,6 +489,7 @@ static int init_hid_manager(void)
|
|
|
int HID_API_EXPORT hid_init(void)
|
|
|
{
|
|
|
if (!hid_mgr) {
|
|
|
+ is_macos_10_10_or_greater = (NSAppKitVersionNumber >= 1343); /* NSAppKitVersionNumber10_10 */
|
|
|
return init_hid_manager();
|
|
|
}
|
|
|
|
|
@@ -1138,8 +1143,10 @@ void HID_API_EXPORT hid_close(hid_device *dev)
|
|
|
if (!dev)
|
|
|
return;
|
|
|
|
|
|
- /* Disconnect the report callback before close. */
|
|
|
- if (!dev->disconnected) {
|
|
|
+ /* Disconnect the report callback before close.
|
|
|
+ See comment below.
|
|
|
+ */
|
|
|
+ if (is_macos_10_10_or_greater || !dev->disconnected) {
|
|
|
IOHIDDeviceRegisterInputReportCallback(
|
|
|
dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
|
|
|
NULL, dev);
|
|
@@ -1162,8 +1169,14 @@ void HID_API_EXPORT hid_close(hid_device *dev)
|
|
|
|
|
|
/* Close the OS handle to the device, but only if it's not
|
|
|
been unplugged. If it's been unplugged, then calling
|
|
|
- IOHIDDeviceClose() will crash. */
|
|
|
- if (!dev->disconnected) {
|
|
|
+ IOHIDDeviceClose() will crash.
|
|
|
+
|
|
|
+ UPD: The crash part was true in/until some version of macOS.
|
|
|
+ Starting with macOS 10.15, there is an opposite effect in some environments:
|
|
|
+ crash happenes if IOHIDDeviceClose() is not called.
|
|
|
+ Not leaking a resource in all tested environments.
|
|
|
+ */
|
|
|
+ if (is_macos_10_10_or_greater || !dev->disconnected) {
|
|
|
IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
|
|
|
}
|
|
|
|