windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/dx8/diquick/diquick.h
2020-09-26 16:20:57 +08:00

921 lines
28 KiB
C

#define STRICT
#include <windows.h>
#include <commctrl.h>
#ifdef DBG
#define DEBUG
#endif
#define IDT_DATA 1 /* Timer for data acquisition */
#define msData 100 /* Time interval for polled acquisition */
#define IDD_MAIN 1
#define IDC_MAIN_GETSTAT 16
#define IDC_MAIN_CREATE 17
#define IDC_MAIN_CPL 18
#define IDC_MAIN_REFRESH 19
#define IDC_MAIN_FIND 20
#define IDC_MAIN_OLE 32
#define IDC_MAIN_DI 33
#define IDC_MAIN_DIA 34
#define IDC_MAIN_DIW 35
#define IDC_MAIN_DEVICES 36
/*
* The precise numerical values are important.
*
* Bottom bit must be set on unicode interfaces.
* Dev_DoDevice assumes that the first two interfaces
* are IDirectInputDeviceA and IDirectInputDeviceW, respectively.
*
* c_rgriid must parallel this table.
*/
#define DIDC_MAIN_DIDA 0
#define DIDC_MAIN_DIDW 1
#define DIDC_MAIN_DID2A 2
#define DIDC_MAIN_DID2W 3
#define DIDC_MAIN_DIDJC 4
#define DIDC_MAIN_ITFMAC 4
#define DIDC_MAIN_ITFMAX 5
/*
* Warning! IsUnicodeDidc must return exactly 0 or 1
* because CreateDI relies on it.
*/
#define IsUnicodeDidc(didc) ((didc) & 1)
#define IsFFDidc(didc) ((didc) == 2 || (didc) == 3)
#define IDC_MAIN_ITF 48
#define IDC_MAIN_DIDA (IDC_MAIN_ITF + DIDC_MAIN_DIDA)
#define IDC_MAIN_DIDW (IDC_MAIN_ITF + DIDC_MAIN_DIDW)
#define IDC_MAIN_DID2A (IDC_MAIN_ITF + DIDC_MAIN_DID2A)
#define IDC_MAIN_DID2W (IDC_MAIN_ITF + DIDC_MAIN_DID2W)
#define IDC_MAIN_DIDJC (IDC_MAIN_ITF + DIDC_MAIN_DIDJC)
#define IDC_MAIN_ITFMAC (IDC_MAIN_ITF + DIDC_MAIN_ITFMAC)
#define IDC_MAIN_ITFMAX (IDC_MAIN_ITF + DIDC_MAIN_ITFMAX)
#define IDD_DEV 2
#define IDC_DEV_PASSIVE 16
#define IDC_DEV_PASSIVE_FOREGROUND 17
#define IDC_DEV_ACTIVE_BACKGROUND 18
#define IDC_DEV_ACTIVE 19
#define IDC_DEV_NOWINKEY 31
#define IDC_DEV_MOUSE 20
#define IDC_DEV_KEYBOARD 21
#define IDC_DEV_JOYSTICK 22
#define IDC_DEV_DEVICE 23
#define IDC_DEV_POLLED 24
#define IDC_DEV_EVENT 25
#define IDC_DEV_ABS 26
#define IDC_DEV_REL 27
#define IDC_DEV_CAL 28
#define IDC_DEV_BUFSIZE 29
#define IDC_DEV_BUFSIZEUD 30
#define IDD_CAPS 3
#define IDC_CAPS_LIST 16
#define IDC_CAPS_VALUE 17
#define IDC_CAPS_REFRESH 31
#define IDC_CAPS_CPL 32
#define IDD_ENUMOBJ 4
#define IDC_ENUMOBJ_AXES 16
#define IDC_ENUMOBJ_BUTTONS 17
#define IDC_ENUMOBJ_POVS 18
#define IDC_ENUMOBJ_ALL 19
#define IDC_ENUMOBJ_LIST 20
#define IDC_ENUMOBJ_PROP 21
#define IDD_ENUMEFF 5
#define IDC_ENUMEFF_LIST 16
#define IDD_ACQ 6
#define IDC_ACQ_STATE 16
#define IDC_ACQ_DATA 17
#define IDC_ACQ_UNACQ 18
#define IDD_OBJPROP 16
#define IDC_PROP_LIST 16
#define IDC_PROP_VALUE 17
#define IDC_PROP_CAL_L 30
#define IDC_PROP_CAL_C 31
#define IDC_PROP_CAL_H 32
#define IDD_CPL 17
#define IDC_CPL_CLASSES 16
#define IDC_CPL_ADD 17
#define IDC_CPL_TYPES 18
#define IDC_CPL_CONFIGS 19
#define IDC_CPL_USERVALUES 20
#define IDC_CPL_ADDJOYSTICK 21
#define IDC_CPL_DELJOYSTICK 22
#define IDD_JOYTYPE 18
#define IDC_TYPE_CHECKLIST 16
#define IDC_TYPE_NUMBUTTONS 17
#define IDD_JOYUV 19
#define IDC_JOYUV_AXIS 16
#define IDC_JOYUV_MIN 17
#define IDC_JOYUV_CENTER 18
#define IDC_JOYUV_MAX 19
#define IDC_JOYUV_DEADZONE 20
#define IDC_JOYUV_CALLOUT 21
#define IDC_JOYUV_EMULATOR 22
#define IDD_FIND 20
#define IDC_FIND_NAME 16
#define IDC_FIND_GUID 17
#define IDC_FIND_FIND 18
#define IDD_ENUMDEV 21
/*
* These must be in the same order as DIDEVTYPE_*.
*/
#define IDC_ENUMDEV_ALL 16
#define IDC_ENUMDEV_GEN 17
#define IDC_ENUMDEV_MSE 18
#define IDC_ENUMDEV_KBD 19
#define IDC_ENUMDEV_JOY 20
#define IDC_ENUMDEV_LAST 20
#define IDC_ENUMDEV_ATT 32
#define IDC_ENUMDEV_FF 33
#define IDC_ENUMDEV_HID 34
#define IDC_ENUMDEV_ALIAS 35
#define IDC_ENUMDEV_PHANTOM 36
#define IDD_EFFPROP 32
#define IDC_EPROP_GUID 16
#define IDC_EPROP_TYPE 17
#define IDC_EPROP_FLAGS 18
#define IDC_EPROP_STATICPARM 19
#define IDC_EPROP_DYNAMICPARM 20
#define IDD_VAL_BOOL 64
#define IDC_VBOOL_YES 16
#define IDC_VBOOL_NO 17
#define IDC_VBOOL_APPLY 18
#define IDD_VAL_EDIT 65
#define IDC_VEDIT_EDIT 16
#define IDC_VEDIT_APPLY 17
#define IDD_VAL_INT 66
#define IDC_VINT_EDIT 16
#define IDC_VINT_UD 17
#define IDC_VINT_DEC 18
#define IDC_VINT_HEX 19
#define IDC_VINT_APPLY 20
#define IDD_VAL_RANGE 67
#define IDC_VRANGE_MIN 16
#define IDC_VRANGE_MINUD 17
#define IDC_VRANGE_MAX 18
#define IDC_VRANGE_MAXUD 19
#define IDC_VRANGE_DEC 20
#define IDC_VRANGE_HEX 21
#define IDC_VRANGE_APPLY 22
#define IDD_VAL_CAL 68
#define IDC_VCAL_MIN 16
#define IDC_VCAL_MINUD 17
#define IDC_VCAL_CTR 18
#define IDC_VCAL_CTRUD 19
#define IDC_VCAL_MAX 20
#define IDC_VCAL_MAXUD 21
#define IDC_VCAL_DEC 22
#define IDC_VCAL_HEX 23
#define IDC_VCAL_APPLY 24
#define IDS_ERR_CREATEOBJ 16
#define IDS_ERR_COOPERATIVITY 17
#define IDS_ERR_CREATEDEV 18
#define IDS_ERR_SETEVENTNOT 19
#define IDS_ERR_DATAFORMAT 20
#define IDS_ERR_ACQUIRE 21
#define IDS_ERR_BUFFERSIZE 22
#define IDS_ERR_RUNCPL 23
#define IDS_ERR_GETOBJINFO 24
#define IDS_ERR_AXISMODE 25
#define IDS_ERR_HRESULT 27
#define IDS_ERR_COINIT 29
#define IDS_ERR_QICONFIG 30
#define IDS_ERR_ADDNEWHARDWARE 31
#define IDS_ERR_CALMODE 32
#define IDS_SPACEPARENHID 124
#define IDS_INVALID 125
#define IDS_CAPS_YES 126
#define IDS_CAPS_NO 127
#define IDS_TYPEARRAY 0x0100 /* 0x0100 .. 0x01FF */
/*efine IDS_DEVICE_TYPEARRAY ... */
#define IDS_MOUSE_TYPEARRAY 0x0300 /* 0x0300 .. 0x03FF */
#define IDS_KEYBOARD_TYPEARRAY 0x0400 /* 0x0400 .. 0x04FF */
#define IDS_JOYSTICK_TYPEARRAY 0x0500 /* 0x0500 .. 0x05FF */
#define IDS_ATTACHED 0x0600
#define IDS_POLLEDDEVICE 0x0601
#define IDS_EMULATED 0x0602
#define IDS_FORCEFEEDBACK 0x0603
#define IDS_FFATTACK 0x0604
#define IDS_FFFADE 0x0605
#define IDS_SATURATION 0x0606
#define IDS_POSNEGCOEFFICIENTS 0x0607
#define IDS_POSNEGSATURATION 0x0608
#define IDS_POLLEDDATAFORMAT 0x0609
#define IDS_ALIASDEVICE 0x060A
#define IDS_PHANTOMDEVICE 0x060B
#define IDS_CLASS_KBD 0x0700
#define IDS_CLASS_MEDIA 0x0701
#define IDS_CLASS_MOUSE 0x0702
#define IDS_CLASS_HID 0x0703
#define IDS_HWS_HASZ 0x0800
#define IDS_HWS_HASPOV 0x0801
#define IDS_HWS_POVISBUTTONCOMBOS 0x0802
#define IDS_HWS_POVISPOLL 0x0803
#define IDS_HWS_ISYOKE 0x0804
#define IDS_HWS_ISGAMEPAD 0x0805
#define IDS_HWS_ISCARCTRL 0x0806
#define IDS_HWS_XISJ1Y 0x0807
#define IDS_HWS_XISJ2X 0x0808
#define IDS_HWS_XISJ2Y 0x0809
#define IDS_HWS_YISJ1X 0x080A
#define IDS_HWS_YISJ2X 0x080B
#define IDS_HWS_YISJ2Y 0x080C
#define IDS_HWS_ZISJ1X 0x080D
#define IDS_HWS_ZISJ1Y 0x080E
#define IDS_HWS_ZISJ2X 0x080F
#define IDS_HWS_POVISJ1X 0x0810
#define IDS_HWS_POVISJ1Y 0x0811
#define IDS_HWS_POVISJ2X 0x0812
#define IDS_HWS_HASR 0x0813
#define IDS_HWS_RISJ1X 0x0814
#define IDS_HWS_RISJ1Y 0x0815
#define IDS_HWS_RISJ2Y 0x0816
#define IDS_HWS_HASU 0x0817
#define IDS_HWS_HASV 0x0818
#define IDS_EFFECT_TYPEARRAY 0x0900 /* 0x0900 .. 0x09FF */
#define IDS_PROP_TYPE 0x0A00
#define IDS_PROP_OFS 0x0A01
#define IDS_PROP_OBJTYPE 0x0A02
#define IDS_PROP_GRANULARITY 0x0A03
#define IDS_PROP_FFMAXFORCE 0x0A04
#define IDS_PROP_FFFORCERESOLUTION 0x0A05
#define IDS_PROP_COLLECTIONNUMBER 0x0A06
#define IDS_PROP_DESIGNATORINDEX 0x0A07
#define IDS_PROP_USAGEPAGE 0x0A08
#define IDS_PROP_USAGE 0x0A09
#define IDS_PROP_FFACTUATOR 0x0A0A
#define IDS_PROP_FFEFFECTTRIGGER 0x0A0B
#define IDS_PROP_ASPECT 0x0A0C
#define IDS_PROP_POLLED 0x0A0D
#define IDS_PROP_DEADZONE 0x0A0E
#define IDS_PROP_SATURATION 0x0A0F
#define IDS_PROP_RANGE 0x0A10
#define IDS_PROP_CALIBRATIONMODE 0x0A11
#define IDS_PROP_CAL 0x0A12
#define IDS_PROP_REPORTID 0x0A13
#define IDS_PROP_ENABLEREPORTID 0x0A14
#define IDS_PROP_SCANCODE 0x0A15
#define IDS_PROP_KEYNAME 0x0A16
#define IDS_PROP_ASPECTS 0x0AF0
#define IDS_AXIS_MIN 0x0B00
#define IDS_AXIS_X 0x0B00
#define IDS_AXIS_Y 0x0B01
#define IDS_AXIS_Z 0x0B02
#define IDS_AXIS_R 0x0B03
#define IDS_AXIS_U 0x0B04
#define IDS_AXIS_V 0x0B05
#define IDS_AXIS_MAX 0x0B06
#define IDS_CAPS_TYPE 0x0C00
#define IDS_CAPS_SUBTYPE 0x0C01
#define IDS_CAPS_HID 0x0C02
#define IDS_CAPS_AXES 0x0C03
#define IDS_CAPS_BUTTONS 0x0C04
#define IDS_CAPS_POVS 0x0C05
#define IDS_CAPS_FFSAMPLEPERIOD 0x0C06
#define IDS_CAPS_FFMINTIMERESOLUTION 0x0C07
#define IDS_CAPS_FIRMWAREREVISION 0x0C08
#define IDS_CAPS_HARDWAREREVISION 0x0C09
#define IDS_CAPS_FFDRIVERVERSION 0x0C0A
#define IDS_CAPS_GUIDINSTANCE 0x0C0E
#define IDS_CAPS_GUIDPRODUCT 0x0C0F
#define IDS_CAPS_DEVTYPE 0x0C10
#define IDS_CAPS_INSTANCENAME 0x0C11
#define IDS_CAPS_PRODUCTNAME 0x0C12
#define IDS_CAPS_GUIDFFDRIVER 0x0C13
#define IDS_CAPS_USAGEPAGE 0x0C14
#define IDS_CAPS_USAGE 0x0C15
#define IDS_CAPS_CLASSGUID 0x0C16
#define IDS_CAPS_PATH 0x0C17
#define IDS_CAPS_INSTPROP 0x0C18
#define IDS_CAPS_MFGPROP 0x0C19
#define IDS_CAPS_PORTNAME 0x0C1A
#define IDS_CAPS_PORTID 0x0C1B
#define IDS_CAPS_JOYSTICKID 0x0C1C
#define IDS_CAPS_GUIDMAPPER 0x0C1D
#define IDS_CAPS_VID 0x0C1E
#define IDS_CAPS_PID 0x0C1F
#define IDS_CAPS_TYPENAME 0x0C20
#define IDS_GETSTAT_OK 0x0D00
#define IDS_GETSTAT_NOTATTACHED 0x0D01
#define IDS_GETSTAT_ERROR 0x0D02
#define IDB_CHECK 1
#ifndef RC_INVOKED
#include <prsht.h>
#include <windowsx.h>
#include <ole2.h>
//BUGBUG: Need to add Dx8 features to diquick
//#define DIRECTINPUT_VERSION 0x700
#include <dinput.h>
/***************************************************************************
*
* Abbreviations....
*
* Give shorter names to things we talk about frequently.
*
***************************************************************************/
typedef LPUNKNOWN PUNK;
typedef LPVOID PV, *PPV;
typedef CONST VOID *PCV;
typedef REFIID RIID;
typedef const BYTE *PCBYTE;
typedef const GUID *PCGUID;
/*****************************************************************************
*
* Baggage
*
* Stuff I carry everywhere.
*
*****************************************************************************/
#define INTERNAL NTAPI /* Called only within a translation unit */
#define EXTERNAL NTAPI /* Called from other translation units */
#define INLINE static __inline
#define BEGIN_CONST_DATA data_seg(".text", "CODE")
#define END_CONST_DATA data_seg(".data", "DATA")
/*
* Arithmetic on pointers.
*/
#define pvSubPvCb(pv, cb) ((PV)((PBYTE)pv - (cb)))
#define pvAddPvCb(pv, cb) ((PV)((PBYTE)pv + (cb)))
#define cbSubPvPv(p1, p2) ((PBYTE)(p1) - (PBYTE)(p2))
/*
* Convert an object (X) to a count of bytes (cb).
*/
#define cbX(X) sizeof(X)
/*
* Convert an array name (A) to a generic count (c).
*/
#define cA(a) (cbX(a)/cbX(a[0]))
/*
* Zero an arbitrary object.
*/
#define ZeroX(x) ZeroMemory(&(x), cbX(x))
/*
* land -- Logical and. Evaluate the first. If the first is zero,
* then return zero. Otherwise, return the second.
*/
#define fLandFF(f1, f2) ((f1) ? (f2) : 0)
/*
* lor -- Logical or. Evaluate the first. If the first is nonzero,
* return it. Otherwise, return the second.
*
* Unfortunately, due to the *weridness* of the C language, this can
* be implemented only with a GNU extension. In the non-GNU case,
* we return 1 if the first is nonzero.
*/
#if defined(__GNUC__)
#define fLorFF(f1, f2) ((f1) ?: (f2))
#else
#define fLorFF(f1, f2) ((f1) ? 1 : (f2))
#endif
/*
* limp - logical implication. True unless the first is nonzero and
* the second is zero.
*/
#define fLimpFF(f1, f2) (!(f1) || (f2))
/*
* leqv - logical equivalence. True if both are zero or both are nonzero.
*/
#define fLeqvFF(f1, f2) (!(f1) == !(f2))
/*
* Words to keep preprocessor happy.
*/
#define comma ,
#define empty
/*
* Atomically exchange one value for another.
*/
#define pvExchangePpvPv(ppv, pv) \
(PV)InterlockedExchange((PLONG)(ppv), (LONG)(pv))
/*
* Creating HRESULTs from a USHORT or from a LASTERROR.
*/
#define hresUs(us) MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(us))
#define hresLe(le) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, (USHORT)(le))
/*
* Access the window long as a pointer.
*/
#define GetDialogPtr(hdlg) (PVOID)GetWindowLongPtr(hdlg, DWLP_USER)
#define SetDialogPtr(hdlg, pv) SetWindowLongPtr(hdlg, DWLP_USER, (LPARAM)(pv))
/*
* Does the fWide flag match the preferred character set?
*/
#ifdef UNICODE
#define fTchar(fWide) fWide
#else
#define fTchar(fWide) !(fWide)
#endif
/*****************************************************************************
*
* Globals
*
*****************************************************************************/
extern HINSTANCE g_hinst;
extern HCURSOR g_hcurWait;
extern HCURSOR g_hcurStarting;
extern DWORD g_dwDIVer;
#ifdef DEBUG
extern TCHAR g_tszInvalid[128];
#endif
extern DWORD g_dwEnumType;
extern DWORD g_dwEnumFlags;
#define SetWaitCursor() SetCursor(g_hcurWait)
/*****************************************************************************
*
* diqary.c - Dynamic arrays
*
*****************************************************************************/
typedef struct DARY {
PV rgx;
int cx;
int cxMax;
} DARY, *PDARY;
PV INLINE
Dary_GetPtrCbx(PDARY pdary, int ix, int cbX)
{
return pvAddPvCb(pdary->rgx, ix * cbX);
}
#define Dary_GetPtr(pdary, ix, X) Dary_GetPtrCbx(pdary, ix, cbX(X))
int EXTERNAL Dary_AppendCbx(PDARY pdary, PCV pvX, int cbX);
#define Dary_Append(pdary, pv) Dary_AppendCbx(pdary, pv, cbX(*(pv)))
void INLINE
Dary_Term(PDARY pdary)
{
if (pdary->rgx) {
LocalFree(pdary->rgx);
}
}
/*****************************************************************************
*
* diqchk.c
*
*****************************************************************************/
INT_PTR EXTERNAL Checklist_Init(void);
void EXTERNAL Checklist_Term(void);
void EXTERNAL Checklist_OnInitDialog(HWND hwnd, BOOL fReadOnly);
int EXTERNAL Checklist_AddString(HWND hwnd, UINT ids, BOOL fCheck);
void EXTERNAL Checklist_InitFinish(HWND hwnd);
void EXTERNAL Checklist_OnDestroy(HWND hwnd);
typedef struct CHECKLISTFLAG {
DWORD flMask;
UINT ids;
} CHECKLISTFLAG, *PCHECKLISTFLAG;
void EXTERNAL Checklist_InitFlags(HWND hdlg, int idc,
DWORD fl, PCHECKLISTFLAG rgclf, UINT cclf);
/*****************************************************************************
*
* diqvlist.c
*
*****************************************************************************/
typedef HRESULT (CALLBACK *EDITUPDATEPROC)
(LPCTSTR ptszValue, PV pvRef1, PV pvRef2);
typedef HRESULT (CALLBACK *PROPUPDATEPROC)
(LPDIPROPHEADER pdiph, PV pvRef1, PV pvRef2);
#define CCHMAXINT 64
//#define Vlist_OnInitDialog(hwnd)
void EXTERNAL Vlist_OnInitDialog(HWND hwndList);
void EXTERNAL Vlist_AddHexValue(HWND hwnd, UINT ids, DWORD dwValue);
void EXTERNAL Vlist_AddIntValue(HWND hwnd, UINT ids, DWORD dwValue);
void EXTERNAL Vlist_AddBoolValue(HWND hwnd, UINT ids, DWORD dwValue);
void EXTERNAL Vlist_AddValue(HWND hwnd, UINT ids, LPCTSTR ptszValue);
void EXTERNAL Vlist_AddValueRW(HWND hwnd, UINT ids, LPCTSTR ptszValue,
EDITUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL Vlist_AddNumValueRW(HWND hwnd, UINT ids,
LPDIPROPDWORD pdipdw, int iMin, int iMax, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL
Vlist_AddBoolValueRW(HWND hwnd, UINT ids, LPDIPROPDWORD pdipdw,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL
Vlist_AddRangeValueRW(HWND hwnd, UINT ids,
LPDIPROPRANGE pdiprg, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL
Vlist_AddCalValueRW(HWND hwnd, UINT ids,
LPDIPROPCAL pdical, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL
Vlist_AddFlags(HWND hwnd, DWORD fl, PCHECKLISTFLAG rgclf, UINT cclf);
void EXTERNAL Vlist_OnSelChange(HWND hwnd);
void EXTERNAL Vlist_OnDestroy(HWND hwnd);
/*****************************************************************************
*
* VLISTITEM
*
* This goes at the beginning of every vlist item goofy thing.
*
*****************************************************************************/
typedef struct VLISTITEM {
const struct VLISTVTBL *pvtbl;
} VLISTITEM, *PVLISTITEM;
/*
* This is the actual VTBL.
*/
typedef struct VLISTVTBL {
/*
* The dialog is about to be shown. Set the control
* values accordingly.
*/
STDMETHOD_(void, PreDisplay)(HWND, PV);
/*
* Destroy cleans up whatever needs to be cleaned up.
* It does not free the PVLISTITEM itself; the caller
* will do that.
*/
STDMETHOD_(void, Destroy)(PV);
/*
* The dialog box to create.
*/
UINT idd;
DLGPROC dp;
} VLISTVTBL;
typedef const VLISTVTBL *PVLISTVTBL;
PVLISTITEM EXTERNAL
VBool_Create(LPDIPROPDWORD pdipdw, PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
PVLISTITEM EXTERNAL
VEdit_Create(LPCTSTR ptsz, EDITUPDATEPROC Update, PV pvRef1, PV pvRef2);
PVLISTITEM EXTERNAL
VInt_Create(LPDIPROPDWORD pdipdw, int iMin, int iMax, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
PVLISTITEM EXTERNAL
VRange_Create(LPDIPROPRANGE pdiprg, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
PVLISTITEM EXTERNAL
VCal_Create(LPDIPROPCAL pdical, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2);
void EXTERNAL UpDown_SetRange(HWND hwndUD, int min, int max);
void EXTERNAL UpDown_SetPos(HWND hwndUD, int iRadix, int iValue);
BOOL EXTERNAL UpDown_GetPos(HWND hwndUD, LPINT pi);
/*****************************************************************************
*
* diquick.c
*
*****************************************************************************/
UINT EXTERNAL GetCheckedRadioButton(HWND hdlg, UINT idFirst, UINT idLast);
int EXTERNAL SemimodalDialogBoxParam(UINT, HWND, DLGPROC, LPARAM);
int EXTERNAL SemimodalPropertySheet(HWND hwndOwner, LPPROPSHEETHEADER ppsh);
int __cdecl MessageBoxV(HWND hdlg, UINT ids, ...);
int EXTERNAL ThreadFailHres(HWND hdlg, UINT ids, HRESULT hres);
void EXTERNAL RecalcCursor(HWND hdlg);
STDMETHODIMP CreateDI(BOOL fOle, UINT flCreate, PV ppvOut);
/*
* CDIFL_UNICODE must be 1 because we steal the return values from
* IsDlgButtonChecked() and IsUnicodeDidc().
*
* If you change the values of any of these flags, make sure also to
* update the table in CreateDI().
*/
#define CDIFL_UNICODE 0x0001
#define CDIFL_DI2 0x0002
STDMETHODIMP GetDwordProperty(IDirectInputDevice8 *pdid, PCGUID, LPDWORD pdw);
STDMETHODIMP SetDwordProperty(IDirectInputDevice8 *pdid, PCGUID, DWORD dw);
typedef struct DEVDLGINFO *PDEVDLGINFO;
void EXTERNAL ConvertString(BOOL, LPCVOID, LPTSTR, UINT);
void EXTERNAL UnconvertString(BOOL, LPCTSTR, LPVOID, UINT);
void EXTERNAL ConvertDoi(PDEVDLGINFO, LPDIDEVICEOBJECTINSTANCE, LPCVOID);
HRESULT EXTERNAL GetObjectInfo(PDEVDLGINFO, LPDIDEVICEOBJECTINSTANCE,
DWORD, DWORD);
void EXTERNAL ConvertDdi(PDEVDLGINFO, LPDIDEVICEINSTANCE, LPCVOID);
HRESULT EXTERNAL GetDeviceInfo(PDEVDLGINFO, LPDIDEVICEINSTANCE);
void EXTERNAL ConvertEffi(PDEVDLGINFO, LPDIEFFECTINFO, LPCVOID);
HRESULT EXTERNAL GetEffectInfo(PDEVDLGINFO, LPDIEFFECTINFO, REFGUID);
void EXTERNAL StringFromGuid(LPTSTR ptsz, REFGUID rclsid);
/*
* Note that GUID names do not need to be localized.
*/
typedef struct GUIDMAP {
REFGUID rguid;
LPCTSTR ptsz;
} GUIDMAP, *PGUIDMAP;
LPCTSTR EXTERNAL MapGUID(REFGUID rguid, LPTSTR ptszBuf);
/*****************************************************************************
*
* diqmain.c
*
*****************************************************************************/
extern GUID GUID_Uninit;
INT_PTR CALLBACK Diq_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
/*
* A worker thread has finished its startup.
*/
#define WM_THREADSTARTED WM_APP
/*
* A semi-modal dialog box has exited.
*/
#define WM_CHILDEXIT (WM_APP+1)
/*
* You are idle.
*/
#define WM_SELFENTERIDLE (WM_APP+2)
/*
* Property used to record read-only-ness of a checklist.
*/
#define propReadOnly MAKEINTRESOURCE(WM_APP)
/*****************************************************************************
*
* diqcpl.c
*
*****************************************************************************/
INT_PTR EXTERNAL Cpl_Create(HWND hdlg, BOOL fOle, UINT fl);
/*****************************************************************************
*
* diqfind.c
*
*****************************************************************************/
INT_PTR EXTERNAL Find_Create(HWND hdlg, BOOL fOle, UINT flCreate);
/*****************************************************************************
*
* diqedev.c
*
*****************************************************************************/
INT_PTR EXTERNAL DEnum_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
/*****************************************************************************
*
* diqhack.c
*
*****************************************************************************/
INT_PTR INTERNAL Diq_HackPropertySheets(HWND hdlg);
/*****************************************************************************
*
* diqdev.c
*
*****************************************************************************/
INT_PTR EXTERNAL Dev_Create(HWND hdlg, BOOL fOle, UINT flCreate,
PCGUID pguidInstance, LPCTSTR ptszDesc,
UINT didcItf);
/*****************************************************************************
*
* diqacq.c
*
* Acquisition vtbl
*
*****************************************************************************/
typedef struct ACQVTBL {
STDMETHOD(UpdateStatus)(PDEVDLGINFO pddi, LPTSTR ptszBuf);
STDMETHOD(SetDataFormat)(PDEVDLGINFO pddi);
STDMETHOD_(void, Destroy)(PDEVDLGINFO pddi);
LPCDIDATAFORMAT pdf;
} ACQVTBL, *PACQVTBL;
STDMETHODIMP Common_AcqSetDataFormat(PDEVDLGINFO pddi);
STDMETHODIMP_(void) Common_AcqDestroy(PDEVDLGINFO pddi);
extern ACQVTBL c_acqvtblDevMouse;
extern ACQVTBL c_acqvtblDevMouse2;
extern ACQVTBL c_acqvtblDevKbd;
extern ACQVTBL c_acqvtblDevJoy;
extern ACQVTBL c_acqvtblDev;
INT_PTR CALLBACK Mode_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK Caps_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK EObj_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK EEff_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK Acq_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK Prop_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp);
#define EACH_PROPSHEET(f) \
f(IDD_DEV, Mode_DlgProc), \
f(IDD_CAPS, Caps_DlgProc), \
f(IDD_ENUMOBJ, EObj_DlgProc), \
f(IDD_ENUMEFF, EEff_DlgProc), \
f(IDD_ACQ, Acq_DlgProc), \
/*****************************************************************************
*
* Device dialog instance data
*
* Instance data for device dialog box.
*
* The first batch of information describes how the object should be
* created.
*
* The second batch of information keeps track of the object once
* we've got it.
*
* A pointer to this structure is the lParam of the property sheet
* page.
*
*
*****************************************************************************/
typedef struct DEVDLGINFO {
HWND hdlgOwner; /* Owner window */
BOOL fOle; /* Should we create via OLE? */
UINT flCreate; /* Flags */
PCGUID pguidInstance; /* Device instance to use */
LPCTSTR ptszDesc; /* Name of device */
UINT didcItf; /* Interface to create on the device */
PACQVTBL pvtbl;
IDirectInputDevice8 *pdid; /* The thing we created */
/* Updated by the Mode page */
DWORD discl; /* Cooperative level */
DWORD disclLastTry; /* Last cooperative level the user clicked on */
BOOL fPoll; /* Use polling mode */
BOOL fAbs; /* Abs or Rel mode? */
/* Maintained by the Data page */
HANDLE hevt; /* If in event-driven mode */
BOOL fAcquired; /* Is the device acquired? */
HWND hwndState; /* Handle of state control */
HWND hwndData; /* Handle of data control */
int celtData; /* Number of items in the data control */
int celtDataMax; /* Max number of items in the data control */
WNDPROC wpListbox; /* Previous listbox window procedure */
/* Maintained by the AcqVtbl */
LPVOID pvAcq; /* For ACQVTBL use */
/* Maintained by the Effect page */
DARY daryGuid; /* Array of enumerated effect GUIDs */
} DEVDLGINFO;
/*****************************************************************************
*
* diqtype.c - joystick type info
*
*****************************************************************************/
INT_PTR EXTERNAL
Type_Create(HWND hdlg, struct IDirectInputJoyConfig *pdjc, LPCWSTR pwszType);
/*****************************************************************************
*
* diquv - joystick user values
*
*****************************************************************************/
INT_PTR EXTERNAL
Uv_Create(HWND hdlg, struct IDirectInputJoyConfig *pdjc);
/*****************************************************************************
*
* diqeprop.c - efect properties
*
*****************************************************************************/
INT_PTR EXTERNAL
EffProp_Create(HWND hdlg, PDEVDLGINFO pddi, REFGUID rguidEff);
#endif