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

239 lines
5.7 KiB
C

//****************************************************************************
//
// File: main.c
// Content: main cpl control code
// History:
// Date By Reason
// ==== == ======
// 29-nov-94 craige initial implementation
// 11-dec-94 craige added ShowJoyCPL
//
// Copyright (c) Microsoft Corporation 1994-1995
//
//****************************************************************************
#include "joycpl.h"
HINSTANCE hInstance = NULL;
LPCTSTR cszHelpFile = TEXT("joy.hlp");
#define JOYSTICK_CPL 0
#define MAX_PAGES 16 /* maximum number of joysticks supported */
#ifdef DEBUG
void FAR cdecl dprintf(LPSTR szFormat, ...)
{
char str[256];
wsprintf( str, "JOYCPL: " );
wvsprintf( str+lstrlen( str ), szFormat, (LPVOID)(&szFormat+1) );
OutputDebugString( str );
}
#endif
/*
* LibMain - main entry point for DLL
*/
BOOL APIENTRY LibMain( HANDLE hDll, DWORD dwReason, LPVOID lpReserved )
{
switch( dwReason ) {
case DLL_PROCESS_ATTACH:
hInstance = hDll;
DPF( "DLL_PROCESS_ATTACH: hInstance = %08lx\r\n" );
break;
case DLL_PROCESS_DETACH:
DPF( "DLL_PROCESS_DETACH: hInstance = %08lx\r\n" );
break;
case DLL_THREAD_DETACH:
DPF( "DLL_THREAD_DETACH: hInstance = %08lx\r\n" );
break;
case DLL_THREAD_ATTACH:
DPF( "DLL_THREAD_DETACH: hInstance = %08lx\r\n" );
break;
default:
break;
}
return TRUE;
} /* LibMain */
/*
* startJoyCPL - start the joystick CPL
*/
static void startJoyCPL( HWND hwnd )
{
PROPSHEETHEADER psh;
char title[MAX_STR];
PROPSHEETPAGE psp;
LPJOYDATA pjd;
#if defined( WANT_SHEETS )
JOYDATAPTR jdp[MAX_PAGES];
HPROPSHEETPAGE hpsp[MAX_PAGES];
int numsheets;
int i;
char str[MAX_STR];
#else
JOYDATAPTR jdp;
HPROPSHEETPAGE hpsp[1];
#endif
#if defined(WANT_SHEETS)
numsheets = joyGetNumDevs();
if( numsheets == 0 ) {
return;
}
#endif
InitCommonControls();
LoadString( hInstance, IDS_JOY, title, sizeof(title));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPTITLE;
psh.hwndParent = hwnd;
psh.hInstance = hInstance;
psh.pszCaption = (LPSTR) MAKEINTRESOURCE( IDS_JOY );
psh.nPages = 0;
psh.nStartPage = 0;
psh.phpage = hpsp;
psp.dwSize = sizeof( PROPSHEETPAGE );
psp.dwFlags = PSP_DEFAULT | PSP_USETITLE;
psp.hInstance = hInstance;
psp.pszTemplate = MAKEINTRESOURCE( IDD_JOYSTICK );
psp.pszIcon = NULL;
psp.pfnDlgProc = JoystickDlg;
psp.pfnCallback = NULL;
psp.pcRefParent = NULL;
pjd = JoystickDataInit();
#if defined(WANT_SHEETS)
for( i=0;i<numsheets;i++ ) {
wsprintf( str, "%s %d", title, i+1 );
psp.pszTitle = str;
jdp[i].pjd = pjd;
jdp[i].iJoyId = i;
psp.lParam = (LPARAM) &jdp[i];
if( psh.phpage[ psh.nPages ] = CreatePropertySheetPage( &psp ) ) {
psh.nPages++;
DPF( "PropertySheetPage()\r\n" );
}
}
#else
psp.pszTitle = title;
jdp.pjd = pjd;
jdp.iJoyId = JOYSTICKID1;
psp.lParam = (LPARAM) &jdp;
if( psh.phpage[ psh.nPages ] = CreatePropertySheetPage( &psp ) ) {
psh.nPages++;
DPF( "PropertySheetPage()\r\n" );
}
#endif
if( psh.nPages ) {
PropertySheet( &psh );
DPF( "PropertySheet()\r\n" );
}
JoystickDataFini( pjd );
} /* startJoyCPL */
/*
* ShowJoyCPL - exported function to allow apps to show the joystick CPL
*/
void WINAPI ShowJoyCPL( HWND hwnd )
{
HWND hwnd_parent;
hwnd_parent = hwnd;
if( hwnd != NULL ) {
if( GetWindowLong( hwnd, GWL_EXSTYLE ) & WS_EX_TOPMOST ) {
hwnd_parent = NULL;
}
}
startJoyCPL( hwnd_parent );
} /* ShowJoyCPL */
/*
* CPlApplet - applet manager
*/
LONG WINAPI CPlApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
LPCPLINFO pcplinfo;
LPNEWCPLINFO pnewcplinfo;
switch( uMsg ) {
case CPL_INIT:
DPF( "CPL_INIT:\r\n" );
// return TRUE; // (fall through to CPL_GETCOUNT--fail if no joysticks)
case CPL_GETCOUNT:
/*
* number of applets in this DLL - 1 per device
* no joystick devices installed (i.e., no CPL's to display)
*/
if( joyGetNumDevs() ) {
DPF( "CPL_GETCOUNT = 1\r\n" );
return 1;
} else {
DPF( "CPL_GETCOUNT = 0\r\n" );
return 0;
}
case CPL_INQUIRE:
/*
* Fill the CPLINFO with the pertinent information for each applet
*/
DPF( "CPL_INQUIRE:\r\n" );
pcplinfo = (LPCPLINFO) lParam2;
switch( lParam1 ) {
case JOYSTICK_CPL:
pcplinfo->idIcon = CPL_DYNAMIC_RES;
pcplinfo->idName = CPL_DYNAMIC_RES;
pcplinfo->idInfo = CPL_DYNAMIC_RES;
break;
}
pcplinfo->lData = 0L;
return TRUE;
case CPL_NEWINQUIRE:
DPF( "CPL_NEWINQUIRE\r\n" );
pnewcplinfo = (LPNEWCPLINFO) lParam2;
switch( lParam1 ) {
case JOYSTICK_CPL:
pnewcplinfo->hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_JOYSTICK));
LoadString(hInstance, IDS_JOY, pnewcplinfo->szName,
sizeof(pnewcplinfo->szName));
LoadString( hInstance, IDS_JOYINFO, pnewcplinfo->szInfo,
sizeof(pnewcplinfo->szInfo) );
DPF( "hIcon = %04x\r\n", pnewcplinfo->hIcon );
DPF( "szName = \"%s\"\r\n", pnewcplinfo->szName );
DPF( "szInfo = \"%s\"\r\n", pnewcplinfo->szInfo );
break;
}
pnewcplinfo->dwHelpContext = 0;
pnewcplinfo->dwSize = sizeof( NEWCPLINFO );
pnewcplinfo->lData = 0L;
pnewcplinfo->szHelpFile[0] = 0;
return TRUE;
case CPL_DBLCLK:
DPF( "CPL_DBLCLK\r\n" );
switch( lParam1 ) {
case JOYSTICK_CPL:
startJoyCPL( hwnd );
break;
}
break;
case CPL_EXIT:
DPF( "CPL_EXIT\r\n" );
break;
default:
return 0L;
}
return 1L;
} /* CPlApplet */