#include "stdhdr.h"
#include "Input.h"
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")
IDirectInput8 *g_pDI;
LPDIRECTINPUTDEVICE8 *g_pDeviceArray = NULL;
int g_nDevices = 0;
static DIACTIONFORMAT g_diaf;
BOOL CALLBACK DIEnumDevicesBySemanticsCallback(LPCDIDEVICEINSTANCE lpddi,
IDirectInputDevice8 *lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef);
BOOL InitDirectInput()
{
HRESULT h;
h = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8,
(void **)&g_pDI, NULL);
if (FAILED(h))
return FALSE;
ZeroMemory(&g_diaf, sizeof(DIACTIONFORMAT));
g_diaf.dwSize = sizeof(DIACTIONFORMAT);
g_diaf.dwActionSize = sizeof(DIACTION);
g_diaf.rgoAction = g_rgActions;
g_diaf.dwNumActions = g_nActions;
g_diaf.dwDataSize = g_diaf.dwNumActions * sizeof(DWORD);
g_diaf.guidActionMap = g_guidApp;
g_diaf.dwGenre = g_dwGenre;
g_diaf.dwBufferSize = 16;
g_diaf.lAxisMin = -100;
g_diaf.lAxisMax = 100;
_tcscpy(g_diaf.tszActionMap, g_tszActionMapName);
h = g_pDI->EnumDevicesBySemantics(NULL, &g_diaf,
DIEnumDevicesBySemanticsCallback,
NULL, DIEDBSFL_ATTACHEDONLY);
if (FAILED(h))
return FALSE;
return TRUE;
}
void ExitDirectInput()
{
for (int iDevice = 0; iDevice < g_nDevices; iDevice++)
g_pDeviceArray[iDevice]->Release();
delete [] g_pDeviceArray;
g_pDeviceArray = NULL;
g_nDevices = 0;
if (g_pDI != NULL)
{
g_pDI->Release();
g_pDI = NULL;
}
}
void AcquireDevices()
{
for (int iDevice = 0; iDevice < g_nDevices; iDevice++)
g_pDeviceArray[iDevice]->Acquire();
}
void UnacquireDevices()
{
if (g_pDeviceArray == NULL)
return;
for (int iDevice = 0; iDevice < g_nDevices; iDevice++)
g_pDeviceArray[iDevice]->Unacquire();
}
BOOL CALLBACK DIEnumDevicesBySemanticsCallback(LPCDIDEVICEINSTANCE lpddi,
IDirectInputDevice8 *lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
{
HRESULT h;
if (GET_DIDEVICE_TYPE(lpddi->dwDevType) == DI8DEVTYPE_DEVICECTRL)
return DIENUM_CONTINUE;
h = lpdid->SetCooperativeLevel(hWndMain, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
if (FAILED(h))
return DIENUM_CONTINUE;
h = lpdid->BuildActionMap(&g_diaf, NULL, DIDBAM_DEFAULT);
if (FAILED(h))
return DIENUM_CONTINUE;
for (DWORD i = 0; i < g_diaf.dwNumActions; i++)
{
if (g_diaf.rgoAction[i].dwHow != DIAH_UNMAPPED)
break;
}
if (i < g_diaf.dwNumActions)
{
h = lpdid->SetActionMap(&g_diaf, NULL, DIDSAM_DEFAULT);
if (FAILED(h))
return DIENUM_CONTINUE;
if (g_pDeviceArray == NULL)
g_pDeviceArray = new LPDIRECTINPUTDEVICE8[dwRemaining + 1];
g_pDeviceArray[g_nDevices] = lpdid;
g_nDevices++;
lpdid->AddRef();
}
return DIENUM_CONTINUE;
}
#define INPUT_DATA_LIMIT 20
void CheckInput()
{
DIDEVICEOBJECTDATA pdidod[INPUT_DATA_LIMIT];
DWORD dwObjCount;
if (g_pDeviceArray == NULL)
return;
for (int iDevice = 0; iDevice < g_nDevices; iDevice++)
{
g_pDeviceArray[iDevice]->Poll();
dwObjCount = INPUT_DATA_LIMIT;
g_pDeviceArray[iDevice]->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
pdidod,
&dwObjCount, 0);
for (DWORD i = 0; i < dwObjCount; i++)
HandleAction(pdidod[i].uAppData, pdidod[i].dwData);
}
}