windows-nt/Source/XPSP1/NT/shell/osshell/cpls/main/keybd.c

218 lines
4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994-1998, Microsoft Corporation All rights reserved.
Module Name:
keybd.c
Abstract:
This module contains the main routines for the Keyboard applet.
Revision History:
--*/
//
// Include Files.
//
#include "main.h"
#include "rc.h"
#include "applet.h"
#include <regstr.h>
#include <cplext.h>
#include "util.h"
#include <intlid.h>
//
// Constant Declarations.
//
#define MAX_PAGES 32 // limit on number of pages
const HWPAGEINFO c_hpiKeybd = {
// Keyboard device class
{ 0x4d36e96bL, 0xe325, 0x11ce, { 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } },
// Keyboard troubleshooter command line
IDS_KEYBD_TSHOOT,
};
//
// Global Variables.
//
//
// Location of prop sheet hooks in the registry.
//
static const TCHAR sc_szRegKeybd[] = REGSTR_PATH_CONTROLSFOLDER TEXT("\\Keyboard");
//
// Function Prototypes.
//
INT_PTR CALLBACK
KeyboardSpdDlg(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam);
////////////////////////////////////////////////////////////////////////////
//
// _AddKeybdPropSheetPage
//
// Adds a property sheet page.
//
////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK _AddKeybdPropSheetPage(
HPROPSHEETPAGE hpage,
LPARAM lParam)
{
PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam;
if (hpage && ppsh->nPages < MAX_PAGES)
{
ppsh->phpage[ppsh->nPages++] = hpage;
return (TRUE);
}
return (FALSE);
}
////////////////////////////////////////////////////////////////////////////
//
// KeybdApplet
//
////////////////////////////////////////////////////////////////////////////
int KeybdApplet(
HINSTANCE instance,
HWND parent,
LPCTSTR cmdline)
{
HPROPSHEETPAGE rPages[MAX_PAGES];
PROPSHEETPAGE psp;
PROPSHEETHEADER psh;
HPSXA hpsxa;
int Result;
HINSTANCE hInst;
//
// Make the initial page.
//
psh.dwSize = sizeof(psh);
psh.dwFlags = PSH_PROPTITLE;
psh.hwndParent = parent;
psh.hInstance = instance;
psh.pszCaption = MAKEINTRESOURCE(IDS_KEYBD_TITLE);
psh.nPages = 0;
if (cmdline)
{
psh.nStartPage = lstrlen(cmdline) ? StrToLong(cmdline) : 0;
}
else
{
psh.nStartPage = 0;
}
psh.phpage = rPages;
//
// Load any installed extensions.
//
hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, sc_szRegKeybd, 8);
//
// Add the Speed page.
//
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = instance;
psp.pszTemplate = MAKEINTRESOURCE(DLG_KEYBD_SPEED);
psp.pfnDlgProc = KeyboardSpdDlg;
psp.lParam = 0;
_AddKeybdPropSheetPage(CreatePropertySheetPage(&psp), (LPARAM)&psh);
//
// Add the Hardware page (not replaceable).
//
_AddKeybdPropSheetPage(CreateHardwarePage(&c_hpiKeybd), (LPARAM)&psh);
//
// Add any extra pages that the extensions want in there.
//
if (hpsxa)
{
UINT cutoff = psh.nPages;
UINT added = SHAddFromPropSheetExtArray( hpsxa,
_AddKeybdPropSheetPage,
(LPARAM)&psh );
if (psh.nStartPage >= cutoff)
{
psh.nStartPage += added;
}
}
//
// Invoke the Property Sheets.
//
switch (PropertySheet(&psh))
{
case ( ID_PSRESTARTWINDOWS ) :
{
Result = APPLET_RESTART;
break;
}
case ( ID_PSREBOOTSYSTEM ) :
{
Result = APPLET_REBOOT;
break;
}
default :
{
Result = 0;
break;
}
}
//
// Free any loaded extensions.
//
if (hpsxa)
{
SHDestroyPropSheetExtArray(hpsxa);
}
//
// Free the library loaded for the external page.
//
if (hInst)
{
FreeLibrary(hInst);
}
return (Result);
}