static boolean_t eventCallback(void * target, void * refcon, void * sender, IOHIDEventRef event) { __eventCount++; __eventCounts[IOHIDEventGetType(event)]++; __eventLatencyTotal += IOHIDEventGetLatency(event, kMicrosecondScale); if ( ((1<<IOHIDEventGetType(event)) & __eventMask) != 0 ) { CFStringRef outputString = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%@\n"), event); if ( outputString ) { printf("%s", CFStringGetCStringPtr(outputString, kCFStringEncodingMacRoman)); CFRelease(outputString); } } return false; }
boolean_t isNXEvent (IOHIDEventRef event) { CFIndex usage = IOHIDEventGetIntegerValue(event, kIOHIDEventFieldVendorDefinedUsage); if (IOHIDEventGetType(event) == kIOHIDEventTypeVendorDefined && IOHIDEventGetIntegerValue(event, kIOHIDEventFieldVendorDefinedUsagePage) == kHIDPage_AppleVendor && (usage == kHIDUsage_AppleVendor_NXEvent || usage == kHIDUsage_AppleVendor_NXEvent_Translated || usage == kHIDUsage_AppleVendor_NXEvent_Diagnostic)) { return true; } return false; }
void printNXEvents (IOHIDEventRef event) { if (isNXEvent (event)) { printNXEventInfo (event); } CFArrayRef childrens = IOHIDEventGetChildren (event); for (CFIndex index = 0 , count = childrens ? CFArrayGetCount(childrens) : 0 ; index < count ; index++) { IOHIDEventRef child = (IOHIDEventRef)CFArrayGetValueAtIndex(childrens, index); if (isNXEvent (child)) { printNXEventInfo (child); } } } IOHIDEventBlock eventBlock = ^(void * target __unused, void * refcon, void * sender __unused, IOHIDEventRef event) { IOHIDEventType type = IOHIDEventGetType(event); uint64_t timestamp = IOHIDEventGetTimeStamp(event); uint64_t interval = 0; // RY: This should really be tracked per service, but I'm lazy __eventCount++; __eventCounts[type]++; __eventLatencyTotal += IOHIDEventGetLatency(event, kMicrosecondScale); if ( __eventLastTimestamps[type] ) { CFNumberRef number = NULL; interval = timestamp - __eventLastTimestamps[type]; interval *= __timeBaseinfo.numer;