316 lines
10 KiB
C++
316 lines
10 KiB
C++
|
//===========================================================================
|
||
|
// SETTINGS.CPP
|
||
|
//
|
||
|
// Functions:
|
||
|
// Settings_DlgProc()
|
||
|
// DisplayJoystickState()
|
||
|
//
|
||
|
//===========================================================================
|
||
|
|
||
|
// Uncomment if we decide to calibrate the POV!
|
||
|
#define WE_SUPPORT_CALIBRATING_POVS 1
|
||
|
|
||
|
#include <malloc.h> // for _alloca
|
||
|
#include "cplsvr1.h"
|
||
|
#include "dicputil.h"
|
||
|
#include "resource.h"
|
||
|
#include "assert.h"
|
||
|
#include "cal.h"
|
||
|
|
||
|
// Flag to stop centering of DLG if it's already happend!
|
||
|
// This is needed because of the args that allow any page to be the first!
|
||
|
BOOL bDlgCentered = FALSE;
|
||
|
|
||
|
// This is global because Test.cpp needs it to determine
|
||
|
// if the ranges need to be updated!
|
||
|
BYTE nStatic;
|
||
|
|
||
|
LPMYJOYRANGE lpCurrentRanges = NULL;
|
||
|
|
||
|
extern CDIGameCntrlPropSheet_X *pdiCpl;
|
||
|
|
||
|
//===========================================================================
|
||
|
// Settings_DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
//
|
||
|
// Callback proceedure for Settings Page
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HWND hWnd - handle to dialog window
|
||
|
// UINT uMsg - dialog message
|
||
|
// WPARAM wParam - message specific data
|
||
|
// LPARAM lParam - message specific data
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
//
|
||
|
//===========================================================================
|
||
|
BOOL CALLBACK Settings_DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
// static LPDIJOYCONFIG_DX5 pDIJoyConfig;
|
||
|
|
||
|
switch( uMsg ) {
|
||
|
case WM_LBUTTONDOWN:
|
||
|
// Click Drag service for PropSheets!
|
||
|
PostMessage(GetParent(hWnd), WM_NCLBUTTONDOWN, (WPARAM)HTCAPTION, lParam);
|
||
|
break;
|
||
|
|
||
|
// OnHelp
|
||
|
case WM_HELP:
|
||
|
OnHelp(lParam);
|
||
|
return(TRUE);
|
||
|
|
||
|
// OnContextMenu
|
||
|
case WM_CONTEXTMENU:
|
||
|
OnContextMenu(wParam);
|
||
|
return(TRUE);
|
||
|
|
||
|
// OnDestroy
|
||
|
case WM_DESTROY:
|
||
|
bDlgCentered = FALSE;
|
||
|
|
||
|
// if (pDIJoyConfig)
|
||
|
// delete (pDIJoyConfig);
|
||
|
break;
|
||
|
|
||
|
// OnInitDialog
|
||
|
case WM_INITDIALOG:
|
||
|
// get ptr to our object
|
||
|
if( !pdiCpl )
|
||
|
pdiCpl = (CDIGameCntrlPropSheet_X*)((LPPROPSHEETPAGE)lParam)->lParam;
|
||
|
|
||
|
// initialize DirectInput
|
||
|
if( FAILED(InitDInput(GetParent(hWnd), pdiCpl)) ) {
|
||
|
#ifdef _DEBUG
|
||
|
OutputDebugString(TEXT("GCDEF.DLL: Settings.cpp: WM_INITDIALOG: InitDInput FAILED!\n"));
|
||
|
#endif
|
||
|
Error(hWnd, (short)IDS_INTERNAL_ERROR, (short)IDS_NO_DIJOYCONFIG);
|
||
|
PostMessage(GetParent(hWnd), WM_SYSCOMMAND, SC_CLOSE, 0);
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Enable/Disable the calibrate buttons if the device is present
|
||
|
LPDIRECTINPUTJOYCONFIG pdiJoyConfig;
|
||
|
pdiCpl->GetJoyConfig(&pdiJoyConfig);
|
||
|
|
||
|
// Acquire and check for USER mode!
|
||
|
|
||
|
// If you're not logged in as a user, you can't use calibrate either!
|
||
|
if( pdiJoyConfig->Acquire() == DIERR_INSUFFICIENTPRIVS ) {
|
||
|
const USHORT nIDs[] = { IDC_SETTINGSGRP,
|
||
|
IDC_RESETCALIBRATION,
|
||
|
IDC_JOYCALIBRATE,
|
||
|
IDC_TEXT_CALHELP};
|
||
|
|
||
|
BYTE nSize = sizeof(nIDs)/sizeof(USHORT);
|
||
|
|
||
|
while( nSize-- )
|
||
|
PostDlgItemEnableWindow(hWnd, nIDs[nSize], FALSE);
|
||
|
|
||
|
pdiCpl->SetUser(TRUE);
|
||
|
}
|
||
|
|
||
|
// Center the Dialog!
|
||
|
// If it's not been centered!
|
||
|
if( !bDlgCentered ) {
|
||
|
// Set the title bar!
|
||
|
SetTitle(hWnd);
|
||
|
|
||
|
CenterDialog(hWnd);
|
||
|
bDlgCentered = TRUE;
|
||
|
}
|
||
|
|
||
|
// Disable the Calibration button if they don't have any axis!!!
|
||
|
// Leave the Reset to default...
|
||
|
if( pdiCpl->GetStateFlags()->nAxis == 0 )
|
||
|
PostDlgItemEnableWindow(hWnd, IDC_JOYCALIBRATE, FALSE);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
// OnNotify
|
||
|
case WM_NOTIFY:
|
||
|
// perform any WM_NOTIFY processing, but there is none...
|
||
|
// return TRUE if you handled the notification (and have set
|
||
|
// the result code in SetWindowLong(hWnd, DWL_MSGRESULT, lResult)
|
||
|
// if you want to return a nonzero notify result)
|
||
|
// or FALSE if you want default processing of the notification.
|
||
|
switch( ((NMHDR*)lParam)->code ) {
|
||
|
case PSN_APPLY:
|
||
|
// Kill the memory allocated for the Ranges struct
|
||
|
Sleep(100);
|
||
|
if( lpCurrentRanges ) {
|
||
|
delete (lpCurrentRanges);
|
||
|
lpCurrentRanges = NULL;
|
||
|
}
|
||
|
/* We've removed the rudder stuff... but just in case it comes back...
|
||
|
if (nStatic & RUDDER_HIT)
|
||
|
{
|
||
|
LPDIRECTINPUTJOYCONFIG pdiJoyConfig;
|
||
|
pdiCpl->GetJoyConfig(&pdiJoyConfig);
|
||
|
|
||
|
// get the status of the Rudder checkbox and assign it!
|
||
|
// THEN Add the rudder to the Axis mask!
|
||
|
if (pDIJoyConfig->hwc.dwUsageSettings & JOY_US_HASRUDDER)
|
||
|
{
|
||
|
pDIJoyConfig->hwc.dwUsageSettings &= ~JOY_US_HASRUDDER;
|
||
|
pdiCpl->GetStateFlags()->nAxis &= ~HAS_RX;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDIJoyConfig->hwc.dwUsageSettings |= JOY_US_HASRUDDER;
|
||
|
pdiCpl->GetStateFlags()->nAxis |= HAS_RX;
|
||
|
}
|
||
|
|
||
|
if (FAILED(pdiJoyConfig->Acquire()))
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
OutputDebugString(TEXT("GCDEF.DLL: Settings.cpp: Settings_DlgProc: PSN_APPLY: Acquire FAILED!\n"));
|
||
|
#endif
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Set the GUID to NULL to ask DINPUT to recreate!
|
||
|
pDIJoyConfig->guidInstance = NULL_GUID;
|
||
|
|
||
|
if (FAILED(pdiJoyConfig->SetConfig(pdiCpl->GetID(), (LPDIJOYCONFIG)pDIJoyConfig, DIJC_REGHWCONFIGTYPE)))
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
OutputDebugString(TEXT("GCDEF.DLL: Settings.cpp: Settings_DlgProc: PSN_APPLY: SetConfig FAILED!\n"));
|
||
|
#endif
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Remove the mask from nStatic
|
||
|
nStatic &= ~RUDDER_HIT;
|
||
|
|
||
|
if (FAILED(pdiJoyConfig->SendNotify()))
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
OutputDebugString(TEXT("GCDEF.DLL: Settings.cpp: Settings_DlgProc: PSN_APPLY: SendNotify FAILED!\n"));
|
||
|
#endif
|
||
|
}
|
||
|
pdiJoyConfig->Unacquire();
|
||
|
}
|
||
|
*/
|
||
|
break;
|
||
|
|
||
|
case PSN_RESET:
|
||
|
// if the user has changed the calibration... Set it back!
|
||
|
if( lpCurrentRanges ) {
|
||
|
LPDIRECTINPUTDEVICE2 pdiDevice2;
|
||
|
pdiCpl->GetDevice(&pdiDevice2);
|
||
|
|
||
|
SetMyRanges(pdiDevice2, lpCurrentRanges, pdiCpl->GetStateFlags()->nAxis);
|
||
|
|
||
|
// Set POV possitions!
|
||
|
//if (pdiCpl->GetStateFlags()->nPOVs)
|
||
|
// SetMyPOVRanges(pdiDevice2, lpCurrentRanges->dwPOV);
|
||
|
|
||
|
LPDIRECTINPUTJOYCONFIG pdiJoyConfig;
|
||
|
pdiCpl->GetJoyConfig(&pdiJoyConfig);
|
||
|
|
||
|
pdiJoyConfig->Acquire();
|
||
|
pdiJoyConfig->SendNotify();
|
||
|
|
||
|
delete (lpCurrentRanges);
|
||
|
lpCurrentRanges = NULL;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
|
||
|
// OnCommand
|
||
|
case WM_COMMAND:
|
||
|
switch( LOWORD(wParam) ) {
|
||
|
/*
|
||
|
case IDC_JOY1HASRUDDER:
|
||
|
if (nStatic & RUDDER_HIT)
|
||
|
nStatic &= ~RUDDER_HIT;
|
||
|
else
|
||
|
nStatic |= RUDDER_HIT;
|
||
|
|
||
|
// Update the ApplyNow button!
|
||
|
PostMessage(GetParent(hWnd), (nStatic & RUDDER_HIT) ? PSM_CHANGED : PSM_UNCHANGED,
|
||
|
(WPARAM)hWnd, 0);
|
||
|
break;
|
||
|
*/
|
||
|
|
||
|
// Set to Default button!!!
|
||
|
case IDC_RESETCALIBRATION:
|
||
|
{
|
||
|
LPMYJOYRANGE lpResetRanges = (LPMYJOYRANGE)_alloca(sizeof(MYJOYRANGE));
|
||
|
ASSERT (lpResetRanges);
|
||
|
|
||
|
ZeroMemory(lpResetRanges, sizeof(MYJOYRANGE));
|
||
|
|
||
|
LPDIRECTINPUTDEVICE2 pdiDevice2;
|
||
|
pdiCpl->GetDevice(&pdiDevice2);
|
||
|
|
||
|
SetMyRanges(pdiDevice2, lpResetRanges, pdiCpl->GetStateFlags()->nAxis);
|
||
|
|
||
|
//if (pdiCpl->GetStateFlags()->nPOVs)
|
||
|
// SetMyPOVRanges(pdiDevice2, lpResetRanges->dwPOV);
|
||
|
|
||
|
LPDIRECTINPUTJOYCONFIG pdiJoyConfig;
|
||
|
pdiCpl->GetJoyConfig(&pdiJoyConfig);
|
||
|
|
||
|
pdiJoyConfig->Acquire();
|
||
|
pdiJoyConfig->SendNotify();
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_JOYCALIBRATE:
|
||
|
nStatic |= CALIBRATING;
|
||
|
|
||
|
if( !lpCurrentRanges ) {
|
||
|
lpCurrentRanges = new (MYJOYRANGE);
|
||
|
assert (lpCurrentRanges);
|
||
|
|
||
|
ZeroMemory (lpCurrentRanges, sizeof(MYJOYRANGE));
|
||
|
|
||
|
LPDIRECTINPUTDEVICE2 pdiDevice2;
|
||
|
pdiCpl->GetDevice(&pdiDevice2);
|
||
|
|
||
|
// Get Current Ranges!
|
||
|
GetMyRanges(pdiDevice2, lpCurrentRanges, pdiCpl->GetStateFlags()->nAxis);
|
||
|
}
|
||
|
|
||
|
if( CreateWizard(hWnd, (LPARAM)pdiCpl) ) {
|
||
|
|
||
|
// Set the flags
|
||
|
nStatic |= CAL_HIT;
|
||
|
|
||
|
HWND hSheet = GetParent(hWnd);
|
||
|
|
||
|
// take care of the Apply Now Button...
|
||
|
::SendMessage(hSheet, PSM_CHANGED, (WPARAM)hWnd, 0L);
|
||
|
|
||
|
// Bug #179010 NT - Move to Test sheet after calibration!
|
||
|
::PostMessage(hSheet, PSM_SETCURSELID, 0, (LPARAM)IDD_TEST);
|
||
|
} else {
|
||
|
// if you canceled and it's your first time Kill the struct...
|
||
|
// then Reset the flag
|
||
|
if( !(nStatic & CAL_HIT) ) {
|
||
|
// Kill the memory allocated for the Ranges struct
|
||
|
if( lpCurrentRanges ) {
|
||
|
delete (lpCurrentRanges);
|
||
|
lpCurrentRanges = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nStatic &= ~CALIBRATING;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
|
||
|
} //*** end Settings_DlgProc()
|
||
|
|
||
|
|