921 lines
28 KiB
C
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
|