// Thanks to Jonathan for this
// Needs CoreFoundation and IOKit
// http://forums3.armagetronad.net/viewtopic.php?f=12&t=3364&sid=0c0b3d98e3a999f1bcaf6aa519231917&start=15

#include <stdio.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)
{
	const int32_t accel = -0x10000;
	io_connect_t handle = NXOpenEventStatus();

	const char *name = strrchr(argv[0], '/');
	if (name)
		++name;				// one past the last slash
	else
		name = argv[0];		// no slashes, just eat it whole

	if (!handle)
	{
		fprintf(stderr, "NXOpenEventStatus is uncooperative\n");
	} else
	{
		kern_return_t ret;
		if (strcasestr(name, "mouse"))
		{
			ret = IOHIDSetParameter(handle, CFSTR(kIOHIDMouseAccelerationType), &accel, sizeof accel);
			if (ret != KERN_SUCCESS)	fprintf(stderr, "Error fixing mouse: %d\n", (int)ret);
		}

		if (strcasestr(name, "trackpad"))
		{
			ret = IOHIDSetParameter(handle, CFSTR(kIOHIDTrackpadAccelerationType), &accel, sizeof accel);
			if (ret != KERN_SUCCESS)	fprintf(stderr, "Error fixing trackpad: %d\n", (int)ret);
		}
		NXCloseEventStatus(handle);
	}

	return 0;
}