#include <System/libkern/OSCrossEndian.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/hidsystem/IOHIDLib.h>
#include <IOKit/iokitmig.h>
#include <sys/types.h>
#include <unistd.h>
kern_return_t
IOFramebufferServerStart( void );
kern_return_t
IOHIDCreateSharedMemory( io_connect_t connect,
unsigned int version )
{
kern_return_t err;
unsigned int len;
IOFramebufferServerStart();
len = 0;
err = io_connect_method_scalarI_scalarO( connect, 0,
&version, 1, NULL, &len);
return( err);
}
kern_return_t
IOHIDSetEventsEnable( io_connect_t connect,
boolean_t enable )
{
kern_return_t err;
unsigned int len;
len = 0;
err = io_connect_method_scalarI_scalarO( connect, 1,
&enable, 1, NULL, &len);
return( err);
}
kern_return_t
IOHIDSetCursorEnable( io_connect_t connect,
boolean_t enable )
{
kern_return_t err;
unsigned int len;
len = 0;
err = io_connect_method_scalarI_scalarO( connect, 2,
&enable, 1, NULL, &len);
return( err);
}
kern_return_t
IOHIDPostEvent( io_connect_t connect,
UInt32 eventType,
IOGPoint location,
const NXEventData * eventData,
UInt32 eventDataVersion,
IOOptionBits eventFlags,
IOOptionBits options )
{
kern_return_t err;
unsigned int len;
int * eventPid = 0;
int dataSize = sizeof(struct evioLLEvent) + sizeof(int);
char data[dataSize];
struct evioLLEvent* event;
UInt32 eventDataSize = sizeof(NXEventData);
bzero(data, dataSize);
event = (struct evioLLEvent*)data;
event->type = eventType;
event->location = location;
event->flags = eventFlags;
event->setFlags = options;
event->setCursor = options & (kIOHIDSetCursorPosition | kIOHIDSetRelativeCursorPosition);
eventPid = (int *)(event + 1);
*eventPid = getpid();
if ( eventDataVersion < 2 )
{
eventDataSize = 32;
event->setCursor = eventDataVersion; }
if ( eventDataSize < sizeof(event->data) )
{
bcopy( eventData, &(event->data), eventDataSize );
bzero( ((UInt8 *)(&(event->data))) + eventDataSize,
sizeof(event->data) - eventDataSize );
}
else
bcopy( eventData, &event->data, sizeof(event->data) );
len = 0;
err = io_connect_method_structureI_structureO(
connect,
3,
data,
dataSize,
NULL,
&len);
return (err);
}
extern kern_return_t
IOHIDSetCursorBounds( io_connect_t connect, const IOGBounds * bounds )
{
IOByteCount len = 0;
if ( !bounds )
return kIOReturnBadArgument;
return (IOConnectMethodStructureIStructureO( connect, 6,
sizeof( *bounds), &len,
bounds, NULL ));
}
kern_return_t
IOHIDSetMouseLocation( io_connect_t connect,
int x, int y)
{
kern_return_t err;
unsigned int len;
IOGPoint * loc;
int dataSize = sizeof(IOGPoint) + sizeof(int);
char data[dataSize];
int * eventPid = 0;
bzero(data, dataSize);
loc = (IOGPoint *)data;
loc->x = x;
loc->y = y;
eventPid = (int *)(loc + 1);
*eventPid = getpid();
len = 0;
err = io_connect_method_structureI_structureO( connect, 4,
data, dataSize, NULL, &len);
return( err);
}
kern_return_t
IOHIDGetButtonEventNum( io_connect_t connect,
NXMouseButton button, int * eventNum )
{
kern_return_t err;
unsigned int len;
len = 1;
err = io_connect_method_scalarI_scalarO( connect, 5,
(int *)&button, 1, (void *)eventNum, &len);
return( err);
}