|
|
/*++
Copyright (c) 1994-1998, Microsoft Corporation All rights reserved.
Module Name:
main.c
Abstract:
This module contains the main routines for the Control Panel interface of the 32bit MAIN.CPL.
Revision History:
--*/
//
// Include Files.
//
#include "main.h"
#include "rc.h"
#include "applet.h"
#include "mousectl.h"
#include "drvaplet.h"
#define SZ_DEBUGINI "maincpl.ini"
#define SZ_MODULE "main"
#define SZ_DEBUGSECTION "debug"
#define DECLARE_DEBUG
#include <ccstock.h>
#include <debug.h>
//
// Global Variables.
//
#ifdef WINNT
HINSTANCE g_hInst = NULL;
#else
#pragma data_seg(".idata")
HINSTANCE g_hInst = NULL; #pragma data_seg()
#endif
//
// Externally Defined Applets.
//
int MouseApplet(HINSTANCE, HWND, LPCTSTR); // mouse.c
int KeybdApplet(HINSTANCE, HWND, LPCTSTR); // keybd.c
BOOL RegisterPointerStuff(HINSTANCE); // from mouseptr.c
//
// Typedef Declarations.
//
typedef struct { int idIcon; int idTitle; int idExplanation; PFNAPPLETQUERY pfnAppletQuery; PFNAPPLET pfnApplet; LPCTSTR szDriver; } APPLET;
APPLET Applets[] = { { IDI_MOUSE, IDS_MOUSE_TITLE, IDS_MOUSE_EXPLAIN, NULL, MouseApplet, TEXT("MOUSE") }, { IDI_KEYBD, IDS_KEYBD_TITLE, IDS_KEYBD_EXPLAIN, NULL, KeybdApplet, NULL }, };
#define NUM_APPLETS (sizeof(Applets) / sizeof(Applets[0]))
int cApplets = NUM_APPLETS;
////////////////////////////////////////////////////////////////////////////
//
// LibMain
//
////////////////////////////////////////////////////////////////////////////
BOOL APIENTRY LibMain( HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case ( DLL_PROCESS_ATTACH ) : { g_hInst = hDll; DisableThreadLibraryCalls(hDll); SHFusionInitializeFromModuleID(hDll, 124); break; } case ( DLL_PROCESS_DETACH ) : { SHFusionUninitialize(); break; } case ( DLL_THREAD_ATTACH ) : case ( DLL_THREAD_DETACH ) : { break; } }
return (TRUE); }
////////////////////////////////////////////////////////////////////////////
//
// CplInit
//
// Called when a CPL consumer initializes a CPL.
//
////////////////////////////////////////////////////////////////////////////
LRESULT CplInit( HWND hParent) { int i;
InitCommonControls();
RegisterPointerStuff(g_hInst);
RegisterMouseControlStuff(g_hInst);
for (i = 0; i < cApplets; i++) { if ((Applets[i].pfnAppletQuery != NULL) && ((*Applets[i].pfnAppletQuery)(hParent, APPLET_QUERY_EXISTS) == FALSE)) { cApplets--;
if (i != cApplets) { Applets[i] = Applets[cApplets]; }
i--; } }
return (TRUE); }
////////////////////////////////////////////////////////////////////////////
//
// CplExit
//
// Called when a CPL consumer is done with a CPL.
//
////////////////////////////////////////////////////////////////////////////
void CplExit(void) { }
////////////////////////////////////////////////////////////////////////////
//
// CplInquire
//
// Called when a CPL consumer wants info about an applet.
//
////////////////////////////////////////////////////////////////////////////
LRESULT CplInquire( LPCPLINFO info, int iApplet) { APPLET *applet = Applets + iApplet; HMODULE hDriverApplet = NULL;
info->idIcon = applet->idIcon;
if (applet->szDriver) {
if (hDriverApplet = GetDriverModule(applet->szDriver)) {
info->idIcon = CPL_DYNAMIC_RES; ReleaseDriverModule(hDriverApplet);
} // if (hDriverApplet = ...
} // if (applet->szDriver)
info->idName = applet->idTitle; info->idInfo = applet->idExplanation; info->lData = 0L;
return (1L); }
////////////////////////////////////////////////////////////////////////////
//
// CplNewInquire
//
// Called when a CPL consumer wants info about an applet.
//
////////////////////////////////////////////////////////////////////////////
LRESULT CplNewInquire( HWND parent, LPNEWCPLINFO info, int iApplet) { APPLET *applet = Applets + iApplet; HDAP hdap;
info->dwSize = sizeof(NEWCPLINFO); info->hIcon = NULL;
//
// See if the applet is associated with a driver which can provide us
// an icon.
//
if ((applet->szDriver) && ((hdap = OpenDriverApplet(applet->szDriver)) != NULL)) { info->hIcon = GetDriverAppletIcon(hdap); CloseDriverApplet(hdap); }
if ((!info->hIcon) && (applet->pfnAppletQuery != NULL)) { info->hIcon = (HICON)(*(applet->pfnAppletQuery))( parent, APPLET_QUERY_GETICON ); }
if (!info->hIcon) { info->hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(applet->idIcon)); }
LoadString(g_hInst, applet->idTitle, info->szName, ARRAYSIZE(info->szName)); LoadString(g_hInst, applet->idExplanation, info->szInfo, ARRAYSIZE(info->szInfo));
info->lData = 0L; *info->szHelpFile = 0; info->dwHelpContext = 0UL;
return (1L); }
////////////////////////////////////////////////////////////////////////////
//
// CplInvoke
//
// Called to invoke an applet. It checks the applet's return value to see
// if we need to restart.
//
////////////////////////////////////////////////////////////////////////////
LRESULT CplInvoke( HWND parent, int iApplet, LPCTSTR cmdline) { DWORD exitparam = 0UL; DWORD dwExitReason = SHTDN_REASON_FLAG_PLANNED | SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_RECONFIG;
switch (Applets[iApplet].pfnApplet(g_hInst, parent, cmdline)) { case ( APPLET_RESTART ) : { exitparam = EW_RESTARTWINDOWS; break; } case ( APPLET_REBOOT ) : { exitparam = EW_REBOOTSYSTEM; break; } default : { return (1L); } }
RestartDialogEx(parent, NULL, exitparam, dwExitReason); return (1L); }
////////////////////////////////////////////////////////////////////////////
//
// CplApplet
//
// A CPL consumer calls this to request stuff from us.
//
////////////////////////////////////////////////////////////////////////////
LRESULT APIENTRY CPlApplet( HWND parent, UINT msg, LPARAM lparam1, LPARAM lparam2) { switch (msg) { case ( CPL_INIT ) : { return (CplInit(parent)); } case ( CPL_EXIT ) : { CplExit(); break; } case ( CPL_GETCOUNT ) : { return (cApplets); } case ( CPL_INQUIRE ) : { return (CplInquire((LPCPLINFO)lparam2, (int)lparam1)); } case ( CPL_NEWINQUIRE ) : { return (CplNewInquire(parent, (LPNEWCPLINFO)lparam2, (int)lparam1)); } case ( CPL_DBLCLK ) : { lparam2 = 0L;
// fall through...
} case ( CPL_STARTWPARMS ) : { return (CplInvoke(parent, (int)lparam1, (LPTSTR)lparam2)); } }
return (0L); }
|