#ifndef _IOHIDSYSTEM_H
#define _IOHIDSYSTEM_H
#include <TargetConditionals.h>
#include <IOKit/IOTimerEventSource.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOService.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOUserClient.h>
#include <IOKit/IOWorkLoop.h>
#include <IOKit/IOCommandGate.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include <IOKit/pwr_mgt/IOPM.h>
#if TARGET_OS_EMBEDDED
class IOGraphicsDevice;
#else
#include <IOKit/graphics/IOGraphicsDevice.h>
#endif
#include <IOKit/hidsystem/IOHIDevice.h>
#include <IOKit/hidsystem/IOHIDShared.h>
#include <IOKit/hidsystem/IOHIDTypes.h>
#include <IOKit/hidsystem/IOLLEvent.h>
#include <IOKit/IODataQueue.h>
#include <IOKit/hidsystem/ev_keymap.h>
#ifndef sub_iokit_hidsystem
#define sub_iokit_hidsystem err_sub(14)
#endif
#define kIOHIDSystem508MouseClickMessage iokit_family_msg(sub_iokit_hidsystem, 1)
#define kIOHIDSystemDeviceSeizeRequestMessage iokit_family_msg(sub_iokit_hidsystem, 2)
#define kIOHIDSystem508SpecialKeyDownMessage iokit_family_msg(sub_iokit_hidsystem, 3)
#define kIOHIDSystemActivityTickle iokit_family_msg(sub_iokit_hidsystem, 5)
class IOHIDKeyboardDevice;
class IOHIDPointingDevice;
class IOHIDEvent;
class IOFixedPoint64;
class IOHIDSystem : public IOService
{
OSDeclareDefaultStructors(IOHIDSystem);
friend class IOHIDUserClient;
friend class IOHIDParamUserClient;
friend class IOHIDEventSystemUserClient;
private:
IOWorkLoop * workLoop;
IOTimerEventSource * timerES;
IOTimerEventSource * vblES;
IOInterruptEventSource * eventConsumerES;
IOInterruptEventSource * keyboardEQES;
IOCommandGate * cmdGate;
IOUserClient * serverConnect;
IOUserClient * paramConnect;
IONotifier * eventPublishNotify;
IONotifier * eventTerminateNotify;
IONotifier * publishNotify;
IONotifier * terminateNotify;
OSArray * ioHIDevices;
OSSet * touchEventPosters;
mach_port_t eventPort; mach_port_t stackShotPort;
mach_port_t _specialKeyPort[NX_NUM_SCANNED_SPECIALKEYS]; void *eventMsg; void *stackShotMsg;
IOBufferMemoryDescriptor * globalMemory;
uintptr_t shmem_addr; vm_size_t shmem_size;
volatile void *evs; volatile EvGlobals *evg; int lleqSize;
vm_size_t evScreenSize; void *evScreen; volatile void *lastShmemPtr; int screens; UInt32 cursorScreens; UInt32 cursorPinScreen; IOGBounds cursorPin; IOGBounds workSpace; struct ExpansionData;
union {
struct {
IOGPoint for_spacing_only[2];
} reserved;
ExpansionData *_privateData;
};
IOGPoint clickLoc; IOGPoint clickSpaceThresh;
int clickState;
bool evOpenCalled; bool evInitialized; bool evStateChanging; bool eventsOpen; bool cursorStarted; bool cursorEnabled; bool cursorCoupled; bool cursorPinned;
short leftENum; short rightENum;
AbsoluteTime thisPeriodicRun;
AbsoluteTime periodicEventDelta; AbsoluteTime clickTime; AbsoluteTime clickTimeThresh;
AbsoluteTime waitSustain; AbsoluteTime waitSusTime; AbsoluteTime waitFrameRate; AbsoluteTime waitFrameTime;
AbsoluteTime lastRelativeEventTime; AbsoluteTime lastRelativeMoveTime;
AbsoluteTime lastEventTime;
AbsoluteTime lastUndimEvent;
SInt32 reserved2[4];
bool needSetCursorPosition;
bool needToKickEventConsumer;
IOService * displayManager; IOPMPowerFlags displayState;
IOService * rootDomain;
AbsoluteTime rootDomainStateChangeDeadline;
AbsoluteTime displayStateChangeDeadline;
AbsoluteTime displaySleepWakeupDeadline;
bool displaySleepDrivenByPM;
OSDictionary * savedParameters;
const char * registryName; UInt32 maxWaitCursorFrame; UInt32 firstWaitCursorFrame;
int cachedEventFlags;
OSArray * cachedButtonStates;
OSArray * systemInfo;
IOHIDPointingDevice * _hidPointingDevice;
IOHIDKeyboardDevice * _hidKeyboardDevice;
OSArray * consumedKeys;
OSObject * lastSender;
UInt32 scrollZoomMask;
bool setParamPropertiesInProgress;
OSSet * dataQueueSet;
private:
void vblEvent(void);
UInt8 getSubtypeForSender(OSObject * sender);
void updateMouseEventForSender(OSObject * sender, NXEventData * evData);
void updateMouseMoveEventForSender(OSObject * sender, NXEventData * evData);
void updateScrollEventForSender(OSObject * sender, NXEventData * evData);
static void _vblEvent(OSObject *self, IOTimerEventSource *sender);
inline short getUniqueEventNum();
virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags, unsigned long, IOService * );
static IOReturn powerStateHandler( void *target, void *refCon,
UInt32 messageType, IOService *service, void *messageArgument, vm_size_t argSize );
void _resetMouseParameters();
void _setScrollCountParameters(OSDictionary *newSettings = NULL);
void initShmem(bool clean);
void postEvent( int what,
IOFixedPoint64 * location,
AbsoluteTime ts,
NXEventData * myData,
OSObject * sender = 0,
UInt32 extPID = 0,
bool processKEQ = true);
void evDispatch(
EvCmd evcmd);
void evSpecialKeyMsg(unsigned key,
unsigned dir,
unsigned f,
unsigned l);
void kickEventConsumer();
void sendStackShotMessage(UInt32 flavor);
OSDictionary * createFilteredParamPropertiesForService(IOService * service, OSDictionary * dict);
static void _periodicEvents(IOHIDSystem * self,
IOTimerEventSource *timer);
static void doSpecialKeyMsg(IOHIDSystem * self,
struct evioSpecialKeyMsg *msg);
static void doKickEventConsumer(IOHIDSystem * self);
static void doProcessKeyboardEQ(IOHIDSystem * self);
static void processKeyboardEQ(IOHIDSystem * self, AbsoluteTime * deadline = 0);
static bool genericNotificationHandler( void * target,
void * ref, IOService * newService, IONotifier * notifier );
static bool handlePublishNotification( void * target, IOService * newService );
static bool handleTerminateNotification( void * target, IOService * service );
static void makeNumberParamProperty( OSDictionary * dict, const char * key,
unsigned long long number, unsigned int bits );
static void makeInt32ArrayParamProperty( OSDictionary * dict, const char * key,
UInt32 * array, unsigned int count );
private:
void scheduleNextPeriodicEvent();
void periodicEvents(IOTimerEventSource *timer);
bool startCursor();
bool resetCursor();
void showWaitCursor();
void hideWaitCursor();
void animateWaitCursor();
void changeCursor(int frame);
int pointToScreen(IOGPoint * p);
inline void showCursor();
inline void hideCursor();
inline void moveCursor();
void attachDefaultEventSources();
void detachEventSources();
bool registerEventSource(IOService * source);
void setCursorPosition(IOGPoint * newLoc, bool external, OSObject * sender=0);
void _setButtonState(int buttons,
AbsoluteTime ts,
OSObject * sender);
void _setCursorPosition(bool external = false, bool proximityChange = false, OSObject * sender=0);
static bool _idleTimeSerializerCallback(void * target, void * ref, OSSerialize *s);
void _postMouseMoveEvent(int what,
AbsoluteTime theClock,
OSObject * sender);
void createParameters( void );
public:
static IOHIDSystem * instance();
static void scaleLocationToCurrentScreen(IOGPoint *location, IOGBounds *bounds);
virtual bool init(OSDictionary * properties = 0);
virtual IOHIDSystem * probe(IOService * provider,
SInt32 * score);
virtual bool start(IOService * provider);
virtual IOReturn message(UInt32 type, IOService * provider,
void * argument);
virtual void free();
virtual bool attach( IOService * provider );
virtual void detach( IOService * provider );
virtual IOWorkLoop *getWorkLoop() const;
virtual IOReturn evOpen(void);
virtual IOReturn evClose(void);
virtual IOReturn setProperties( OSObject * properties );
virtual IOReturn setParamProperties(OSDictionary * dict);
virtual IOReturn createShmem(void*,void*,void*,void*,void*,void*);
virtual IOReturn registerEventQueue(IODataQueue * queue);
virtual IOReturn unregisterEventQueue(IODataQueue * queue);
virtual void setEventPort(mach_port_t port);
void setDisplaySleepDrivenByPM(bool val);
private:
static IOReturn doSetEventPort(IOHIDSystem *self, void *port_void, void *arg1, void *arg2, void *arg3);
void setEventPortGated(mach_port_t port);
public:
virtual IOReturn setSpecialKeyPort(
int special_key,
mach_port_t key_port);
virtual mach_port_t specialKeyPort(int special_key);
virtual IOReturn newUserClient(task_t owningTask,
void * security_id,
UInt32 type,
OSDictionary * properties,
IOUserClient ** handler);
public:
virtual void relativePointerEvent(int buttons,
int dx,
int dy,
AbsoluteTime ts);
virtual void absolutePointerEvent(int buttons,
IOGPoint * newLoc,
IOGBounds *bounds,
bool proximity,
int pressure,
int stylusAngle,
AbsoluteTime ts);
virtual void scrollWheelEvent(short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
AbsoluteTime ts);
virtual void tabletEvent(NXEventData *tabletData,
AbsoluteTime ts);
virtual void proximityEvent(NXEventData *proximityData,
AbsoluteTime ts);
public:
virtual void keyboardEvent(unsigned eventType,
unsigned flags,
unsigned key,
unsigned charCode,
unsigned charSet,
unsigned origCharCode,
unsigned origCharSet,
unsigned keyboardType,
bool repeat,
AbsoluteTime ts);
virtual void keyboardSpecialEvent( unsigned eventType,
unsigned flags,
unsigned key,
unsigned flavor,
UInt64 guid,
bool repeat,
AbsoluteTime ts);
virtual void updateEventFlags(unsigned flags);
private:
void _scaleLocationToCurrentScreen(IOFixedPoint64 &location, IOGBounds *bounds);
static void _relativePointerEvent(IOHIDSystem * self,
int buttons,
int dx,
int dy,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _absolutePointerEvent(IOHIDSystem * self,
int buttons,
IOGPoint * newLoc,
IOGBounds *bounds,
bool proximity,
int pressure,
int stylusAngle,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _scrollWheelEvent( IOHIDSystem *self,
short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
IOFixed fixedDelta1,
IOFixed fixedDelta2,
IOFixed fixedDelta3,
SInt32 pointDeltaAxis1,
SInt32 pointDeltaAxis2,
SInt32 pointDeltaAxis3,
UInt32 options,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _tabletEvent( IOHIDSystem *self,
NXEventData *tabletData,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _proximityEvent( IOHIDSystem *self,
NXEventData *proximityData,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _keyboardEvent( IOHIDSystem * self,
unsigned eventType,
unsigned flags,
unsigned key,
unsigned charCode,
unsigned charSet,
unsigned origCharCode,
unsigned origCharSet,
unsigned keyboardType,
bool repeat,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _keyboardSpecialEvent(IOHIDSystem * self,
unsigned eventType,
unsigned flags,
unsigned key,
unsigned flavor,
UInt64 guid,
bool repeat,
AbsoluteTime ts,
OSObject * sender,
void * refcon);
static void _updateEventFlags( IOHIDSystem * self,
unsigned flags,
OSObject * sender,
void * refcon);
public:
virtual IOReturn setEventsEnable(void*,void*,void*,void*,void*,void*);
virtual IOReturn setCursorEnable(void*,void*,void*,void*,void*,void*);
virtual IOReturn extPostEvent(void*,void*,void*,void*,void*,void*);
virtual IOReturn extSetMouseLocation(void*,void*,void*,void*,void*,void*);
virtual IOReturn extGetButtonEventNum(void*,void*,void*,void*,void*,void*);
IOReturn extSetBounds( IOGBounds * bounds );
IOReturn extGetModifierLockState(void*,void*,void*,void*,void*,void*);
IOReturn extSetModifierLockState(void*,void*,void*,void*,void*,void*);
IOReturn extRegisterVirtualDisplay(void*,void*,void*,void*,void*,void*);
IOReturn extUnregisterVirtualDisplay(void*,void*,void*,void*,void*,void*);
IOReturn extSetVirtualDisplayBounds(void*,void*,void*,void*,void*,void*);
public:
virtual int registerScreen(IOGraphicsDevice * instance,
IOGBounds * bp,
IOGBounds * vbp);
private:
static IOReturn doRegisterScreen(IOHIDSystem *self, IOGraphicsDevice *io_gd, IOGBounds *bp, IOGBounds * vbp, void *arg3);
IOReturn registerScreenGated(IOGraphicsDevice *io_gd, IOGBounds *bp, IOGBounds * vbp, SInt32 *index);
public:
virtual void unregisterScreen(int index);
public:
virtual IOGBounds * workspaceBounds();
private:
void relativePointerEvent( int buttons,
int dx,
int dy,
AbsoluteTime ts,
OSObject * sender);
void absolutePointerEvent( int buttons,
IOGPoint * newLoc,
IOGBounds *bounds,
bool proximity,
int pressure,
int stylusAngle,
AbsoluteTime ts,
OSObject * sender);
void scrollWheelEvent( short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
IOFixed fixedDelta1,
IOFixed fixedDelta2,
IOFixed fixedDelta3,
SInt32 pointDeltaAxis1,
SInt32 pointDeltaAxis2,
SInt32 pointDeltaAxis3,
UInt32 options,
AbsoluteTime ts,
OSObject * sender);
void tabletEvent( NXEventData * tabletData,
AbsoluteTime ts,
OSObject * sender);
void proximityEvent( NXEventData * proximityData,
AbsoluteTime ts,
OSObject * sender);
void keyboardEvent(unsigned eventType,
unsigned flags,
unsigned key,
unsigned charCode,
unsigned charSet,
unsigned origCharCode,
unsigned origCharSet,
unsigned keyboardType,
bool repeat,
AbsoluteTime ts,
OSObject * sender);
void keyboardSpecialEvent( unsigned eventType,
unsigned flags,
unsigned key,
unsigned flavor,
UInt64 guid,
bool repeat,
AbsoluteTime ts,
OSObject * sender);
void updateEventFlags(unsigned flags, OSObject * sender);
bool addConsumedKey(unsigned key);
bool removeConsumedKey(unsigned key);
static IOReturn doEvClose (IOHIDSystem *self);
IOReturn evCloseGated (void);
static IOReturn doSetEventsEnablePre (IOHIDSystem *self, void *p1);
IOReturn setEventsEnablePreGated (void *p1);
static IOReturn doSetEventsEnablePost (IOHIDSystem *self, void *p1);
IOReturn setEventsEnablePostGated (void *p1);
static IOReturn doUnregisterScreen (IOHIDSystem *self, void * arg0, void *arg1);
IOReturn unregisterScreenGated (int index, bool internal);
static IOReturn doSetDisplayBounds (IOHIDSystem *self, void * arg0, void * arg1);
IOReturn setDisplayBoundsGated (UInt32 index, IOGBounds *bounds);
static IOReturn doCreateShmem (IOHIDSystem *self, void * arg0);
IOReturn createShmemGated (void * p1);
static IOReturn doRegisterEventQueue (IOHIDSystem *self, void * arg0);
IOReturn registerEventQueueGated (void * p1);
static IOReturn doUnregisterEventQueue (IOHIDSystem *self, void * arg0);
IOReturn unregisterEventQueueGated (void * p1);
static IOReturn doRelativePointerEvent (IOHIDSystem *self, void * args);
void relativePointerEventGated(int buttons,
int dx,
int dy,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doAbsolutePointerEvent (IOHIDSystem *self, void * args);
void absolutePointerEventGated (int buttons,
IOGPoint * newLoc,
IOGBounds *bounds,
bool proximity,
int pressure,
int stylusAngle,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doScrollWheelEvent(IOHIDSystem *self, void * args);
void scrollWheelEventGated (short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
IOFixed fixedDelta1,
IOFixed fixedDelta2,
IOFixed fixedDelta3,
SInt32 pointDeltaAxis1,
SInt32 pointDeltaAxis2,
SInt32 pointDeltaAxis3,
UInt32 options,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doTabletEvent (IOHIDSystem *self, void * arg0, void * arg1, void * arg2);
void tabletEventGated ( NXEventData *tabletData,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doProximityEvent (IOHIDSystem *self, void * arg0, void * arg1, void * arg2);
void proximityEventGated ( NXEventData *proximityData,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doKeyboardEvent (IOHIDSystem *self, void * args);
void keyboardEventGated (unsigned eventType,
unsigned flags,
unsigned key,
unsigned charCode,
unsigned charSet,
unsigned origCharCode,
unsigned origCharSet,
unsigned keyboardType,
bool repeat,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doKeyboardSpecialEvent (IOHIDSystem *self, void * args);
void keyboardSpecialEventGated (
unsigned eventType,
unsigned flags,
unsigned key,
unsigned flavor,
UInt64 guid,
bool repeat,
AbsoluteTime ts,
OSObject * sender);
static IOReturn doUpdateEventFlags (IOHIDSystem *self, void * args);
void updateEventFlagsGated (unsigned flags, OSObject * sender);
static IOReturn doNewUserClient (IOHIDSystem *self, void * args);
IOReturn newUserClientGated (task_t owningTask,
void * security_id,
UInt32 type,
OSDictionary * properties,
IOUserClient ** handler);
static IOReturn doSetCursorEnable (IOHIDSystem *self, void * arg0);
IOReturn setCursorEnableGated (void * p1);
static IOReturn doExtPostEvent(IOHIDSystem *self, void * arg0, void * arg1, void * arg2, void * arg3);
IOReturn extPostEventGated (void * p1, void * p2, void * p3);
static IOReturn doExtSetMouseLocation (IOHIDSystem *self, void * args);
IOReturn extSetMouseLocationGated (void * args);
static IOReturn doExtGetButtonEventNum (IOHIDSystem *self, void * arg0, void * arg1);
IOReturn extGetButtonEventNumGated (void * p1, void * p2);
static IOReturn doSetParamPropertiesPre (IOHIDSystem *self, void * arg0, void * arg1);
IOReturn setParamPropertiesPreGated (OSDictionary * dict, OSIterator ** pOpenIter);
static IOReturn doSetParamPropertiesPost (IOHIDSystem *self, void * arg0);
IOReturn setParamPropertiesPostGated (OSDictionary * dict);
static IOReturn doExtGetToggleState (IOHIDSystem *self, void *p1, void *p2);
static IOReturn doExtSetToggleState (IOHIDSystem *self, void *p1, void *p2);
IOReturn getCapsLockState(unsigned int *state_O);
IOReturn setCapsLockState(unsigned int state_I);
IOReturn getNumLockState(unsigned int *state_O);
IOReturn setNumLockState(unsigned int state_I);
public:
virtual void setStackShotPort(mach_port_t port);
virtual UInt32 eventFlags();
virtual void dispatchEvent(IOHIDEvent *event, IOOptionBits options=0);
};
#endif