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 printNXEventInfo (IOHIDEventRef event) { CFIndex usage = IOHIDEventGetIntegerValue(event, kIOHIDEventFieldVendorDefinedUsage); if (__nxUsageMask & (1 << usage)) { NXEvent *nxEvent = NULL; CFIndex nxEventLength = 0; IOHIDEventGetVendorDefinedData (event, (uint8_t**)&nxEvent, &nxEventLength); if (nxEvent && (nxEventLength == sizeof(NXEvent) || nxEventLength == sizeof(NXEventExt))) { if (__nxTypeMask & (1 << nxEvent->type)) { CFStringRef nxEventDescription; if (nxEventLength == sizeof(NXEventExt)) { nxEventDescription = NxEventExtCreateDescription (nxEvent); } else { nxEventDescription = NxEventCreateDescription (nxEvent); } printf("[NXEvent Dispatch Type: %s]\n%s", (usage == kHIDUsage_AppleVendor_NXEvent) ? "Kernel" : ( (usage == kHIDUsage_AppleVendor_NXEvent_Translated) ? "Translated" : "Diagnostic"), CFStringGetCStringPtr(nxEventDescription, kCFStringEncodingMacRoman) ); CFRelease(nxEventDescription); } } else { printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("ERROR!!! NXEventData %p, nxEventLength = 0x%lx (expected length 0x%lx)\n", nxEvent, nxEventLength, sizeof(NXEvent)); printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); } } }
static bool button_pressed(void *event_system, uint32_t usage_page, uint32_t usage) { /* This magic comes straight from Substrate... I don't really understand * what it's doing. In particular, where is the equivalent kernel * implementation on OS X? Does it not exist? But I guess Substrate is * emulating backboardd. */ void *dummy = IOHIDEventCreateKeyboardEvent(NULL, mach_absolute_time(), usage_page, usage, 0, 0); if (!dummy) { ib_log("couldn't create dummy HID event"); return false; } void *event = IOHIDEventSystemCopyEvent(event_system, kIOHIDEventTypeKeyboard, dummy, 0); if (!event) return false; CFIndex ival = IOHIDEventGetIntegerValue(event, kIOHIDEventFieldKeyboardDown); return ival; }