You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
530 lines
16 KiB
530 lines
16 KiB
#ifndef __ACTIONS_H__
|
|
#define __ACTIONS_H__
|
|
// @doc
|
|
/**********************************************************************
|
|
*
|
|
* @module Actions.h |
|
|
*
|
|
* Definitions of data structures for representing Actions and Events
|
|
*
|
|
* History
|
|
* ----------------------------------------------------------
|
|
* Mitchell S. Dernis Original
|
|
* Jeffrey A. Davis Modifications.
|
|
*
|
|
* (c) 1986-1998 Microsoft Corporation. All right reserved.
|
|
*
|
|
* @index Actions | ACTIONS
|
|
*
|
|
* @topic Actions |
|
|
* Contains definitions of structures, constants, and macros
|
|
* for building up and working with Actions and their constituent Events
|
|
*
|
|
**********************************************************************/
|
|
#include "controlitems.h"
|
|
#include "profile.h" // legacy data structures.
|
|
#define CF_RAWSCHEME (0x201)
|
|
|
|
|
|
#pragma pack(push, actions_previous_alignment)
|
|
#pragma pack(1)
|
|
|
|
//
|
|
// Flags included as part of commands type.
|
|
// used to define different properties of some commands
|
|
|
|
#define COMMAND_TYPE_FLAG_ASSIGNMENT 0x8000
|
|
|
|
|
|
//
|
|
// Different types of command that can be sent to GcKernel
|
|
//
|
|
#define COMMAND_TYPE_ASSIGNMENT_TARGET 0x0001
|
|
#define COMMAND_TYPE_RECORDABLE (0x0002 | COMMAND_TYPE_FLAG_ASSIGNMENT)
|
|
#define COMMAND_TYPE_BEHAVIOR (0x0003 | COMMAND_TYPE_FLAG_ASSIGNMENT)
|
|
#define COMMAND_TYPE_FEEDBACK (0x0004 | COMMAND_TYPE_FLAG_ASSIGNMENT)
|
|
#define COMMAND_TYPE_TRANSLATE 0x0005
|
|
#define COMMAND_TYPE_QUEUE 0x0006
|
|
#define COMMAND_TYPE_GENERAL 0x0007
|
|
|
|
|
|
//
|
|
// @enum COMMAND_ID |
|
|
// a.k.a ACTION_OBJECT_ID, and BEHAVIOR_OBJECT_ID
|
|
// defines the sepcific command.
|
|
//
|
|
typedef enum COMMAND_ID
|
|
{
|
|
eDirectory = 0, //@field Directory.
|
|
|
|
//
|
|
// Assignment Targets IDs
|
|
//
|
|
eAssignmentTargetPlaceTag = (COMMAND_TYPE_ASSIGNMENT_TARGET << 16), //Beginning of Assignment Targets
|
|
eRecordableAction, //@field Recordable Action
|
|
eBehaviorAction, //@field Behavior Action
|
|
eFeedbackAction, //@field Feedback Action
|
|
|
|
//
|
|
// Recordable Assignment IDs
|
|
//
|
|
eAssignmentPlaceTag = (COMMAND_TYPE_RECORDABLE << 16), //Beginning of assignments
|
|
eTimedMacro, //@field A timed macro
|
|
eKeyString, //@field An untimed string of keys
|
|
eButtonMap, //@field A single button mapped (or direction)
|
|
eKeyMap, //@field A single keyboard key mapped
|
|
eCycleMap, //@field A single keyboard key mapped
|
|
eNone, //@field Was eAxisMap used as NONE
|
|
|
|
//
|
|
// Mouse Input Assignment IDs - use with eRecordableAction assignment targets.
|
|
// These are mutually exclusive with Macors and other recordable assignments.
|
|
// The ones with FX (all except eMouseButtonMap) do nothing unless eMouseFXModel is sent to the device(below)
|
|
eMouseButtonMap, //@field Maps a mouse button
|
|
eMouseFXAxisMap, //@field Maps a mouse axis
|
|
eMouseFXClutchMap, //@field Maps the button to turn clutch on in Mouse FX model
|
|
eMouseFXDampenMap, //@field Maps the button to turn dampen on in Mouse FX model
|
|
eMouseFXZoneIndicator, //@field Maps an an input to indicate zone in Mouse FX model
|
|
//
|
|
// Axis IDs
|
|
//
|
|
eAxisMap, //@field A mapping of one axis to another
|
|
eAxisToKeyMap, //@field A mapping of an axis to key (Used in Attila)
|
|
|
|
// Atilla Macro (MultiMap?)
|
|
eMultiMap, //@field Maps to keys, delays, and mouse clicks
|
|
|
|
//
|
|
// Behavior Assignment IDs
|
|
//
|
|
eBehaviorPlaceTag = (COMMAND_TYPE_BEHAVIOR << 16), //Beginning of Behaviors
|
|
eStandardBehaviorCurve, //@field A behavior curve assigned to and axes
|
|
|
|
|
|
//
|
|
// Feedback Assignment IDs
|
|
//
|
|
eFeedbackPlaceTag = (COMMAND_TYPE_FEEDBACK << 16), //Beginning of Feedback types
|
|
eForceMap, //MapYToX, RTC, Gain (Driver Should Ignore) Sparky Zep Additions
|
|
|
|
//
|
|
// Translation IDs
|
|
//
|
|
eTranslatePlaceTag = (COMMAND_TYPE_TRANSLATE << 16), //Beginning of Translate types
|
|
eAtlasProfile, //@field ATLAS entire Profile.
|
|
eXenaProfile, //@field XENA entire profile.
|
|
eAtlasKeyboardMacro, //@field ATLAS macro.
|
|
eXenaKeyboardMacro, //@field XENA macro.
|
|
eAtlasTimedMacro, //@field ATLAS macro.
|
|
eXenaTimedMacro, //@field XENA macro.
|
|
eAtlasSetting, //@field ATLAS Settings flags
|
|
eXenaSetting, //@field XENA Settings flags
|
|
|
|
//
|
|
// Queue Command IDs
|
|
//
|
|
eQueuePlaceTag = (COMMAND_TYPE_QUEUE << 16), //Beginning of Queue
|
|
eSetQueueInterruptMode, //@field Cause one macro to interupt another
|
|
eSetQueueOverlayMode, //@field Causes macros to overlay each other
|
|
eSetQueueSequenceMode, //@field Causes macros to play in sequence
|
|
|
|
//
|
|
// General Command IDs
|
|
//
|
|
eGeneralCommandsPlaceTag = (COMMAND_TYPE_GENERAL << 16),//Beginning of General Commands
|
|
eResetScheme, //@field Resets all the settings of a scheme
|
|
} ACTION_OBJECT_ID, BEHAVIOR_OBJECT_ID;
|
|
|
|
|
|
// There are the different type of proportional axes
|
|
typedef enum AXIS_ID
|
|
{
|
|
eX = 0,
|
|
eY,
|
|
eZ,
|
|
eRX,
|
|
eRY,
|
|
eRZ
|
|
};
|
|
|
|
|
|
//
|
|
// @struct COMMAND_HEADER |
|
|
// Each command begins with a COMMAND_HEADER
|
|
typedef struct
|
|
{
|
|
COMMAND_ID eID; //@field ID of command
|
|
ULONG ulByteSize; //@field Length of command including this header
|
|
} COMMAND_HEADER, *PCOMMAND_HEADER;
|
|
|
|
//
|
|
// @struct COMMAND_DIRECTORY |
|
|
// Dirtectory block that lists one or more sets of commands.
|
|
typedef struct tagCOMMAND_DIRECTORY
|
|
{
|
|
COMMAND_HEADER CommandHeader; //@field Command header
|
|
USHORT usNumEntries; //@field Number of IDs that follow.
|
|
ULONG ulEntireSize;
|
|
} COMMAND_DIRECTORY,
|
|
*PCOMMAND_DIRECTORY;
|
|
|
|
//
|
|
// @struct ASSIGNMENT_BLOCK |
|
|
// Assignment blocks are any block with a
|
|
// COMMAND_ID that has the COMMAND_TYPE_FLAG_ASSIGNMENT
|
|
// set. You can assume that these blocks start
|
|
// with this structure as an extension of the COMMAND_HEADER
|
|
// structure.
|
|
typedef struct ASSIGNMENT_BLOCK
|
|
{
|
|
COMMAND_HEADER CommandHeader; //@field Command header
|
|
ULONG ulVidPid; //@field VIDPID.
|
|
} *PASSIGNMENT_BLOCK;
|
|
|
|
//
|
|
// @func Get the type of command from a COMMAND_ID.,
|
|
//
|
|
// @rdesc COMMAND_TYPE_ASSIGNMENT Command is an action assignment.
|
|
// @rdesc COMMAND_TYPE_BEHAVIOR Command is a behavior assignment.
|
|
// @rdesc COMMAND_TYPE_QUEUE Command changes properties of Action queue.
|
|
// @rdesc COMMAND_TYPE_GENERAL Command modifies a general property of the filter.
|
|
//
|
|
#ifdef __cplusplus
|
|
inline ULONG
|
|
CommandType
|
|
(
|
|
COMMAND_ID eID //@parm COMMAND_ID to get type of
|
|
)
|
|
{
|
|
return static_cast<ULONG>(eID >> 16) & 0x0000FFFF;
|
|
}
|
|
#else //if not __cplusplus, define as macro instead
|
|
#define CommandType(__ID__) ((ULONG)(__ID__ >> 16) & 0x0000FFFF)
|
|
#endif //__cplusplus
|
|
|
|
|
|
//
|
|
// @struct EVENT | Describes a single untimed event which may contain
|
|
// device data or keystrokes.
|
|
//
|
|
// @field ULONG | ulNumXfers | Number CONTROL_ITEM_XFER's in EVENT
|
|
// @field CONTROL_ITEM_XFER | rgXfers[] | Array of events
|
|
typedef struct tagEVENT
|
|
{
|
|
ULONG ulNumXfers;
|
|
CONTROL_ITEM_XFER rgXfers[1];
|
|
|
|
//
|
|
// @mfunc static ULONG | EVENT | RequiredByteSize |
|
|
// Calculates the bytes required for an event given the number
|
|
// CONTROL_ITEM_XFER's.
|
|
//
|
|
#ifdef __cplusplus
|
|
static ULONG RequiredByteSize(
|
|
ULONG ulNumXfers //@parm Number of CONTROL_ITEM_XFERs
|
|
)
|
|
{
|
|
ASSERT(0!=ulNumXfers);
|
|
return (ulNumXfers-1)*sizeof(CONTROL_ITEM_XFER)+sizeof(tagEVENT);
|
|
}
|
|
|
|
// Simple accessor for retrieval of Xfers by index
|
|
CONTROL_ITEM_XFER& GetControlItemXfer(ULONG ulXferIndex)
|
|
{
|
|
ASSERT(ulXferIndex < ulNumXfers); // && TEXT("Requested Xfer is greater than the number of xfers"));
|
|
return rgXfers[ulXferIndex];
|
|
}
|
|
|
|
// Assumes XFers are in the same order!!
|
|
bool operator==(const tagEVENT& rhs)
|
|
{
|
|
if (ulNumXfers != rhs.ulNumXfers)
|
|
{
|
|
return false;
|
|
}
|
|
for (UINT i = 0; i < ulNumXfers; i++)
|
|
{
|
|
if (rgXfers[i] != rhs.rgXfers[i])
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// If we got this far all matched
|
|
return true;
|
|
}
|
|
|
|
bool operator!=(const tagEVENT& rhs)
|
|
{
|
|
return !(operator==(rhs));
|
|
}
|
|
#endif __cplusplus
|
|
} EVENT, *PEVENT;
|
|
|
|
//
|
|
// @struct TIMED_EVENT | Describes a single timed event which may contain
|
|
// device data or keystrokes.
|
|
//
|
|
// @field ULONG | ulDuration | Duration of timed event.
|
|
// @field EVENT | Event | Untimed EVENT
|
|
typedef struct tagTIMED_EVENT
|
|
{
|
|
ULONG ulDuration;
|
|
EVENT Event;
|
|
|
|
//
|
|
// @mfunc static ULONG | TIMED_EVENT | RequiredByteSize |
|
|
// Calculates the bytes required for an event given the number
|
|
// CONTROL_ITEM_XFER's.
|
|
//
|
|
#ifdef __cplusplus
|
|
static ULONG RequiredByteSize(
|
|
ULONG ulNumXfers //@parm Number of CONTROL_ITEM_XFERs
|
|
)
|
|
{
|
|
// ASSERT(0!=ulNumXfers);
|
|
return (ulNumXfers-1)*sizeof(CONTROL_ITEM_XFER)+sizeof(tagTIMED_EVENT);
|
|
}
|
|
#endif
|
|
} TIMED_EVENT, *PTIMED_EVENT;
|
|
|
|
|
|
const ULONG ACTION_FLAG_AUTO_REPEAT = 0x00000001;
|
|
const ULONG ACTION_FLAG_BLEED_THROUGH = 0x00000002;
|
|
const ULONG ACTION_FLAG_PREVENT_INTERRUPT = 0x00000004;
|
|
|
|
//
|
|
// @struct TIMED_MACRO | Structure to represent a timed macro.
|
|
// @field COMMAND_HEADER | CmdHeader | Command header must have eID = eTimedMacro.
|
|
// @field ULONG | ulFlags | Flags modify the properties of the macro.<nl>
|
|
// ACTION_FLAG_AUTO_REPEAT - Macro repeats as long as trigger is held.<nl>
|
|
// ACTION_FLAG_BLEED_THROUGH - Allows bleed-through and coexisting macros <nl>
|
|
// ACTION_FLAG_PREVENT_INTERRUPT - Prevents a macro from being interrupted by another.<nl>
|
|
// @field ULONG | ulEventCount | Number of events in Macro.
|
|
// @field TIMED_EVENT | rgEvents[1] | Events in macro - do not access directly, use accessors
|
|
// @xref TIMED_MACRO::GetEvent
|
|
// @xref TIMED_MACRO::GetNextEvent
|
|
typedef struct tagTIMED_MACRO
|
|
{
|
|
//
|
|
// Data for TIMED_MACROS
|
|
//
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ULONG ulFlags;
|
|
ULONG ulEventCount;
|
|
|
|
#ifdef __cplusplus
|
|
|
|
//
|
|
// Accessor functions for events which are variable length,
|
|
// so do not access private item directly
|
|
PTIMED_EVENT GetEvent(ULONG uEventNum);
|
|
PTIMED_EVENT GetNextEvent(PTIMED_EVENT pCurrentEvent, ULONG& ulCurrentEvent);
|
|
static tagTIMED_MACRO *Init(ULONG ulVidPid,ULONG ulFlagsParm, PCHAR pcBuffer, ULONG& rulRemainingBuffer);
|
|
HRESULT AddEvent(PTIMED_EVENT pTimedEvent, ULONG& rulRemainingBuffer);
|
|
|
|
private:
|
|
#endif //__cplusplus
|
|
TIMED_EVENT rgEvents[1];
|
|
|
|
} TIMED_MACRO, *PTIMED_MACRO;
|
|
|
|
typedef struct tagMULTI_MACRO
|
|
{
|
|
//
|
|
// Data for MULTI_MACRO
|
|
//
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ULONG ulFlags;
|
|
ULONG ulEventCount;
|
|
|
|
#ifdef __cplusplus
|
|
|
|
//
|
|
// Accessor functions for events which are variable length,
|
|
// so do not access private item directly
|
|
PEVENT GetEvent(ULONG uEventNum);
|
|
PEVENT GetNextEvent(EVENT* pCurrentEvent, ULONG& ulCurrentEvent);
|
|
static tagMULTI_MACRO *Init(ULONG ulVidPid, ULONG ulFlagsParm, PCHAR pcBuffer, ULONG& rulRemainingBuffer);
|
|
HRESULT AddEvent(EVENT* pEvent, ULONG& rulRemainingBuffer);
|
|
|
|
private:
|
|
#endif //__cplusplus
|
|
EVENT rgEvents[1];
|
|
|
|
} MULTI_MACRO, *PMULTI_MACRO;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
MACRO Macro;
|
|
} XENA_MACRO_BLOCK, *PXENA_MACRO_BLOCK;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ATLAS_MACRO Macro;
|
|
} ATLAS_MACRO_BLOCK, *PATLAS_MACRO_BLOCK;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
SETTING Setting;
|
|
} XENA_SETTING_BLOCK, *PXENA_SETTING_BLOCK;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ATLAS_SETTING Setting;
|
|
} ATLAS_SETTING_BLOCK, *PATLAS_SETTING_BLOCK;
|
|
|
|
|
|
|
|
typedef struct tagMAP_LIST
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ULONG ulFlags;
|
|
ULONG ulEventCount;
|
|
#ifdef __cplusplus
|
|
//
|
|
// Accessor functions for events which are variable length,
|
|
// so do not access private item directly
|
|
PEVENT GetEvent(ULONG uEventNum);
|
|
PEVENT GetNextEvent(PEVENT pCurrentEvent, ULONG& ulCurrentEvent);
|
|
|
|
static tagMAP_LIST* Init(ULONG ulVidPid,ULONG ulFlagsParm, PCHAR pcBuffer, ULONG& rulRemainingBuffer);
|
|
HRESULT AddEvent(EVENT* pTimedEvent, ULONG& rulRemainingBuffer);
|
|
|
|
private:
|
|
#endif
|
|
EVENT rgEvents[1];
|
|
} MAP_LIST, *PMAP_LIST, CYCLE_MAP, *PCYCLE_MAP, KEYSTRING_MAP, *PKEYSTRING_MAP;
|
|
|
|
typedef struct tagX_MAP
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ULONG ulFlags;
|
|
ULONG ulEventCount; // Not gauranteeing, but should always be 1
|
|
EVENT Event;
|
|
} KEY_MAP, *PKEY_MAP, BUTTON_MAP, *PBUTTON_MAP;
|
|
|
|
/*
|
|
* BUGBUG This structure is only useful for mapping axes of type CGenericItem or derivatives.
|
|
* BUGBUG This is due to limitations in GcKernel. For example the Y-Z axis swap for
|
|
* BUGBUG for joysticks is currently broken. See the comment in the declaration of CAxisMap
|
|
* BUGBUG in filter.h in the GcKernel.sys project for details.
|
|
*/
|
|
typedef struct tagAXIS_MAP
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock; //eAxisMap is the type
|
|
LONG lCoefficient1024x; //A mapping coeffiecient times 1024 (should be between -1024 and 1024)
|
|
CONTROL_ITEM_XFER cixDestinationAxis; //Axis to map to.
|
|
} AXIS_MAP, *PAXIS_MAP;
|
|
|
|
typedef struct
|
|
{
|
|
short sX;
|
|
short sY;
|
|
}CURVE_POINT;
|
|
|
|
typedef struct tagBEHAVIOR_CURVE
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
BOOLEAN fDigital; //This flag is only flag for PROPDPads that are software programmable.
|
|
ULONG ulRange;
|
|
USHORT usPointCount;
|
|
CURVE_POINT rgPoints[1];
|
|
#ifdef __cplusplus
|
|
static ULONG RequiredByteSize(USHORT usNumPoints)
|
|
{
|
|
return (usNumPoints-1)*sizeof(CURVE_POINT)+sizeof(tagBEHAVIOR_CURVE);
|
|
}
|
|
#endif
|
|
} BEHAVIOR_CURVE, *PBEHAVIOR_CURVE;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
COMMAND_HEADER CommandHeader;
|
|
CONTROL_ITEM_XFER cixAssignment;
|
|
} ASSIGNMENT_TARGET, *PASSIGNMENT_TARGET;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
UCHAR ucButtonNumber;
|
|
} MOUSE_BUTTON_MAP, *PMOUSE_BUTTON_MAP;
|
|
|
|
typedef struct tagMOUSE_MODEL_FX_PARAMETERS
|
|
{
|
|
ULONG ulAbsZoneSense;
|
|
ULONG ulContZoneMaxRate;
|
|
ULONG ulPulseWidth;
|
|
ULONG ulPulsePeriod;
|
|
ULONG ulInertiaTime;
|
|
ULONG ulAcceleration;
|
|
BOOLEAN fAccelerate;
|
|
BOOLEAN fPulse;
|
|
USHORT usReserved;
|
|
} MOUSE_MODEL_PARAMETERS, *PMOUSE_MODEL_PARAMETERS;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
BOOLEAN fIsX; //TRUE = x; FALSE = y
|
|
MOUSE_MODEL_PARAMETERS AxisModelParameters;
|
|
} MOUSE_FX_AXIS_MAP, *PMOUSE_FX_AXIS_MAP;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
} MOUSE_FX_CLUTCH_MAP, *PMOUSE_FX_CLUTCH_MAP;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
} MOUSE_FX_DAMPEN_MAP, *PMOUSE_FX_DAMPEN_MAP;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
UCHAR ucAxis; //0 = X, 1=Y, 2=Z
|
|
} MOUSE_FX_ZONE_INDICATOR, *PMOUSE_FX_ZONE_INDICATOR;
|
|
|
|
typedef struct
|
|
{
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
UCHAR bMapYToX; //@field Bool value
|
|
USHORT usRTC; //@field return to center force (0-10000)
|
|
USHORT usGain; //@field gain for the device
|
|
} *PFORCE_BLOCK, FORCE_BLOCK;
|
|
|
|
typedef struct tagAXISTOKEYMAPMODEL
|
|
{
|
|
//
|
|
// Data for AXISTOKEYMAPMODEL
|
|
//
|
|
ASSIGNMENT_BLOCK AssignmentBlock;
|
|
ULONG ulActiveAxes; //@field Which axes have mappings
|
|
ULONG ulEventCount; //@field How many axis have mappings
|
|
|
|
#ifdef __cplusplus
|
|
|
|
//
|
|
// Accessor functions for events which are variable length,
|
|
// so do not access private item directly
|
|
// PEVENT GetEvent(ULONG uEventNum);
|
|
// PEVENT GetNextEvent(EVENT* pCurrentEvent, ULONG& ulCurrentEvent);
|
|
// static tagMULTI_MACRO *Init(ULONG ulVidPid, ULONG ulFlagsParm, PCHAR pcBuffer, ULONG& rulRemainingBuffer);
|
|
// HRESULT AddEvent(EVENT* pEvent, ULONG& rulRemainingBuffer);
|
|
|
|
private:
|
|
#endif //__cplusplus
|
|
EVENT rgEvents[1]; //@field Variable size array of events for mappings
|
|
} *PAXISTOKEYMAPMODEL_BLOCK, AXISTOKEYMAPMODEL_BLOCK;
|
|
|
|
#pragma pack(pop, actions_previous_alignment)
|
|
|
|
#endif //__ACTIONS_H__
|