Leaked source code of windows server 2003
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.
 
 
 
 
 
 

379 lines
9.3 KiB

//
// Include Files.
//
#include "input.h"
#include <cpl.h>
#include <commctrl.h>
#include "util.h"
//
// Constant Declarations.
//
#define MAX_PAGES 3 // limit on the number of pages
//
// Global Variables.
//
HANDLE g_hMutex = NULL;
TCHAR szMutexName[] = TEXT("TextInput_InputLocaleMutex");
HANDLE g_hEvent = NULL;
TCHAR szEventName[] = TEXT("TextInput_InputLocaleEvent");
HINSTANCE hInstance;
HINSTANCE hInstOrig;
HINSTANCE hInstRes;
//
// Function Prototypes.
//
void
DoProperties(
HWND hwnd,
LPCTSTR pCmdLine);
////////////////////////////////////////////////////////////////////////////
//
// LibMain
//
// This routine is called from LibInit to perform any initialization that
// is required.
//
////////////////////////////////////////////////////////////////////////////
BOOL APIENTRY LibMain(
HANDLE hDll,
DWORD dwReason,
LPVOID lpReserved)
{
switch (dwReason)
{
case ( DLL_PROCESS_ATTACH ) :
{
hInstance = hDll;
hInstOrig = hInstance;
//
// Create the mutex used for the Input Locale property page.
//
g_hMutex = CreateMutex(NULL, FALSE, szMutexName);
g_hEvent = CreateEvent(NULL, TRUE, TRUE, szEventName);
DisableThreadLibraryCalls(hDll);
InitCommonControls();
break;
}
case ( DLL_PROCESS_DETACH ) :
{
if (g_hMutex)
{
CloseHandle(g_hMutex);
}
if (g_hEvent)
{
CloseHandle(g_hEvent);
}
// Free XP SP1 resource instance if we loaded
FreeCicResInstance();
break;
}
case ( DLL_THREAD_DETACH ) :
{
break;
}
case ( DLL_THREAD_ATTACH ) :
default :
{
break;
}
}
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// CreateGlobals
//
////////////////////////////////////////////////////////////////////////////
BOOL CreateGlobals()
{
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
//
// DestroyGlobals
//
////////////////////////////////////////////////////////////////////////////
void DestroyGlobals()
{
}
////////////////////////////////////////////////////////////////////////////
//
// CPlApplet
//
////////////////////////////////////////////////////////////////////////////
LONG CALLBACK CPlApplet(
HWND hwnd,
UINT Msg,
LPARAM lParam1,
LPARAM lParam2)
{
switch (Msg)
{
case ( CPL_INIT ) :
{
//
// First message to CPlApplet(), sent once only.
// Perform all control panel applet initialization and return
// true for further processing.
//
return (CreateGlobals());
}
case ( CPL_GETCOUNT ) :
{
//
// Second message to CPlApplet(), sent once only.
// Return the number of control applets to be displayed in the
// control panel window. For this applet, return 1.
//
return (1);
}
case ( CPL_INQUIRE ) :
{
//
// Third message to CPlApplet().
// It is sent as many times as the number of applets returned by
// CPL_GETCOUNT message. Each applet must register by filling
// in the CPLINFO structure referenced by lParam2 with the
// applet's icon, name, and information string. Since there is
// only one applet, simply set the information for this
// singular case.
//
LPCPLINFO lpCPlInfo = (LPCPLINFO)lParam2;
lpCPlInfo->idIcon = CPL_DYNAMIC_RES;
lpCPlInfo->idName = CPL_DYNAMIC_RES;
lpCPlInfo->idInfo = CPL_DYNAMIC_RES;
lpCPlInfo->lData = 0;
break;
}
case ( CPL_NEWINQUIRE ) :
{
//
// Third message to CPlApplet().
// It is sent as many times as the number of applets returned by
// CPL_GETCOUNT message. Each applet must register by filling
// in the NEWCPLINFO structure referenced by lParam2 with the
// applet's icon, name, and information string. Since there is
// only one applet, simply set the information for this
// singular case.
//
LPNEWCPLINFO lpNewCPlInfo = (LPNEWCPLINFO)lParam2;
lpNewCPlInfo->dwSize = sizeof(NEWCPLINFO);
lpNewCPlInfo->dwFlags = 0;
lpNewCPlInfo->dwHelpContext = 0UL;
lpNewCPlInfo->lData = 0;
lpNewCPlInfo->hIcon = LoadIcon( hInstOrig,
(LPCTSTR)MAKEINTRESOURCE(IDI_ICON) );
LoadString(hInstance, IDS_NAME, lpNewCPlInfo->szName, 32);
LoadString(hInstance, IDS_INFO, lpNewCPlInfo->szInfo, 64);
lpNewCPlInfo->szHelpFile[0] = CHAR_NULL;
break;
}
case ( CPL_SELECT ) :
{
//
// Applet has been selected, do nothing.
//
break;
}
case ( CPL_DBLCLK ) :
{
//
// Applet icon double clicked -- invoke property sheet with
// the first property sheet page on top.
//
DoProperties(hwnd, (LPCTSTR)NULL);
break;
}
case ( CPL_STARTWPARMS ) :
{
//
// Same as CPL_DBLCLK, but lParam2 is a long pointer to
// a string of extra directions that are to be supplied to
// the property sheet that is to be initiated.
//
DoProperties(hwnd, (LPCTSTR)lParam2);
break;
}
case ( CPL_STOP ) :
{
//
// Sent once for each applet prior to the CPL_EXIT msg.
// Perform applet specific cleanup.
//
break;
}
case ( CPL_EXIT ) :
{
//
// Last message, sent once only, before MMCPL.EXE calls
// FreeLibrary() on this DLL. Do non-applet specific cleanup.
//
DestroyGlobals();
break;
}
default :
{
return (FALSE);
}
}
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// AddPage
//
////////////////////////////////////////////////////////////////////////////
void AddPage(
LPPROPSHEETHEADER ppsh,
UINT id,
DLGPROC pfn,
LPARAM lParam)
{
if (ppsh->nPages < MAX_PAGES)
{
PROPSHEETPAGE psp;
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = GetCicResInstance(hInstance, id);
psp.pszTemplate = MAKEINTRESOURCE(id);
psp.pfnDlgProc = pfn;
psp.lParam = lParam;
ppsh->phpage[ppsh->nPages] = CreatePropertySheetPage(&psp);
if (ppsh->phpage[ppsh->nPages])
{
ppsh->nPages++;
}
}
}
////////////////////////////////////////////////////////////////////////////
//
// DoProperties
//
////////////////////////////////////////////////////////////////////////////
void DoProperties(
HWND hwnd,
LPCTSTR pCmdLine)
{
HPROPSHEETPAGE rPages[MAX_PAGES];
PROPSHEETHEADER psh;
LPARAM lParam = 0;
BOOL bQuit = FALSE;
while (pCmdLine && *pCmdLine)
{
if (*pCmdLine == TEXT('/'))
{
switch (*++pCmdLine)
{
case ( TEXT('u') ) :
case ( TEXT('U') ) :
{
CheckInternatModule();
bQuit = TRUE;
break;
}
case ( TEXT('m') ) :
case ( TEXT('M') ) :
{
MigrateCtfmonFromWin9x(pCmdLine+2);
bQuit = TRUE;
break;
}
default :
{
break;
}
}
}
else if (*pCmdLine == TEXT(' '))
{
pCmdLine++;
}
else
{
break;
}
}
if (bQuit)
return;
//
// See if there is a command line switch from Setup.
//
psh.nStartPage = 0;
//
// Set up the property sheet information.
//
psh.dwSize = sizeof(psh);
psh.dwFlags = 0;
psh.hwndParent = hwnd;
psh.hInstance = hInstance;
psh.pszCaption = MAKEINTRESOURCE(IDS_NAME);
psh.nPages = 0;
psh.phpage = rPages;
//
// Add the appropriate property pages.
//
AddPage(&psh, DLG_INPUT_LOCALES, InputLocaleDlgProc, lParam);
AddPage(&psh, DLG_INPUT_ADVANCED, InputAdvancedDlgProc, lParam);
//
// Make the property sheet.
//
PropertySheet(&psh);
}