#include <unistd.h>
#include <sys/types.h>
#include <CoreFoundation/CoreFoundation.h>
#include <libkern/OSByteOrder.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/hidsystem/IOHIDLib.h>
#include <IOKit/hid/IOHIDLibPrivate.h>
#include <IOKit/pwr_mgt/IOPMLibPrivate.h>
#include <servers/bootstrap.h>
#include "powermanagement.h"
#if !TARGET_OS_EMBEDDED
kern_return_t IOFramebufferServerStart( void );
#endif
kern_return_t
IOHIDCreateSharedMemory( io_connect_t connect,
unsigned int version )
{
#if !TARGET_OS_EMBEDDED
IOFramebufferServerStart();
#endif
uint64_t inData = version;
return IOConnectCallMethod( connect, 0, &inData, 1, NULL, 0, NULL, NULL, NULL, NULL); }
kern_return_t
IOHIDSetEventsEnable( io_connect_t connect,
boolean_t enable )
{
uint64_t inData = enable;
return IOConnectCallMethod( connect, 1, &inData, 1, NULL, 0, NULL, NULL, NULL, NULL); }
kern_return_t
IOHIDSetCursorEnable( io_connect_t connect,
boolean_t enable )
{
uint64_t inData = enable;
return IOConnectCallMethod( connect, 2, &inData, 1, NULL, 0, NULL, NULL, NULL, NULL); }
static void _IOPMReportSoftwareHIDEvent(UInt32 eventType)
{
mach_port_t newConnection;
kern_return_t kern_result = KERN_SUCCESS;
kern_result = bootstrap_look_up(bootstrap_port,
kIOPMServerBootstrapName, &newConnection);
if(KERN_SUCCESS == kern_result) {
io_pm_hid_event_report_activity(newConnection, eventType);
mach_port_deallocate(mach_task_self(), newConnection);
}
return;
}
kern_return_t
IOHIDPostEvent( io_connect_t connect,
UInt32 eventType,
IOGPoint location,
const NXEventData * eventData,
UInt32 eventDataVersion,
IOOptionBits eventFlags,
IOOptionBits options )
{
int * eventPid = 0;
size_t 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) );
_IOPMReportSoftwareHIDEvent(event->type);
return IOConnectCallMethod(connect, 3, NULL, 0, data, dataSize, NULL, NULL, NULL, NULL); }
extern kern_return_t
IOHIDSetCursorBounds( io_connect_t connect, const IOGBounds * bounds )
{
if ( !bounds )
return kIOReturnBadArgument;
return IOConnectCallMethod(connect, 6, NULL, 0, bounds, sizeof(*bounds), NULL, NULL, NULL, NULL); }
kern_return_t
IOHIDSetMouseLocation( io_connect_t connect, int x, int y )
{
return IOHIDSetFixedMouseLocation(connect, x << 8, y << 8);
}
kern_return_t
IOHIDSetFixedMouseLocation( io_connect_t connect, int32_t x, int32_t y )
{
int32_t data[3] = {x, y, 0};
data[2] = getpid();
return IOConnectCallMethod(connect, 4, NULL, 0, data, sizeof(data), NULL, NULL, NULL, NULL); }
kern_return_t
IOHIDGetButtonEventNum( io_connect_t connect,
NXMouseButton button, int * eventNum )
{
kern_return_t err;
uint64_t inData = button;
uint64_t outData;
uint32_t outSize = 1;
err = IOConnectCallMethod(connect, 5, &inData, 1, NULL, 0, &outData, &outSize, NULL, NULL); *eventNum = (int) outData;
return( err);
}
kern_return_t
IOHIDGetModifierLockState( io_connect_t handle, int selector, bool *state )
{
kern_return_t err;
uint64_t inData[1] = {selector};
uint64_t outData[1] = {0};
uint32_t outCount = 1;
err = IOConnectCallMethod(handle, 5, inData, 1, NULL, 0, outData, &outCount, NULL, NULL);
*state = outData[0];
return err;
}
kern_return_t
IOHIDSetModifierLockState( io_connect_t handle, int selector, bool state )
{
kern_return_t err;
uint64_t inData[2] = {selector, state};
uint32_t outCount = 0;
err = IOConnectCallMethod(handle, 6, inData, 2, NULL, 0, NULL, &outCount, NULL, NULL);
return err;
}