windows-nt/Source/XPSP1/NT/shell/osshell/control/joy/joytest.c
2020-09-26 16:20:57 +08:00

340 lines
8.5 KiB
C

//****************************************************************************
//
// File: joytest.c
// Content: Joystick test dialog
// History:
// Date By Reason
// ==== == ======
// 11-dec-94 craige split out of joycpl.c; some tweaks
// 15-dec-94 craige allow N joysticks
//
// Copyright (c) Microsoft Corporation 1994-1995
//
//****************************************************************************
#include "joycpl.h"
/*
* variables used by test process
*/
typedef struct {
LPGLOBALVARS pgv;
MMRESULT mmr_capture;
HWND hwnd;
BOOL bHasTimer;
BOOL bUseTimer;
int iButtonShift;
JOYINFOEX ji;
} test_vars, *LPTESTVARS;
/*
* fillButton - light up a specific button
*/
static void fillButton( LPGLOBALVARS pgv, HWND hwnd, int id, BOOL isup )
{
HWND hwb;
RECT r;
HDC hdc;
hwb = GetDlgItem( hwnd, id );
if( hwb == NULL ) {
return;
}
hdc = GetDC( hwb );
if( hdc == NULL ) {
return;
}
GetClientRect( hwb, &r );
if( isup ) {
FillRect( hdc, &r, pgv->pjd->hbUp );
} else {
FillRect( hdc, &r, pgv->pjd->hbDown );
}
ReleaseDC( hwb, hdc );
} /* fillButton */
/*
* doTestButton - try to light the relevant buttons
*/
static void doTestButton( LPTESTVARS ptv, HWND hwnd, LPJOYINFOEX pji )
{
if( (ptv->ji.dwButtons & JOY_BUTTON1) != (pji->dwButtons & JOY_BUTTON1) ) {
fillButton( ptv->pgv, hwnd, IDC_JOYB1+ptv->iButtonShift,
pji->dwButtons & JOY_BUTTON1 );
}
if( (ptv->ji.dwButtons & JOY_BUTTON2) != (pji->dwButtons & JOY_BUTTON2) ) {
fillButton( ptv->pgv, hwnd, IDC_JOYB2+ptv->iButtonShift,
pji->dwButtons & JOY_BUTTON2 );
}
if( ptv->iButtonShift == 0 ) {
if( (ptv->ji.dwButtons & JOY_BUTTON3) != (pji->dwButtons & JOY_BUTTON3) ) {
fillButton( ptv->pgv, hwnd, IDC_JOYB3, pji->dwButtons & JOY_BUTTON3 );
}
if( (ptv->ji.dwButtons & JOY_BUTTON4) != (pji->dwButtons & JOY_BUTTON4) ) {
fillButton( ptv->pgv, hwnd, IDC_JOYB4, pji->dwButtons & JOY_BUTTON4 );
}
}
ptv->ji.dwButtons = pji->dwButtons;
} /* doTestButton */
/*
* doTestPOV - try to light the POV indicators
*/
static void doTestPOV( LPTESTVARS ptv, HWND hwnd, LPJOYINFOEX pji )
{
int idi;
if( ptv->ji.dwPOV != pji->dwPOV ) {
idi = IDI_JOYPOV_NONE;
if( pji->dwPOV == JOY_POVFORWARD ) {
idi = IDI_JOYPOV_UP;
} else if( pji->dwPOV == JOY_POVBACKWARD ) {
idi = IDI_JOYPOV_DOWN;
} else if( pji->dwPOV == JOY_POVLEFT ) {
idi = IDI_JOYPOV_LEFT;
} else if( pji->dwPOV == JOY_POVRIGHT ) {
idi = IDI_JOYPOV_RIGHT;
}
ChangeIcon( hwnd, idi, IDC_JOYPOV );
}
ptv->ji.dwPOV = pji->dwPOV;
} /* doTestPOV */
/*
* joyTestInitDialog - init the testing dialog
*/
static BOOL joyTestInitDialog( HWND hwnd, LPARAM lParam)
{
HINSTANCE hinst;
char str[MAX_STR];
LPJOYREGHWCONFIG pcfg;
LPTESTVARS ptv;
LPGLOBALVARS pgv;
/*
* create test vars
*/
ptv = DoAlloc( sizeof( test_vars ) );
SetWindowLong( hwnd, DWL_USER, (LONG) ptv );
if( ptv == NULL ) {
return FALSE;
}
pgv = (LPGLOBALVARS) lParam;
ptv->pgv = pgv;
ptv->hwnd = hwnd;
/*
* set dialog text based on OEM strings
*/
SetOEMText( pgv, hwnd, TRUE );
/*
* customize test dialog's button display
*/
pcfg = &pgv->joyHWCurr;
if( pcfg->hws.dwNumButtons <= 2 ) {
ptv->iButtonShift = 1;
ShowWindow( GetDlgItem( hwnd, IDC_JOYB1 ), SW_HIDE );
ShowWindow( GetDlgItem( hwnd, IDC_JOYB4 ), SW_HIDE );
ShowWindow( GetDlgItem( hwnd, IDC_JOYB1_LABEL ), SW_HIDE );
ShowWindow( GetDlgItem( hwnd, IDC_JOYB4_LABEL ), SW_HIDE );
hinst = GetWindowInstance( hwnd );
if( LoadString( hinst, IDS_JOYBUTTON1, str, sizeof( str ) ) ) {
SetWindowText( GetDlgItem( hwnd, IDC_JOYB2_LABEL ), str );
}
if( LoadString( hinst, IDS_JOYBUTTON2, str, sizeof( str ) ) ) {
SetWindowText( GetDlgItem( hwnd, IDC_JOYB3_LABEL ), str );
}
} else {
ptv->iButtonShift = 0;
}
ShowControls( pcfg, hwnd );
/*
* other misc setup
*/
ptv->bHasTimer = SetTimer( hwnd, TIMER_ID, JOYPOLLTIME, NULL );
ptv->bUseTimer = TRUE;
if( !ptv->bHasTimer ) {
DPF( "No timer for joystick test!\r\n" );
return FALSE;
}
return TRUE;
} /* joyTestInitDialog */
/*
* context help for the test dialog
*/
const static DWORD aTestHelpIDs[] = { // Context Help IDs
IDC_GROUPBOX, IDH_JOYSTICK_GROUPBOX,
IDC_JOYLIST1_LABEL, IDH_JOYSTICK_TEST_RANGE,
IDC_JOYLIST1, IDH_JOYSTICK_TEST_RANGE,
IDC_JOYLIST2_LABEL, IDH_JOYSTICK_TEST_THROTTLE,
IDC_JOYLIST2, IDH_JOYSTICK_TEST_THROTTLE,
IDC_JOYLIST3_LABEL, IDH_JOYSTICK_TEST_RUDDER,
IDC_JOYLIST3, IDH_JOYSTICK_TEST_RUDDER,
IDC_JOYPOV_LABEL, IDH_JOYSTICK_TEST_POV,
IDC_JOYPOV, IDH_JOYSTICK_TEST_POV,
IDC_TEXT_1, NO_HELP,
IDC_TEXT_2, NO_HELP,
IDC_ICON_1, NO_HELP,
IDC_GROUPBOX_2, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB1_LABEL, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB2_LABEL, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB3_LABEL, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB4_LABEL, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB1, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB2, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB3, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYB4, IDH_JOYSTICK_TEST_BUTTONS,
IDC_JOYLIST4_LABEL, IDH_JOYSTICK_TEST_THROTTLE,
IDC_JOYLIST4, IDH_JOYSTICK_TEST_THROTTLE,
IDC_JOYLIST5_LABEL, NO_HELP,
IDC_JOYLIST5, NO_HELP,
0, 0
};
/*
* TestProc - callback procedure for joystick test dialog
*/
BOOL CALLBACK TestProc( HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
{
BOOL rc;
switch( umsg ) {
case WM_TIMER:
{
LPTESTVARS ptv;
ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER );
if( ptv->bUseTimer ) {
JOYINFOEX ji;
MMRESULT rc;
ptv->bUseTimer = FALSE;
ji.dwSize = sizeof( ji );
// ji.dwFlags = JOY_RETURNALL | JOY_USEDEADZONE | JOY_RETURNCENTERED;
ji.dwFlags = JOY_RETURNALL | JOY_RETURNCENTERED;
rc = joyGetPosEx( ptv->pgv->iJoyId, &ji );
if( rc == JOYERR_NOERROR ) {
DoJoyMove( ptv->pgv, hwnd, &ji, &ptv->ji, JOYMOVE_DRAWALL );
doTestButton( ptv, hwnd, &ji );
doTestPOV( ptv, hwnd, &ji );
ptv->bUseTimer = TRUE;
} else {
if( JoyError( hwnd ) ) {
ptv->bUseTimer = TRUE;
}
}
}
break;
}
case WM_DESTROY:
{
LPTESTVARS ptv;
ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER );
DoFree( ptv );
break;
}
case WM_INITDIALOG:
rc = joyTestInitDialog( hwnd, lParam );
if( !rc ) {
EndDialog( hwnd, 0 );
}
return FALSE;
case WM_PAINT:
{
LPTESTVARS ptv;
ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER );
CauseRedraw( &ptv->ji, TRUE );
return FALSE;
}
case WM_HELP:
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, cszHelpFile,
HELP_WM_HELP, (DWORD)(LPSTR) aTestHelpIDs);
return TRUE;
case WM_CONTEXTMENU:
WinHelp((HWND) wParam, cszHelpFile, HELP_CONTEXTMENU,
(DWORD)(LPVOID) aTestHelpIDs);
return TRUE;
case WM_COMMAND:
{
int id;
LPTESTVARS ptv;
ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER );
id = GET_WM_COMMAND_ID(wParam, lParam);
switch( id ) {
case IDCANCEL:
case IDOK:
if( ptv->bHasTimer ) {
KillTimer( hwnd, TIMER_ID );
}
EndDialog(hwnd, (id == IDOK));
break;
default:
break;
}
break;
}
default:
break;
}
return FALSE;
} /* TestProc */
/*
* DoTest - do the test dialog
*/
void DoTest( LPGLOBALVARS pgv, HWND hwnd, LPUPDCFGFN pupdcfgfn, LPVOID pparm )
{
JOYREGHWCONFIG save_joycfg;
int id;
/*
* save the current config, and then update config if required
*/
save_joycfg = pgv->joyHWCurr;
if( pupdcfgfn != NULL ) {
pupdcfgfn( pparm );
}
/*
* update the registry with our new joystick info
*/
RegSaveCurrentJoyHW( pgv );
RegistryUpdated( pgv );
/*
* process the test dialog
*/
if( pgv->joyHWCurr.hws.dwFlags & (JOY_HWS_HASU|JOY_HWS_HASV) ) {
id = IDD_JOYTEST1;
} else {
id = IDD_JOYTEST;
}
DialogBoxParam( (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE ),
MAKEINTRESOURCE( id ), hwnd, TestProc, (LONG) pgv );
/*
* restore the old registry info
*/
pgv->joyHWCurr = save_joycfg;
RegSaveCurrentJoyHW( pgv );
RegistryUpdated( pgv );
} /* DoTest */