Can do via IOHID directly:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <IOKit/hidsystem/IOHIDLib.h>
#include <IOKit/hidsystem/IOHIDParameter.h>
#include <IOKit/hidsystem/event_status_driver.h>
int main(int argc, char *argv[]) {
io_connect_t handle = NXOpenEventStatus();
if (!handle) {
printf("NXOpenEventStatus failed!\n");
return 0;
}
int64_t currentButtonStatus = 0;
kern_return_t ret;
IOByteCount actualSize;
ret = IOHIDGetParameter(handle, CFSTR(kIOHIDPointerButtonMode),
sizeof(currentButtonStatus), ¤tButtonStatus, &actualSize);
if (ret != KERN_SUCCESS) {
printf("IOHIDGetParameter failed! Error %d.\n", (int)ret);
}
else if (actualSize != sizeof(currentButtonStatus)) {
printf("IOHIDGetParameter returned unexpected actualSize! (Got %d)\n", (int)actualSize);
}
else if (ret == KERN_SUCCESS) {
int64_t newButtonStatus = 3 - currentButtonStatus;
ret = IOHIDSetParameter(handle, CFSTR(kIOHIDPointerButtonMode), &newButtonStatus, sizeof(newButtonStatus));
if (ret != KERN_SUCCESS) {
printf("IOHIDSetParameter failed! Error %d. (Current status = %d)\n", (int)ret, currentButtonStatus);
}
else {
printf("success. Was %d, now %d.\n", currentButtonStatus, newButtonStatus);
}
}
NXCloseEventStatus(handle);
return 0;
}