Soy un principiante en programación en mac os x.
Estoy siguiendo este tutorial .
Y tengo este programa:
#include <stdio.h>
#include <IOKit/hid/IOHIDManager.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
static void Handle_DeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef)
{
puts("YAY Handle_DeviceMatchingCallback");
}
static void Handle_DeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef)
{
puts("YAY Handle_DeviceRemovalCallback");
}
int main()
{
IOHIDManagerRef HIDManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
IOHIDManagerSetDeviceMatching(HIDManager, NULL);
IOHIDManagerRegisterDeviceMatchingCallback(HIDManager, &Handle_DeviceMatchingCallback, NULL);
IOHIDManagerRegisterDeviceRemovalCallback(HIDManager, &Handle_DeviceRemovalCallback, NULL);
IOHIDManagerScheduleWithRunLoop(HIDManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
IOReturn IOReturn = IOHIDManagerOpen(HIDManager, kIOHIDOptionsTypeNone);
if(IOReturn) puts("IOHIDManagerOpen failed.");
while(1)
{
puts("sleeping...");
sleep(1);
}
return 0;
}
Lo que estoy haciendo mal, porque no recibo las devoluciones de llamada cuando inserto o elimino cualquier dispositivo oculto en el puerto USB.
RunLoop
lugar dewhile
en la función principal. use por ejemplo:CFRunLoopRun()
para esto.Respuestas:
IOHIDManagerScheduleWithRunLoop
está conectado aRunLoop
, por lo que debe comenzar uno.while
Loop no es la solución aquí. Entonces, para obtener devoluciones de llamada, debe reemplazar elwhile
bucle con laCFRunLoopRun()
llamada. Más información sobre RunLoops en la documentación .fuente