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
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);
|
|
}
|