//**************************************************************************** // // 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 // 4/2/97 a-kirkh allow N buttons // // Copyright (c) Microsoft Corporation 1994-1995 // //**************************************************************************** #include "stdafx.h" #include "pov.h" #include "assert.h" #include "joycpl.h" #include "resource.h" #include "joyarray.h" // Help array #include "baseids.h" #include "comstr.h" LRESULT SetJoyInfo(UINT nID, LPCSTR szOEMKey); // ADDED BY CML 2/20/96 LPGLOBALVARS gpgv; BOOL fIsSideWinder = FALSE; // END ADD // Context sensitive help stuff! static void OnContextMenu(WPARAM wParam); extern const DWORD gaHelpIDs[]; extern USHORT gnID; // ID as sent from Client via SetID /* * 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; assert(pgv); assert(hwnd); hwb = GetDlgItem( hwnd, id ); ASSERT (::IsWindow(hwb)); 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 ) { assert(ptv); assert(pji); // ADDED BY CML 2/21/96 if( ptv->ji.dwButtons != pji->dwButtons ) { BYTE nIndex; HWND hCtrl; HICON hIconOn, hIconOff; UINT nButtons = ptv->pgv->joyHWCurr.hws.dwNumButtons; for( BYTE i=0; idwButtons & 1<ji.dwButtons = pji->dwButtons; // END ADD } /* doTestButton */ // doTestPOV - try to light the POV indicators static void doTestPOV( LPTESTVARS ptv, HWND hwnd, LPJOYINFOEX pji ) { assert(ptv); assert(hwnd); assert(pji); if( ptv->ji.dwPOV != pji->dwPOV ) { if( pji->dwPOV != JOY_POVCENTERED ) SetDegrees(pji->dwPOV); else SetDegrees(-1); ptv->ji.dwPOV = pji->dwPOV; } } /* doTestPOV */ /* * joyTestInitDialog - init the testing dialog */ static BOOL joyTestInitDialog( HWND hwnd, LPARAM lParam) { HINSTANCE hinst; LPJOYREGHWCONFIG pcfg; LPTESTVARS ptv = NULL; LPGLOBALVARS pgv = NULL; UINT i; // ADDED BY CML 2/21/96 assert(hwnd); hinst = GetResourceInstance(); assert(hinst); // create test vars ptv = (test_vars *)DoAlloc( sizeof( test_vars ) ); assert(ptv); SetWindowLong( hwnd, DWL_USER, (LONG) ptv ); if( ptv == NULL ) return(FALSE); pgv = gpgv; assert(pgv); ptv->pgv = pgv; ptv->hwnd = hwnd; // ADDED BY CML 2/21/96 // set default POV icon image /* if (fIsSideWinder) { HICON hicon; //, holdicon; hicon = (struct HICON__ *) LoadImage( GetWindowInstance(hwnd), (PSTR)IDI_POV_OFF, IMAGE_ICON, 48, 48, 0); assert(hicon); // if (hicon) // { // HWND hCtrl = GetDlgItem(hwnd,IDC_JOYPOV); // ASSERT (::IsWindow(hCtrl)); // // holdicon = Static_SetIcon(hCtrl, hicon); // if (holdicon) DestroyIcon(holdicon); // } } else { HICON hicon, holdicon; hicon = LoadIcon(GetWindowInstance(hwnd), (PSTR)IDI_JOYPOV_NONE); assert(hicon); if (hicon) { HWND hCtrl = GetDlgItem(hwnd,IDC_JOYPOV); ASSERT (::IsWindow(hCtrl)); holdicon = Static_SetIcon(hCtrl, hicon); if (holdicon) DestroyIcon(holdicon); } } */ // END ADD // set dialog text based on OEM strings SetOEMText( pgv, hwnd, TRUE ); /* * customize test dialog's button display */ pcfg = &pgv->joyHWCurr; assert(pcfg); if( pcfg->hws.dwNumButtons <= 2 ) { ptv->iButtonShift = 1; // HWND hCtrl = GetDlgItem( hwnd, IDC_JOYB1 ); // ASSERT (::IsWindow(hCtrl)); // ShowWindow( hCtrl, SW_HIDE ); // hCtrl = GetDlgItem( hwnd, IDC_JOYB4 ); // ASSERT (::IsWindow(hCtrl)); // ShowWindow( hCtrl, SW_HIDE ); // hCtrl = GetDlgItem( hwnd, IDC_JOYB1_LABEL ); // ASSERT (::IsWindow(hCtrl)); // ShowWindow( hCtrl, SW_HIDE ); // hCtrl = GetDlgItem( hwnd, IDC_JOYB4_LABEL ); // ASSERT (::IsWindow(hCtrl)); // ShowWindow( hCtrl, SW_HIDE ); } else { ptv->iButtonShift = 0; } // ADDED BY CML 10/23/96 // size and position the text /* There is no text on the buttons anymore! for (i=0; i<8; i++) { // HWND hText = GetDlgItem(hwnd, IDC_TEXT_JOYBTN1+i); // ASSERT (::IsWindow(hText)); HWND hIcon = GetDlgItem(hwnd, IDC_TESTJOYBTNICON1+i); ASSERT (::IsWindow(hIcon)); RECT rcIcon, rcText; GetWindowRect(hIcon, &rcIcon); GetWindowRect(hText, &rcText); rcText.left = rcIcon.left; rcText.right = rcIcon.right; MapWindowPoints(0, hwnd, (POINT*)&rcText, 2); MoveWindow( hText, rcText.left, rcText.top, rcText.right-rcText.left, rcText.bottom-rcText.top, FALSE); } */ // END ADD // ADDED BY CML 2/21/96 // display button lights // ADDED BY JKH 3/29/97 // MORE BUTTONS SUPPORTED HWND hCtrl; for( i=pcfg->hws.dwNumButtons; i<32; i++ ) { hCtrl = GetDlgItem(hwnd, IDC_TESTJOYBTNICON1+i); ASSERT (::IsWindow(hCtrl)); ShowWindow(hCtrl, SW_HIDE); } // END ADD 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 */ // TestProc - callback procedure for joystick test dialog BOOL CALLBACK TestProc( HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) { BOOL rc; assert(hwnd); switch( umsg ) { case WM_HELP: OnHelp(lParam); return(1); case WM_CONTEXTMENU: OnContextMenu(wParam); return(1); case WM_TIMER: { LPTESTVARS ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER ); assert(ptv); if( ptv->bUseTimer ) { JOYINFOEX ji; MMRESULT rc; ptv->bUseTimer = FALSE; ji.dwSize = sizeof( ji ); ji.dwFlags = JOY_RETURNALL | JOY_RETURNCENTERED | JOY_CAL_READALWAYS; rc = joyGetPosEx( ptv->pgv->iJoyId, &ji ); // ADDED BY CML 11/13/96 // if this page is for sw3dpro, check for sw3dpro still active if( fIsSideWinder && rc==JOYERR_NOERROR ) { char sz[256]; char szValue[64]; DWORD cb = sizeof(szValue); HKEY hKey; JOYCAPS jc; LRESULT lr; // open reg key for device type // JOYSTICKID1 joyGetDevCaps( ptv->pgv->iJoyId, &jc, sizeof(jc)); wsprintf( sz, "%s\\%s\\%s", REGSTR_PATH_JOYCONFIG, jc.szRegKey, REGSTR_KEY_JOYCURR); lr = RegOpenKey(HKEY_LOCAL_MACHINE, sz, &hKey); wsprintf(sz, REGSTR_VAL_JOYNOEMNAME, 1); lr = RegQueryValueEx(hKey, sz, 0, 0, (BYTE*)szValue, &cb); RegCloseKey(hKey); // is the sw3dpro still connected and not some other device? if( strcmp(szValue, "Microsoft SideWinder 3D Pro") ) // wrong device rc = JOYERR_UNPLUGGED; } // END ADD 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 ); assert(ptv); DoFree( ptv ); // ADDED BY CML 2/20/96 //RegSaveCurrentJoyHW(gpgv); RegistryUpdated(gpgv); // END ADD break; } case WM_INITDIALOG: { LRESULT lr=SetJoyInfo( 0, "" ); ASSERT(lr==ERROR_SUCCESS); // blj: fix #8049, Set ID to ID of device assigned to property sheet. gpgv->iJoyId = gnID; // ADDED BY CML 2/20/96 RegSaveCurrentJoyHW(gpgv); RegistryUpdated(gpgv); // END ADD rc = joyTestInitDialog( hwnd, lParam ); if( !rc ) EndDialog( hwnd, 0 ); } return(FALSE); // ADDED BY CML 2/21/96 case WM_NOTIFY: switch( ((NMHDR*)lParam)->code ) { case PSN_SETACTIVE: { LPTESTVARS ptv = (LPTESTVARS)GetWindowLong(hwnd, DWL_USER); assert(ptv); ptv->bUseTimer = 1; joyTestInitDialog(hwnd, 0); } break; // ADDED CML 6/27/96 case PSN_KILLACTIVE: KillTimer(hwnd, TIMER_ID); break; // END ADD 6/27/96 } return(1); // END ADD 2/21/96 case WM_PAINT: { LPTESTVARS ptv; ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER ); assert(ptv); CauseRedraw( &ptv->ji, TRUE ); return(FALSE); } case WM_COMMAND: { int id; LPTESTVARS ptv; ptv = (LPTESTVARS) GetWindowLong( hwnd, DWL_USER ); assert(ptv); 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; } HINSTANCE hResInst = GetResourceInstance(); DialogBoxParam( hResInst, MAKEINTRESOURCE( id ), hwnd, (int (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long))TestProc, (LONG) pgv ); /* * restore the old registry info */ pgv->joyHWCurr = save_joycfg; //RegSaveCurrentJoyHW( pgv ); RegistryUpdated( pgv ); } /* DoTest */ //////////////////////////////////////////////////////////////////////////////////////// // OnContextMenu(WPARAM wParam) //////////////////////////////////////////////////////////////////////////////////////// void OnContextMenu(WPARAM wParam) { short nSize = STR_LEN_32; // point to help file char *pszHelpFileName = new char[nSize]; ASSERT (pszHelpFileName); // returns help file name and size of string GetHelpFileName(pszHelpFileName, &nSize); WinHelp((HWND)wParam, pszHelpFileName, HELP_CONTEXTMENU, (DWORD)gaHelpIDs); if( pszHelpFileName ) delete[] (pszHelpFileName); }