#ifndef _IOHIPOINTING_H
#define _IOHIPOINTING_H
#include <IOKit/hidsystem/IOHIPointing.h>
#include <IOKit/hidsystem/IOHIDevice.h>
#include <IOKit/hidsystem/IOHIDTypes.h>
typedef void (*RelativePointerEventAction)(OSObject * target,
int buttons,
int dx,
int dy,
AbsoluteTime ts);
typedef void (*AbsolutePointerEventAction)(OSObject * target,
int buttons,
Point * newLoc,
Bounds * bounds,
bool proximity,
int pressure,
int stylusAngle,
AbsoluteTime ts);
typedef void (*ScrollWheelEventAction)(OSObject * target,
short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
AbsoluteTime ts);
class IOHIDPointingDevice;
class IOHIPointing : public IOHIDevice
{
OSDeclareDefaultStructors(IOHIPointing);
private:
IOLock * _deviceLock; int _buttonMode; IOFixed _acceleration;
bool _convertAbsoluteToRelative;
bool _contactToMove;
bool _hadContact;
Point _previousLocation;
UInt8 _pressureThresholdToClick; void * _scaleSegments;
IOItemCount _scaleSegCount;
IOFixed _fractX;
IOFixed _fractY;
OSObject * _relativePointerEventTarget;
RelativePointerEventAction _relativePointerEventAction;
OSObject * _absolutePointerEventTarget;
AbsolutePointerEventAction _absolutePointerEventAction;
OSObject * _scrollWheelEventTarget;
ScrollWheelEventAction _scrollWheelEventAction;
#define SCROLL_TIME_DELTA_COUNT 8
struct ExpansionData {
IOFixed scrollAcceleration;
void * scrollScaleSegments;
IOItemCount scrollScaleSegCount;
UInt32 scrollTimeDeltas1[SCROLL_TIME_DELTA_COUNT];
UInt32 scrollTimeDeltas2[SCROLL_TIME_DELTA_COUNT];
UInt32 scrollTimeDeltas3[SCROLL_TIME_DELTA_COUNT];
UInt8 scrollTimeDeltaIndex1;
UInt8 scrollTimeDeltaIndex2;
UInt8 scrollTimeDeltaIndex3;
int scrollLastDeltaAxis1;
int scrollLastDeltaAxis2;
int scrollLastDeltaAxis3;
AbsoluteTime scrollLastEventTime1;
AbsoluteTime scrollLastEventTime2;
AbsoluteTime scrollLastEventTime3;
IOHIDPointingDevice * hidPointingNub;
};
void * _reserved;
#define _scrollAcceleration ((ExpansionData *)_reserved)->scrollAcceleration
#define _scrollScaleSegments ((ExpansionData *)_reserved)->scrollScaleSegments
#define _scrollScaleSegCount ((ExpansionData *)_reserved)->scrollScaleSegCount
#define _scrollTimeDeltas1 ((ExpansionData *)_reserved)->scrollTimeDeltas1
#define _scrollTimeDeltas2 ((ExpansionData *)_reserved)->scrollTimeDeltas2
#define _scrollTimeDeltas3 ((ExpansionData *)_reserved)->scrollTimeDeltas3
#define _scrollTimeDeltaIndex1 ((ExpansionData *)_reserved)->scrollTimeDeltaIndex1
#define _scrollTimeDeltaIndex2 ((ExpansionData *)_reserved)->scrollTimeDeltaIndex2
#define _scrollTimeDeltaIndex3 ((ExpansionData *)_reserved)->scrollTimeDeltaIndex3
#define _scrollLastDeltaAxis1 ((ExpansionData *)_reserved)->scrollLastDeltaAxis1
#define _scrollLastDeltaAxis2 ((ExpansionData *)_reserved)->scrollLastDeltaAxis2
#define _scrollLastDeltaAxis3 ((ExpansionData *)_reserved)->scrollLastDeltaAxis3
#define _scrollLastEventTime1 ((ExpansionData *)_reserved)->scrollLastEventTime1
#define _scrollLastEventTime2 ((ExpansionData *)_reserved)->scrollLastEventTime2
#define _scrollLastEventTime3 ((ExpansionData *)_reserved)->scrollLastEventTime3
#define _hidPointingNub ((ExpansionData *)_reserved)->hidPointingNub
protected:
virtual void dispatchRelativePointerEvent(int dx,
int dy,
UInt32 buttonState,
AbsoluteTime ts);
virtual void dispatchAbsolutePointerEvent(Point * newLoc,
Bounds * bounds,
UInt32 buttonState,
bool proximity,
int pressure,
int pressureMin,
int pressureMax,
int stylusAngle,
AbsoluteTime ts);
virtual void dispatchScrollWheelEvent(short deltaAxis1,
short deltaAxis2,
short deltaAxis3,
AbsoluteTime ts);
public:
virtual bool init(OSDictionary * properties = 0);
virtual bool start(IOService * provider);
virtual void stop( IOService * provider );
virtual void free();
virtual bool open(IOService * client,
IOOptionBits options,
RelativePointerEventAction rpeAction,
AbsolutePointerEventAction apeAction,
ScrollWheelEventAction sweAction);
virtual void close(IOService * client, IOOptionBits );
virtual IOHIDKind hidKind();
virtual bool updateProperties( void );
virtual IOReturn setParamProperties( OSDictionary * dict );
virtual IOReturn powerStateWillChangeTo( IOPMPowerFlags powerFlags,
unsigned long newState, IOService * device);
virtual IOReturn powerStateDidChangeTo( IOPMPowerFlags powerFlags,
unsigned long newState, IOService * device);
protected: virtual OSData * copyAccelerationTable();
virtual IOItemCount buttonCount();
virtual IOFixed resolution();
OSData * copyScrollAccelerationTable();
private:
virtual bool resetPointer();
virtual void scalePointer(int * dxp, int * dyp);
virtual void setupForAcceleration(IOFixed accl);
bool resetScroll();
void scaleScrollAxes(int * axis1p, int * axis2p, int * axis3p);
void setupScrollForAcceleration(IOFixed accl);
IOFixed scrollResolution();
};
#endif