1057 lines
31 KiB
C++
1057 lines
31 KiB
C++
|
//===========================================================================
|
||
|
// dimaptst.cpp
|
||
|
//
|
||
|
// DirectInput Mapper test tool
|
||
|
//
|
||
|
// Build options:
|
||
|
// Internal Test Tool
|
||
|
// -DINTERNAL -DTESTAPP
|
||
|
//
|
||
|
// External DDK Configuration Tool
|
||
|
// -DDDKAPP
|
||
|
//
|
||
|
// Functions:
|
||
|
// WinMain
|
||
|
// dimaptstMainDlgProc
|
||
|
// dimaptstOnInitDialog
|
||
|
// dimaptstOnClose
|
||
|
// dimaptstOnCommand
|
||
|
// dimaptstOnUpdateControlData
|
||
|
// dmtGetCheckedRadioButton
|
||
|
//
|
||
|
// History:
|
||
|
// 08/19/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
|
||
|
#define INITGUID
|
||
|
|
||
|
#include "dimaptst.h"
|
||
|
#include "dmtabout.h"
|
||
|
#include "dmtinput.h"
|
||
|
#include "dmtcfg.h"
|
||
|
#include "dmttest.h"
|
||
|
//#include "dmtwrite.h"
|
||
|
#include "dmtstress.h"
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef NTAPI
|
||
|
#define NTAPI __stdcall
|
||
|
#endif
|
||
|
|
||
|
#ifndef NTSYSAPI
|
||
|
#define NTSYSAPI __declspec(dllimport)
|
||
|
#endif
|
||
|
|
||
|
#ifndef NTSTATUS
|
||
|
typedef LONG NTSTATUS;
|
||
|
#endif
|
||
|
|
||
|
#ifndef PCSZ
|
||
|
typedef CONST char *PCSZ;
|
||
|
#endif
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
NTSYSAPI NTSTATUS NTAPI RtlCharToInteger(PCSZ szString,
|
||
|
ULONG ulBase,
|
||
|
ULONG *puValue);
|
||
|
NTSYSAPI ULONG NTAPI RtlNtStatusToDosError(NTSTATUS nts);
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
// app global variables
|
||
|
HINSTANCE ghinst = NULL;
|
||
|
HANDLE ghEvent = NULL;
|
||
|
CRITICAL_SECTION gcritsect;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
// file global variables
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// WinMain
|
||
|
//
|
||
|
// App entry point
|
||
|
//
|
||
|
// Parameters: (see SDK help for parameter details)
|
||
|
// HINSTANCE hinst
|
||
|
// HINSTANCE hinstPrev
|
||
|
// LPSTR szCmdParams
|
||
|
// int nShow
|
||
|
//
|
||
|
// Returns: (see SDK help for return value details)
|
||
|
// int
|
||
|
//
|
||
|
// History:
|
||
|
// 08/19/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
int WINAPI WinMain(HINSTANCE hinst,
|
||
|
HINSTANCE hinstPrev,
|
||
|
PSTR szCmdParams,
|
||
|
int nShow)
|
||
|
{
|
||
|
//int n = 0;
|
||
|
//JJ 64Bit Compat
|
||
|
INT_PTR n = 0;
|
||
|
|
||
|
// initialize DPF
|
||
|
DbgInitialize(TRUE);
|
||
|
DbgEnable(TRUE);
|
||
|
|
||
|
// see if our ini file exists
|
||
|
n = GetPrivateProfileIntA("0",
|
||
|
"AI0",
|
||
|
0,
|
||
|
GENRES_INI);
|
||
|
if(0 == n)
|
||
|
{
|
||
|
// file does not exist
|
||
|
//
|
||
|
// inform user and bail
|
||
|
MessageBoxA(NULL,
|
||
|
"Please copy genre.ini to the current folder.",
|
||
|
"Unable to locate genre.ini",
|
||
|
MB_OK);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// initialize Win9x common controls (progress bars, etc)
|
||
|
InitCommonControls();
|
||
|
|
||
|
|
||
|
// intialize COM
|
||
|
if(FAILED(CoInitialize(NULL)))
|
||
|
{
|
||
|
DPF(0, "COM initialization failed... exiting");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// save our instance handle
|
||
|
ghinst = hinst;
|
||
|
|
||
|
// create our critical section
|
||
|
InitializeCriticalSection(&gcritsect);
|
||
|
|
||
|
// create our signal event
|
||
|
ghEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||
|
|
||
|
// create our main dialog window
|
||
|
n = DialogBoxParamA(hinst,
|
||
|
MAKEINTRESOURCEA(IDD_MAIN),
|
||
|
(HWND)NULL,
|
||
|
dimaptstMainDlgProc,
|
||
|
(LPARAM)NULL);
|
||
|
if(-1 == n)
|
||
|
{
|
||
|
DPF(0, "WinMain - DialogBoxParamA returned an error (%d)",
|
||
|
GetLastError());
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
CloseHandle(ghEvent);
|
||
|
DeleteCriticalSection(&gcritsect);
|
||
|
CoUninitialize();
|
||
|
return (int)n;
|
||
|
|
||
|
} //*** end WinMain()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstMainDlgProc
|
||
|
//
|
||
|
// Main application dialog processing function
|
||
|
//
|
||
|
// Parameters: (see SDK help for parameter details)
|
||
|
// HWND hwnd
|
||
|
// UINT uMsg
|
||
|
// WPARAM wparam
|
||
|
// LPARAM lparam
|
||
|
//
|
||
|
// Returns: (see SDK help for return value details)
|
||
|
// BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 08/19/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
/*BOOL*/INT_PTR CALLBACK dimaptstMainDlgProc(HWND hwnd,
|
||
|
UINT uMsg,
|
||
|
WPARAM wparam,
|
||
|
LPARAM lparam)
|
||
|
{
|
||
|
switch(uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
return dimaptstOnInitDialog(hwnd,
|
||
|
(HWND)wparam,
|
||
|
lparam);
|
||
|
|
||
|
case WM_CLOSE:
|
||
|
return dimaptstOnClose(hwnd);
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
return dimaptstOnCommand(hwnd,
|
||
|
LOWORD(wparam),
|
||
|
(HWND)lparam,
|
||
|
HIWORD(wparam));
|
||
|
|
||
|
|
||
|
//JJ Comment: I am keeping the timer stuff around for now while getting rid of
|
||
|
//input polling because we are going to use it later in a different way; I will
|
||
|
//leave the timer stuff in for now and then add in the input stuff when more specific
|
||
|
//decisions are made concerning *what* exact performance/implementation is desired.
|
||
|
case WM_TIMER:
|
||
|
return dimaptstOnTimer(hwnd,
|
||
|
wparam);
|
||
|
|
||
|
case WM_DMT_UPDATE_LISTS:
|
||
|
return dimaptstOnUpdateLists(hwnd);
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstOnInitDialog
|
||
|
//
|
||
|
// Handle WM_INITDIALOG processing for the main dialogfs
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 08/20/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
BOOL dimaptstOnInitDialog(HWND hwnd,
|
||
|
HWND hwndFocus,
|
||
|
LPARAM lparam)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
|
||
|
/*int*/
|
||
|
//JJ 64Bit Compat
|
||
|
UINT_PTR nIdx = 0;
|
||
|
//LONG lPrev = 0L;
|
||
|
//JJ 64Bit Compat
|
||
|
LONG_PTR lPrev = 0;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
DMTGENRE_NODE *pNode = NULL;
|
||
|
|
||
|
DPF(5, "dimaptstOnInitDialog");
|
||
|
|
||
|
// give the system menu our icon
|
||
|
SendMessageA(hwnd,
|
||
|
WM_SETICON,
|
||
|
ICON_BIG,
|
||
|
(LPARAM)LoadIcon(ghinst,
|
||
|
MAKEINTRESOURCEA(IDI_DIMAPTST)));
|
||
|
SendMessageA(hwnd,
|
||
|
WM_SETICON,
|
||
|
ICON_SMALL,
|
||
|
(LPARAM)LoadIcon(ghinst,
|
||
|
MAKEINTRESOURCEA(IDI_DIMAPTST)));
|
||
|
|
||
|
// allocate the appinfo structure
|
||
|
pdmtai = (DMT_APPINFO*)LocalAlloc(LMEM_FIXED,
|
||
|
sizeof(DMT_APPINFO));
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
// serious app problem.
|
||
|
// we need to stop things right here and now
|
||
|
DPF(0, "dimaptstOnInitDialog - This is bad... "
|
||
|
"We failed to allocate appinfo");
|
||
|
DPF(0, "dimaptstOnInitDialog - Please find someone "
|
||
|
"to look at this right away");
|
||
|
DebugBreak();
|
||
|
return FALSE;
|
||
|
}
|
||
|
pdmtai->pGenreList = NULL;
|
||
|
pdmtai->pSubGenre = NULL;
|
||
|
pdmtai->pDeviceList = NULL;
|
||
|
pdmtai->fStartWithDefaults = FALSE;
|
||
|
|
||
|
// allocate the genre list
|
||
|
hRes = dmtcfgCreateGenreList(&(pdmtai->pGenreList));
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
// this is potentially very bad
|
||
|
// ISSUE-2001/03/29-Marcand we fault if we hit this
|
||
|
// really need to kill the app at this point
|
||
|
DPF(0, "dimaptstOnInitDialog - This is bad... "
|
||
|
"We failed to create genre list "
|
||
|
"(%s == %08Xh)",
|
||
|
dmtxlatHRESULT(hRes), hRes);
|
||
|
DPF(0, "dimaptstOnInitDialog - Check to be sure that %s "
|
||
|
" exists in the current directory",
|
||
|
GENRES_INI);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// set the hwnd userdata
|
||
|
SetLastError(0);
|
||
|
|
||
|
//JJ- 64Bit compat change
|
||
|
lPrev = SetWindowLongPtr(hwnd,
|
||
|
GWLP_USERDATA,
|
||
|
(LONG_PTR)pdmtai);
|
||
|
|
||
|
if(!lPrev && GetLastError())
|
||
|
{
|
||
|
// serious app problem.
|
||
|
// we need to stop things right here and now
|
||
|
DPF(0, "dimaptstOnInitDialog - This is bad... "
|
||
|
"We failed to store pList");
|
||
|
DPF(0, "dimaptstOnInitDialog - Please find someone "
|
||
|
"to look at this right away");
|
||
|
DebugBreak();
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// populate the controls
|
||
|
|
||
|
// genre list
|
||
|
pNode = pdmtai->pGenreList;
|
||
|
while(pNode)
|
||
|
{
|
||
|
// add the name to the list
|
||
|
nIdx = SendMessageA((HWND)GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_ADDSTRING,
|
||
|
0,
|
||
|
(LPARAM)(pNode->szName));
|
||
|
|
||
|
|
||
|
// add the node to the item data
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_SETITEMDATA,
|
||
|
nIdx,
|
||
|
(LPARAM)pNode);
|
||
|
|
||
|
// next node
|
||
|
pNode = pNode->pNext;
|
||
|
}
|
||
|
|
||
|
// set the selection to the first in the list
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_SETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// populate the subgenre list
|
||
|
SendMessageA(hwnd,
|
||
|
WM_DMT_UPDATE_LISTS,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// set the testing option
|
||
|
// CheckRadioButton(hwnd,
|
||
|
// IDC_USE_INTEGRATED,
|
||
|
// IDC_USE_CPL,
|
||
|
// IDC_USE_CPL);
|
||
|
|
||
|
#ifdef TESTAPP
|
||
|
//***************************************
|
||
|
// Internal app specific control settings
|
||
|
//***************************************
|
||
|
// set the verification option to automatic
|
||
|
CheckRadioButton(hwnd,
|
||
|
IDC_VERIFY_AUTOMATIC,
|
||
|
IDC_VERIFY_MANUAL,
|
||
|
IDC_VERIFY_AUTOMATIC);
|
||
|
|
||
|
#endif // TESTAPP
|
||
|
|
||
|
#ifdef DDKAPP
|
||
|
//***************************************
|
||
|
// DDK Tool specific control settings
|
||
|
//***************************************
|
||
|
|
||
|
// set default state for "start with defaults"
|
||
|
CheckDlgButton(hwnd,
|
||
|
IDC_START_WITH_DEFAULTS,
|
||
|
BST_CHECKED);
|
||
|
|
||
|
#endif // DDKAPP
|
||
|
|
||
|
SendMessageA(hwnd,
|
||
|
WM_COMMAND,
|
||
|
IDC_ENUM_DEVICES,
|
||
|
0L);
|
||
|
|
||
|
// done
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** end dimaptstOnInitDialog()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstOnClose
|
||
|
//
|
||
|
// Handle WM_CLOSE processing for the main dialog
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 08/20/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
BOOL dimaptstOnClose(HWND hwnd)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
HRESULT hr = S_OK;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
|
||
|
DPF(5, "dimaptstOnClose");
|
||
|
|
||
|
__try
|
||
|
{
|
||
|
// get appinfo
|
||
|
|
||
|
//JJ- 64Bit Compat
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd,
|
||
|
GWLP_USERDATA);
|
||
|
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
DPF(0, "dimaptstOnClose - unable to retrieve app info");
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// free appinfo
|
||
|
|
||
|
// device list first
|
||
|
hr = dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
|
||
|
if(S_OK == hRes)
|
||
|
{
|
||
|
DPF(2, "dimaptstOnClose - dmtinputFreeDeviceList (%s == %08Xh)",
|
||
|
dmtxlatHRESULT(hr), hr);
|
||
|
hRes = hr;
|
||
|
}
|
||
|
pdmtai->pDeviceList = NULL;
|
||
|
|
||
|
// then genre list
|
||
|
hRes = dmtcfgFreeGenreList(&(pdmtai->pGenreList));
|
||
|
if(S_OK == hRes)
|
||
|
{
|
||
|
DPF(2, "dimaptstOnClose - dmtinputFreeGenreList (%s == %08Xh)",
|
||
|
dmtxlatHRESULT(hr), hr);
|
||
|
hRes = hr;
|
||
|
}
|
||
|
pdmtai->pGenreList = NULL;
|
||
|
|
||
|
// parent structure
|
||
|
if(LocalFree((HLOCAL)pdmtai))
|
||
|
{
|
||
|
DPF(0, "dimaptstOnClose - LocalFree(app info) failed!");
|
||
|
if(S_OK == hRes)
|
||
|
{
|
||
|
hRes = DMT_S_MEMORYLEAK;
|
||
|
}
|
||
|
}
|
||
|
pdmtai = NULL;
|
||
|
|
||
|
}
|
||
|
_finally
|
||
|
{
|
||
|
// time to leave
|
||
|
EndDialog(hwnd, (int)hRes);
|
||
|
PostQuitMessage((int)hRes);
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return FALSE;
|
||
|
|
||
|
} //*** end dimaptstOnClose()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstOnCommand
|
||
|
//
|
||
|
// Handle WM_COMMAND processing for the main dialog
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 08/20/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
BOOL dimaptstOnCommand(HWND hwnd,
|
||
|
WORD wId,
|
||
|
HWND hwndCtrl,
|
||
|
WORD wNotifyCode)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
BOOL fEnable = FALSE;
|
||
|
BOOL fEnumSuitable = FALSE;
|
||
|
//JJ Added 64Bit Compat
|
||
|
LONG_PTR nIdx = -1;
|
||
|
UINT_PTR u = 0;
|
||
|
static UINT_PTR uGenSel = 0;
|
||
|
|
||
|
static UINT uSubSel = 0;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
DMTDEVICE_NODE *pDevice = NULL;
|
||
|
DMTGENRE_NODE *pGenre = NULL;
|
||
|
DMTSUBGENRE_NODE *pSubGenre = NULL;
|
||
|
#ifdef TESTAPP
|
||
|
int nWidth = 597;
|
||
|
int nHeight = 0;
|
||
|
#endif // TESTAPP
|
||
|
|
||
|
DPF(5, "dimaptstOnCommand");
|
||
|
|
||
|
// get app info (stored in hwnd userdata)
|
||
|
|
||
|
//JJ- 64Bit Compat
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd,
|
||
|
GWLP_USERDATA);
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
switch(wId)
|
||
|
{
|
||
|
case IDOK:
|
||
|
//JJ FIX UI
|
||
|
|
||
|
hRes = dmttestRunMapperCPL(hwnd,
|
||
|
FALSE);
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
// ISSUE-2001/03/29-timgill need to check return value
|
||
|
dmttestStopIntegrated(hwnd);
|
||
|
break;
|
||
|
|
||
|
case IDC_DEVICE_GENRES:
|
||
|
// check for selection change
|
||
|
if(CBN_DROPDOWN == wNotifyCode)
|
||
|
{
|
||
|
// memorize current selection
|
||
|
uGenSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
//JJ- 64Bit Compat
|
||
|
//0L);
|
||
|
0);
|
||
|
}
|
||
|
if(CBN_SELCHANGE == wNotifyCode)
|
||
|
{
|
||
|
// selection changed
|
||
|
//
|
||
|
// get the new selection
|
||
|
u = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
if(uGenSel != u)
|
||
|
{
|
||
|
SendMessageA(hwnd,
|
||
|
WM_DMT_UPDATE_LISTS,
|
||
|
0,
|
||
|
0L);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_SUBGENRES:
|
||
|
#ifndef DDKAPP
|
||
|
// check for selection change
|
||
|
if(CBN_DROPDOWN == wNotifyCode)
|
||
|
{
|
||
|
// memorize current selection
|
||
|
uSubSel = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
}
|
||
|
if(CBN_SELCHANGE == wNotifyCode)
|
||
|
{
|
||
|
// selection changed
|
||
|
//
|
||
|
// get the new selection
|
||
|
u = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
if(uSubSel != u)
|
||
|
{
|
||
|
// clear the device combo box
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_RESETCONTENT,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// release device list
|
||
|
dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
|
||
|
|
||
|
// release the mapping lists for each subgenre
|
||
|
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
|
||
|
|
||
|
// disable appropriate controls
|
||
|
dimaptstPostEnumEnable(hwnd, FALSE);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
break;
|
||
|
|
||
|
case IDC_ENUM_DEVICES:
|
||
|
// ISSUE-2001/03/29-timgill Long conditional branch
|
||
|
// should really make a sep. fn
|
||
|
/*
|
||
|
#ifdef DDKAPP
|
||
|
// we only want to enumerate all gaming
|
||
|
// devices if we are the DDK tool
|
||
|
fEnumSuitable = FALSE;
|
||
|
#else
|
||
|
*/
|
||
|
fEnumSuitable = TRUE;
|
||
|
|
||
|
u = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
pSubGenre = (DMTSUBGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETITEMDATA,
|
||
|
u,
|
||
|
0L);
|
||
|
if(!pSubGenre)
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
//#endif
|
||
|
// first, free the existing device list
|
||
|
hRes = dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
// then, flush the combo box
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_RESETCONTENT,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// now, re-create the device list
|
||
|
hRes = dmtinputCreateDeviceList(hwnd,
|
||
|
fEnumSuitable,
|
||
|
pSubGenre,
|
||
|
&(pdmtai->pDeviceList));
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
// free the existing mapping lists
|
||
|
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
|
||
|
|
||
|
// create the mapping lists within the subgenres
|
||
|
hRes = dmtcfgCreateAllMappingLists(pdmtai);
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
// populate the devices control
|
||
|
pDevice = pdmtai->pDeviceList;
|
||
|
while(pDevice)
|
||
|
{
|
||
|
// add device name
|
||
|
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_ADDSTRING,
|
||
|
0,
|
||
|
(LPARAM)&(pDevice->szName));
|
||
|
|
||
|
// add device node to item data
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_SETITEMDATA,
|
||
|
nIdx,
|
||
|
(LPARAM)pDevice);
|
||
|
|
||
|
// next device
|
||
|
pDevice = pDevice->pNext;
|
||
|
}
|
||
|
|
||
|
// select the 1st entry
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_SETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// enable appropriate ui elements
|
||
|
dimaptstPostEnumEnable(hwnd, TRUE);
|
||
|
break;
|
||
|
|
||
|
#ifdef TESTAPP
|
||
|
//***************************************
|
||
|
// Internal app specific message handling
|
||
|
//***************************************
|
||
|
case IDC_VERIFY_MANUAL:
|
||
|
case IDC_VERIFY_AUTOMATIC:
|
||
|
// enable/disable manual override option
|
||
|
fEnable = (BOOL)(IDC_VERIFY_MANUAL - dmtGetCheckedRadioButton(hwnd,
|
||
|
IDC_VERIFY_AUTOMATIC,
|
||
|
IDC_VERIFY_MANUAL));
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_VERIFY_MANUAL_OVERRIDE), fEnable);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case IDC_STRESS_MODE:
|
||
|
// expand/shrink dialog
|
||
|
nHeight = IsDlgButtonChecked(hwnd, IDC_STRESS_MODE) ? 490 : 361;
|
||
|
SetWindowPos(hwnd,
|
||
|
HWND_TOP,
|
||
|
0, 0,
|
||
|
nWidth, nHeight,
|
||
|
SWP_NOMOVE | SWP_NOOWNERZORDER);
|
||
|
|
||
|
// enable / disable stress configuration & launch
|
||
|
fEnable = (BOOL)IsDlgButtonChecked(hwnd, IDC_STRESS_MODE);
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), fEnable);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_STRESS_START), fEnable);
|
||
|
break;
|
||
|
#endif // TESTAPP
|
||
|
|
||
|
|
||
|
#ifdef DDKAPP
|
||
|
case IDC_LAUNCH_CPL_EDIT_MODE:
|
||
|
// get the currently selected device?
|
||
|
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
if (nIdx == CB_ERR)
|
||
|
{
|
||
|
// Error has occurred. Most likely no device is available.
|
||
|
MessageBox(hwnd, "No device selected.", "Error", MB_OK);
|
||
|
return TRUE;
|
||
|
}
|
||
|
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd,
|
||
|
IDC_DEVICE_LIST),
|
||
|
CB_GETITEMDATA,
|
||
|
nIdx,
|
||
|
0L);
|
||
|
if(!pDevice)
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// launch the mapper cpl in edit mode
|
||
|
hRes = dmttestRunMapperCPL(hwnd,
|
||
|
TRUE);
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
#endif // DDKAPP
|
||
|
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return FALSE;
|
||
|
|
||
|
} //*** end dimaptstOnCommand()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstOnTimer
|
||
|
//
|
||
|
// Handles WM_TIMER messages for the main app dialog
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 11/02/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
BOOL dimaptstOnTimer(HWND hwnd,
|
||
|
WPARAM wparamTimerId)
|
||
|
{
|
||
|
//int nSel = -1;
|
||
|
//JJ 64Bit Compat
|
||
|
LONG_PTR nSel = -1;
|
||
|
DMTDEVICE_NODE *pDevice = NULL;
|
||
|
|
||
|
DPF(5, "dimaptstOnTimer - ID == %d",
|
||
|
wparamTimerId);
|
||
|
|
||
|
if(ID_POLL_TIMER == wparamTimerId)
|
||
|
{
|
||
|
// get the current device
|
||
|
nSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
if(-1 == nSel)
|
||
|
{
|
||
|
DPF(0, "dimaptstOnTimer - invalid device selection");
|
||
|
return FALSE;
|
||
|
}
|
||
|
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd,
|
||
|
IDC_DEVICE_LIST),
|
||
|
CB_GETITEMDATA,
|
||
|
nSel,
|
||
|
0L);
|
||
|
if(!pDevice)
|
||
|
{
|
||
|
DPF(0, "dimaptstOnTimer - failed to retrieve device node");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// get data from the device
|
||
|
//JJ Removed
|
||
|
//dmttestGetInput(hwnd,
|
||
|
// pDevice);
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return FALSE;
|
||
|
|
||
|
} //*** end dimaptstOnTimer()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstOnUpdateLists
|
||
|
//
|
||
|
// Updates the subgenre list in response to a genre bucket change
|
||
|
//
|
||
|
// NOTE: INTERNAL only - This also clears the devices list, frees
|
||
|
// all associated linked lists and performs some window enabling/disabling
|
||
|
// tasks.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HWND hwnd - handle to app window
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
// History:
|
||
|
// 10/01/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
BOOL dimaptstOnUpdateLists(HWND hwnd)
|
||
|
{
|
||
|
//JJ 64Bit Compat
|
||
|
UINT_PTR uSel = 0;
|
||
|
DMTGENRE_NODE *pGenre = NULL;
|
||
|
DMTSUBGENRE_NODE *pSubNode = NULL;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
|
||
|
// get the genre bucket node
|
||
|
uSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
pGenre = (DMTGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
|
||
|
CB_GETITEMDATA,
|
||
|
uSel,
|
||
|
0L);
|
||
|
if(!pGenre)
|
||
|
{
|
||
|
// this is bad
|
||
|
DebugBreak();
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// clear the existing list contents
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_RESETCONTENT,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// update (sub)genres list
|
||
|
pSubNode = pGenre->pSubGenreList;
|
||
|
while(pSubNode)
|
||
|
{
|
||
|
uSel = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_ADDSTRING,
|
||
|
0,
|
||
|
(LPARAM)(pSubNode->szName));
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_SETITEMDATA,
|
||
|
uSel,
|
||
|
(LPARAM)pSubNode);
|
||
|
|
||
|
// next subgenre
|
||
|
pSubNode = pSubNode->pNext;
|
||
|
}
|
||
|
|
||
|
// select the first list entry
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_SETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
#ifndef DDKAPP
|
||
|
//============================================
|
||
|
// only do this part for SDK and INTERNAL apps
|
||
|
//============================================
|
||
|
|
||
|
// get the device list
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLong(hwnd,
|
||
|
GWL_USERDATA);
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
// clear the device combo box
|
||
|
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_RESETCONTENT,
|
||
|
0,
|
||
|
0L);
|
||
|
|
||
|
// release device list
|
||
|
dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
|
||
|
|
||
|
// release the mapping lists for each subgenre
|
||
|
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
|
||
|
|
||
|
// disable appropriate controls
|
||
|
dimaptstPostEnumEnable(hwnd, FALSE);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// done
|
||
|
return FALSE;
|
||
|
|
||
|
} //*** end dimaptstOnUpdateLists()
|
||
|
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dmtGetCheckedRadioButton
|
||
|
//
|
||
|
// Returns the checked radio button in a group.
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History:
|
||
|
// 08/25/1998 - davidkl - created (copied from dmcs sources)
|
||
|
//===========================================================================
|
||
|
UINT dmtGetCheckedRadioButton(HWND hWnd,
|
||
|
UINT uCtrlStart,
|
||
|
UINT uCtrlStop)
|
||
|
{
|
||
|
UINT uCurrent = 0;
|
||
|
|
||
|
for(uCurrent = uCtrlStart; uCurrent <= uCtrlStop; uCurrent++)
|
||
|
{
|
||
|
if(IsDlgButtonChecked(hWnd, uCurrent))
|
||
|
{
|
||
|
return uCurrent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if we get here, none were checked
|
||
|
return 0;
|
||
|
|
||
|
} //*** end dmtGetCheckedRadioButton()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dimaptstPostEnumEnable
|
||
|
//
|
||
|
// Enables/disables main app UI elements in response to enumerating devices
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HWND hwnd - main app window handle
|
||
|
// BOOL fEnable - enable or disable controls
|
||
|
//
|
||
|
// Returns: nothing
|
||
|
//
|
||
|
// History:
|
||
|
// 10/01/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
void dimaptstPostEnumEnable(HWND hwnd,
|
||
|
BOOL fEnable)
|
||
|
{
|
||
|
UINT u = 0;
|
||
|
|
||
|
// devices list
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), fEnable);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), fEnable);
|
||
|
|
||
|
//JJ UI FIX
|
||
|
// test controls
|
||
|
//for(u = IDC_TEST_CTRL_GROUP; u <= IDC_USE_CPL; u++)
|
||
|
//{
|
||
|
// EnableWindow(GetDlgItem(hwnd, u), fEnable);
|
||
|
// }
|
||
|
|
||
|
// ISSUE-2000/02/21-timgill disable integration control and start button for the preview
|
||
|
// should be re-enabled once test mode code is fixed
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_USE_INTEGRATED), FALSE);
|
||
|
// start button
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDOK), fEnable);
|
||
|
|
||
|
#ifdef DDKAPP
|
||
|
// mapping file group
|
||
|
for(u = IDC_MAPPING_FILE_GROUP; u <= IDC_LAUNCH_CPL_EDIT_MODE; u++)
|
||
|
{
|
||
|
EnableWindow(GetDlgItem(hwnd, u), TRUE);
|
||
|
}
|
||
|
#else
|
||
|
#ifdef TESTAPP
|
||
|
// verification mode
|
||
|
for(u = IDC_VERIFY_GROUP; u <= IDC_VERIFY_MANUAL; u++)
|
||
|
{
|
||
|
EnableWindow(GetDlgItem(hwnd, u), TRUE);
|
||
|
}
|
||
|
|
||
|
// this will enable the manual overrride option as appropriate
|
||
|
SendMessageA(hwnd,
|
||
|
WM_COMMAND,
|
||
|
IDC_VERIFY_AUTOMATIC,
|
||
|
0L);
|
||
|
|
||
|
// this will enable the configuration button and
|
||
|
// expand the application window as appropriate
|
||
|
SendMessageA(hwnd,
|
||
|
WM_COMMAND,
|
||
|
IDC_STRESS_MODE,
|
||
|
0L);
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
} //*** end dimaptstPostEnumEnable()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|