Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

281 lines
5.4 KiB

/*++
Copyright (c) 1994-1995, 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 "..\intl\intlid.h"
//
// Constant Declarations.
//
#define MAX_PAGES 32 // limit on number of pages
//
// Global Variables.
//
//
// Location of prop sheet hooks in the registry.
//
static const TCHAR sc_szRegKeybd[] = REGSTR_PATH_CONTROLSFOLDER TEXT("\\Keyboard");
//
// Function Prototypes.
//
BOOL CALLBACK
KeyboardSpdDlg(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL CALLBACK
KeyboardDevDlg(
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 (ppsh->nPages < MAX_PAGES)
{
ppsh->phpage[ppsh->nPages++] = hpage;
return (TRUE);
}
return (FALSE);
}
////////////////////////////////////////////////////////////////////////////
//
// AddExternalPropSheetPage
//
// Adds a property sheet page from the given dll.
//
////////////////////////////////////////////////////////////////////////////
HINSTANCE AddExternalPropSheetPage(
LPPROPSHEETHEADER ppsh,
UINT id,
LPTSTR DllName,
LPSTR ProcName)
{
HINSTANCE hInst = NULL;
DLGPROC pfn;
if (ppsh->nPages < MAX_PAGES)
{
PROPSHEETPAGE psp;
if (hInst = LoadLibrary(DllName))
{
pfn = (DLGPROC)GetProcAddress(hInst, ProcName);
if (!pfn)
{
FreeLibrary(hInst);
return (NULL);
}
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = hInst;
psp.pszTemplate = MAKEINTRESOURCE(id);
psp.pfnDlgProc = pfn;
psp.lParam = 0;
ppsh->phpage[ppsh->nPages] = CreatePropertySheetPage(&psp);
if (ppsh->phpage[ppsh->nPages])
{
ppsh->nPages++;
}
}
}
return (hInst);
}
////////////////////////////////////////////////////////////////////////////
//
// 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 Input Locale page.
//
hInst = AddExternalPropSheetPage( &psh,
DLG_KEYBOARD_LOCALES,
TEXT("intl.cpl"),
MAKEINTRESOURCEA(ORD_LOCALE_DLG_PROC) );
//
// 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;
}
}
//
// Add the device page.
//
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = instance;
psp.pszTemplate = MAKEINTRESOURCE(DLG_KEYBD_GENERAL);
psp.pfnDlgProc = KeyboardDevDlg;
psp.lParam = 0;
_AddKeybdPropSheetPage(CreatePropertySheetPage(&psp), (LPARAM)&psh);
//
// 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);
}