windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/rundftest.cpp
2020-09-26 16:20:57 +08:00

278 lines
9.4 KiB
C++

#include "common.hpp"
#define TOW(a) L##a
static const GUID g_AppGuid =
{ 0x238d8220, 0x7a5d, 0x11d3, { 0x8f, 0xb2, 0x0, 0xc0, 0x4f, 0x8e, 0xc6, 0x27 } };
static const GUID GUID_DIConfigAppEditLayout =
{ 0xfd4ace13, 0x7044, 0x4204, { 0x8b, 0x15, 0x9, 0x52, 0x86, 0xb1, 0x2e, 0xad } };
//for axes commands: AXIS_LR and AXIS_UD
#define AXIS_MASK 0x80000000l
#define AXIS_LR (AXIS_MASK | 1)
#define AXIS_UD (AXIS_MASK | 2)
// "Keyboard" commands
#define KEY_STOP 0x00000001l
#define KEY_DOWN 0x00000002l
#define KEY_LEFT 0x00000004l
#define KEY_RIGHT 0x00000008l
#define KEY_UP 0x00000010l
#define KEY_FIRE 0x00000020l
#define KEY_THROW 0x00000040l
#define KEY_SHIELD 0x00000080l
#define KEY_DISPLAY 0x00000100l
#define KEY_QUIT 0x00000200l
#define KEY_EDIT 0x00000400l
DIACTIONFORMATW *GetTestActionFormats()
{
static DIACTIONW g_rgGameAction1[] = {
{AXIS_UD, DIAXIS_FPS_MOVE, 0, TOW("Forward"),},
{AXIS_LR, DIAXIS_FPS_ROTATE, 0, TOW("Rotate"),},
{KEY_FIRE, DIBUTTON_FPS_FIRE, 0, TOW("Fire"),},
{KEY_THROW, DIBUTTON_FPS_WEAPONS, 0, TOW("Change Weapon"),},
{KEY_SHIELD, DIBUTTON_FPS_APPLY, 0, TOW("Shield"),},
{KEY_STOP, DIBUTTON_FPS_SELECT, 0, TOW("Pause"),},
{KEY_THROW, DIBUTTON_FPS_CROUCH, 0, TOW("Hyper space"),},
{KEY_THROW, DIBUTTON_FPS_JUMP, 0, TOW("Launch Probe"),},
{KEY_DISPLAY,DIBUTTON_FPS_DISPLAY, 0, TOW("Display"),},
{KEY_QUIT, DIBUTTON_FPS_MENU, 0, TOW("Quit Game"),},
{KEY_EDIT, DIBUTTON_FPS_DODGE, 0, TOW("Edit Configuration"),},
{KEY_LEFT, DIKEYBOARD_LEFT, 0, TOW("Turn +"),},
{KEY_RIGHT, DIKEYBOARD_RIGHT, 0, TOW("Turn -"),},
{KEY_UP, DIKEYBOARD_UP, 0, TOW("Move Up"),},
{KEY_DOWN, DIKEYBOARD_DOWN, 0, TOW("Move Down"),},
{KEY_STOP, DIKEYBOARD_S, 0, TOW("Stop Game"),},
{KEY_FIRE, DIKEYBOARD_SPACE, 0, TOW("Shoot"),},
{KEY_THROW, DIKEYBOARD_T, 0, TOW("Throw"),},
{KEY_SHIELD, DIKEYBOARD_H, 0, TOW("Shield"),},
{KEY_DISPLAY,DIKEYBOARD_D, 0, TOW("Display"),},
{KEY_QUIT, DIKEYBOARD_Q, 0, TOW("Quit Game"),},
{KEY_EDIT, DIKEYBOARD_E, 0, TOW("Edit Configuration"),},
{AXIS_LR, DIMOUSE_XAXIS, 0, TOW("Turn"), },
{AXIS_UD, DIMOUSE_YAXIS, 0, TOW("Move"), },
{KEY_FIRE, DIMOUSE_BUTTON0, 0, TOW("Fire"), },
{KEY_SHIELD, DIMOUSE_BUTTON1, 0, TOW("Shield"),},
{KEY_THROW, DIMOUSE_BUTTON2, 0, TOW("Change Weapon"),},
};
const int g_nGameActions1 = sizeof(g_rgGameAction1) / sizeof(DIACTIONW);
static DIACTIONW g_rgGameAction2[] = {
{AXIS_UD, DIAXIS_FPS_MOVE, 0, TOW("FORWARD"),},
{AXIS_LR, DIAXIS_FPS_ROTATE, 0, TOW("ROTATE"),},
{KEY_FIRE, DIBUTTON_FPS_FIRE, 0, TOW("FIRE"),},
{KEY_SHIELD, DIBUTTON_FPS_APPLY, 0, TOW("SHIELD"),},
{KEY_STOP, DIBUTTON_FPS_SELECT, 0, TOW("PAUSE"),},
{KEY_DISPLAY,DIBUTTON_FPS_DISPLAY, 0, TOW("DISPLAY"),},
{KEY_QUIT, DIBUTTON_FPS_MENU, 0, TOW("QUIT GAME"),},
{KEY_EDIT, DIBUTTON_FPS_DODGE, 0, TOW("EDIT CONFIGURATION"),},
{KEY_LEFT, DIKEYBOARD_LEFT, 0, TOW("TURN +"),},
{KEY_RIGHT, DIKEYBOARD_RIGHT, 0, TOW("TURN -"),},
{KEY_UP, DIKEYBOARD_UP, 0, TOW("MOVE UP"),},
{KEY_DOWN, DIKEYBOARD_DOWN, 0, TOW("MOVE DOWN"),},
{KEY_STOP, DIKEYBOARD_S, 0, TOW("STOP GAME"),},
{KEY_FIRE, DIKEYBOARD_SPACE, 0, TOW("SHOOT"),},
{KEY_SHIELD, DIKEYBOARD_H, 0, TOW("SHIELD"),},
{KEY_DISPLAY,DIKEYBOARD_D, 0, TOW("DISPLAY"),},
{KEY_QUIT, DIKEYBOARD_Q, 0, TOW("QUIT GAME"),},
{KEY_EDIT, DIKEYBOARD_E, 0, TOW("EDIT CONFIGURATION"),},
{AXIS_LR, DIMOUSE_XAXIS, 0, TOW("TURN"), },
{AXIS_UD, DIMOUSE_YAXIS, 0, TOW("MOVE"), },
{KEY_FIRE, DIMOUSE_BUTTON0, 0, TOW("FIRE"), },
{KEY_SHIELD, DIMOUSE_BUTTON1, 0, TOW("SHIELD"),},
};
const int g_nGameActions2 = sizeof(g_rgGameAction2) / sizeof(DIACTIONW);
static DIACTIONW g_rgGameAction3[] = {
{AXIS_UD, DIAXIS_FPS_MOVE, 0, TOW("Forward"),},
{AXIS_LR, DIAXIS_FPS_ROTATE, 0, TOW("Rotate"),},
{KEY_FIRE, DIBUTTON_FPS_FIRE, 0, TOW("Fire"),},
{KEY_SHIELD, DIBUTTON_FPS_APPLY, 0, TOW("Shield"),},
{KEY_STOP, DIBUTTON_FPS_SELECT, 0, TOW("PausePausePausePausePausePausePausePausePausePausePausePausePausePausePausePause"),},
{KEY_DISPLAY,DIBUTTON_FPS_DISPLAY, 0, TOW("Display"),},
{KEY_QUIT, DIBUTTON_FPS_MENU, 0, TOW("Quit Game"),},
{KEY_LEFT, DIKEYBOARD_LEFT, 0, TOW("Turn +"),},
{KEY_RIGHT, DIKEYBOARD_RIGHT, 0, TOW("Turn -"),},
{KEY_UP, DIKEYBOARD_UP, 0, TOW("Move Up"),},
{KEY_DOWN, DIKEYBOARD_DOWN, 0, TOW("Move Down"),},
{KEY_STOP, DIKEYBOARD_S, 0, TOW("Stop Game"),},
{KEY_FIRE, DIKEYBOARD_SPACE, 0, TOW("Shoot"),},
{KEY_SHIELD, DIKEYBOARD_H, 0, TOW("Shield"),},
{KEY_DISPLAY,DIKEYBOARD_D, 0, TOW("Display"),},
{KEY_QUIT, DIKEYBOARD_Q, 0, TOW("Quit Game"),},
{AXIS_LR, DIMOUSE_XAXIS, 0, TOW("Turn"), },
{AXIS_UD, DIMOUSE_YAXIS, 0, TOW("Move"), },
{KEY_FIRE, DIMOUSE_BUTTON0, 0, TOW("Fire"), },
{KEY_SHIELD, DIMOUSE_BUTTON1, 0, TOW("Shield"),},
};
const int g_nGameActions3 = sizeof(g_rgGameAction3) / sizeof(DIACTIONW);
static struct _ACTIONARRAYELEMENT {
DIACTIONW *rgActions;
int nActions;
LPCWSTR name;
} g_rgActionArray[] = {
{g_rgGameAction1, g_nGameActions1, TOW("Genre 1")},
{g_rgGameAction2, g_nGameActions2, TOW("Genre 2")},
{g_rgGameAction3, g_nGameActions3, TOW("Genre 3")},
};
const int g_nActionArrays = sizeof(g_rgActionArray) / sizeof(_ACTIONARRAYELEMENT);
const int nMaxFormats = g_nActionArrays;
static DIACTIONFORMATW af[nMaxFormats];
for (int i = 0; i < nMaxFormats; i++)
{
ZeroMemory(&(af[i]), sizeof(DIACTIONFORMATW));
af[i].dwSize = sizeof(DIACTIONFORMATW);
af[i].dwActionSize = sizeof(DIACTIONW);
wcscpy(af[i].tszActionMap, g_rgActionArray[i].name);
af[i].guidActionMap = g_AppGuid;
af[i].dwGenre = DIVIRTUAL_FIGHTING_FPS;
af[i].dwNumActions = (DWORD)g_rgActionArray[i].nActions;
af[i].dwDataSize = af[i].dwNumActions * sizeof(DWORD);
af[i].rgoAction = g_rgActionArray[i].rgActions;
af[i].lAxisMin = -100;
af[i].lAxisMax = 100;
af[i].dwBufferSize = 16;
}
return af;
}
HRESULT RunDFTest(LPTESTCONFIGUIPARAMS params)
{
if (params == NULL || params->dwSize != sizeof(TESTCONFIGUIPARAMS))
return E_INVALIDARG;
HRESULT ret_hr = S_OK;
HINSTANCE hInstance = GetModuleHandle(0);
LPWSTR wszUserNames = NULL;
DICONFIGUREDEVICESPARAMSW p;
DWORD dwFlags = 0;
#define FAIL(e,s) \
{ \
CopyStr(params->wszErrorText, s, MAX_PATH); \
ret_hr = e; \
goto cleanup; \
}
if (params->eDisplay != TUI_DISPLAY_GDI)
FAIL(E_NOTIMPL, "Only display type GDI is implemented.");
if (params->nNumAcFors < 1 || params->nNumAcFors > 3)
FAIL(E_INVALIDARG, "Only 1 to 3 Action Formats supported.");
switch (params->eConfigType)
{
case TUI_CONFIGTYPE_VIEW:
dwFlags |= DICD_DEFAULT;
break;
case TUI_CONFIGTYPE_EDIT:
dwFlags |= DICD_EDIT;
break;
default:
FAIL(E_INVALIDARG, "Unknown ConfigType.");
}
ZeroMemory(&p, sizeof(DICONFIGUREDEVICESPARAMSW));
p.dwSize = sizeof(DICONFIGUREDEVICESPARAMSW);
ZeroMemory(&p.dics, sizeof(DICOLORSET));
p.dics.dwSize = sizeof(DICOLORSET);
switch (params->nColorScheme)
{
case 1:
p.dics.cTextFore = ((D3DCOLOR)RGB(255,255,255));
p.dics.cTextHighlight = ((D3DCOLOR)RGB(255,150,255));
p.dics.cCalloutLine = ((D3DCOLOR)RGB(191,191,0));
p.dics.cCalloutHighlight = ((D3DCOLOR)RGB(255,255,0));
p.dics.cBorder = ((D3DCOLOR)RGB(0,0,191));
p.dics.cControlFill = ((D3DCOLOR)RGB(0,127,255));
p.dics.cHighlightFill = ((D3DCOLOR)RGB(0,0,100));
p.dics.cAreaFill = ((D3DCOLOR)RGB(0,0,0));
break;
}
if (params->lpwszUserNames != NULL)
{
p.dwcUsers = CountSubStrings(params->lpwszUserNames);
if (p.dwcUsers >= 1)
wszUserNames = DupSuperString(params->lpwszUserNames);
}
else
p.dwcUsers = 0;
p.lptszUserNames = wszUserNames;
p.dwcFormats = (DWORD)params->nNumAcFors;
p.lprgFormats = GetTestActionFormats();
if (params->bEditLayout)
p.lprgFormats[0].guidActionMap = GUID_DIConfigAppEditLayout;
p.hwnd = NULL;
//p.dics = ;
p.lpUnkDDSTarget = NULL;
switch (params->eVia)
{
case TUI_VIA_DI:
{
//set up DInput and call ConfigureDevices
IDirectInput8W* pDInput = NULL;
DWORD dwVer = DIRECTINPUT_VERSION;
HRESULT hres = DirectInput8Create(hInstance, dwVer, IID_IDirectInput8W, (LPVOID *)&pDInput, NULL);
if (FAILED(hres))
FAIL(hres, "DirectInput8Create() failed.");
hres = pDInput->ConfigureDevices(NULL, &p, dwFlags, NULL);
pDInput->Release();
if (FAILED(hres))
FAIL(hres, "ConfigureDevices() failed.");
break;
}
case TUI_VIA_CCI:
{
IDirectInputActionFramework* pIFrame = NULL;
HINSTANCE hInst = NULL;
HRESULT hres = PrivCreateInstance(CLSID_CDirectInputActionFramework, NULL, CLSCTX_INPROC_SERVER, IID_IDIActionFramework, (LPVOID*)&pIFrame, &hInst);
if (FAILED(hres))
FAIL(hres, "PrivCreateInstance() failed.");
hres = pIFrame->ConfigureDevices(NULL, &p, dwFlags, NULL);
pIFrame->Release();
if (hInst != NULL)
FreeLibrary(hInst);
hInst = NULL;
if (FAILED(hres))
FAIL(hres, "ConfigureDevices() failed.");
break;
}
default:
FAIL(E_INVALIDARG, "Unknown Via type.");
}
cleanup:
if (wszUserNames != NULL)
free(wszUserNames);
wszUserNames = NULL;
return ret_hr;
}