2525#include <IOKit/hid/IOHIDManager.h>
2626#include <IOKit/hid/IOHIDKeys.h>
2727#include <IOKit/IOKitLib.h>
28+ #include <IOKit/usb/USBSpec.h>
2829#include <CoreFoundation/CoreFoundation.h>
2930#include <wchar.h>
3031#include <locale.h>
@@ -432,6 +433,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
432433 if ((vendor_id == 0x0 || vendor_id == dev_vid ) &&
433434 (product_id == 0x0 || product_id == dev_pid )) {
434435 struct hid_device_info * tmp ;
436+ bool is_usb_hid ; /* Is this an actual HID usb device */
435437 io_object_t iokit_dev ;
436438 kern_return_t res ;
437439 io_string_t path ;
@@ -446,6 +448,8 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
446448 }
447449 cur_dev = tmp ;
448450
451+ is_usb_hid = get_int_property (dev , CFSTR (kUSBInterfaceClass )) == kUSBHIDClass ;
452+
449453 /* Get the Usage Page and Usage for this device. */
450454 cur_dev -> usage_page = get_int_property (dev , CFSTR (kIOHIDPrimaryUsagePageKey ));
451455 cur_dev -> usage = get_int_property (dev , CFSTR (kIOHIDPrimaryUsageKey ));
@@ -479,7 +483,16 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
479483 cur_dev -> release_number = get_int_property (dev , CFSTR (kIOHIDVersionNumberKey ));
480484
481485 /* Interface Number (Unsupported on Mac)*/
482- cur_dev -> interface_number = -1 ;
486+
487+ /* We can only retrieve the interface number for USB HID devices.
488+ * IOKit always seems to return 0 when querying a standard USB device
489+ * for its interface. */
490+ if (is_usb_hid ) {
491+ /* Get the interface number */
492+ cur_dev -> interface_number = get_int_property (dev , CFSTR (kUSBInterfaceNumber ));
493+ } else {
494+ cur_dev -> interface_number = -1 ;
495+ }
483496 }
484497 }
485498
0 commit comments