// // Include Files. // #include "input.h" #include #include #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); }