- Read the current user locale when the CPL is created.
- Modify the user locale and update the examples when the user selects a new language.
- Save the user locale only if the user changed the settings.
CORE-10074

svn path=/trunk/; revision=69199
This commit is contained in:
Eric Kohl 2015-09-12 15:25:36 +00:00
parent e709e70d0e
commit d53df6db90
3 changed files with 311 additions and 161 deletions

View file

@ -32,10 +32,57 @@
#define SAMPLE_NUMBER _T("123456789") #define SAMPLE_NUMBER _T("123456789")
#define NO_FLAG 0 #define NO_FLAG 0
typedef struct
{
LCTYPE lcType;
PWSTR pKeyName;
} LOCALE_KEY_DATA, *PLOCALE_KEY_DATA;
HWND hList; HWND hList;
HWND hLocaleList, hGeoList; HWND hLocaleList, hGeoList;
BOOL bSpain = FALSE; BOOL bSpain = FALSE;
LOCALE_KEY_DATA LocaleKeyData[] =
{
{LOCALE_ICALENDARTYPE, L"iCalendarType"},
{LOCALE_ICOUNTRY, L"iCountry"},
{LOCALE_ICURRDIGITS, L"iCurrDigits"},
{LOCALE_ICURRENCY, L"iCurrency"},
{LOCALE_IDATE, L"iDate"},
{LOCALE_IDIGITS, L"iDigits"},
{LOCALE_IFIRSTDAYOFWEEK, L"iFirstDayOfWeek"},
{LOCALE_IFIRSTWEEKOFYEAR, L"iFirstWeekOfYear"},
{LOCALE_ILZERO, L"iLZero"},
{LOCALE_IMEASURE, L"iMeasure"},
{LOCALE_INEGCURR, L"iNegCurr"},
{LOCALE_INEGNUMBER, L"iNegNumber"},
{LOCALE_ITIME, L"iTime"},
{LOCALE_ITIMEMARKPOSN, L"iTimePrefix"},
{LOCALE_ITLZERO, L"iTLZero"},
{LOCALE_IDIGITSUBSTITUTION, L"NumShape"},
{LOCALE_S1159, L"s1159"},
{LOCALE_S2359, L"s2359"},
{LOCALE_SCOUNTRY, L"sCountry"},
{LOCALE_SCURRENCY, L"sCurrency"},
{LOCALE_SDATE, L"sDate"},
{LOCALE_SDECIMAL, L"sDecimal"},
{LOCALE_SGROUPING, L"sGrouping"},
{LOCALE_SABBREVLANGNAME, L"sLanguage"},
{LOCALE_SLIST, L"sList"},
{LOCALE_SLONGDATE, L"sLongDate"},
{LOCALE_SMONDECIMALSEP, L"sMonDecimalSep"},
{LOCALE_SMONGROUPING, L"sMonGrouping"},
{LOCALE_SMONTHOUSANDSEP, L"sMonThousandSep"},
{LOCALE_SNATIVEDIGITS, L"sNativeDigits"},
{LOCALE_SNEGATIVESIGN, L"sNegativeSign"},
{LOCALE_SPOSITIVESIGN, L"sPositiveSign"},
{LOCALE_SSHORTDATE, L"sShortDate"},
{LOCALE_STHOUSAND, L"sThousand"},
{LOCALE_STIME, L"sTime"},
{LOCALE_STIMEFORMAT, L"sTimeFormat"}
};
static BOOL CALLBACK static BOOL CALLBACK
LocalesEnumProc(LPTSTR lpLocale) LocalesEnumProc(LPTSTR lpLocale)
{ {
@ -84,42 +131,66 @@ LocalesEnumProc(LPTSTR lpLocale)
return TRUE; return TRUE;
} }
/* Update all locale samples */
static VOID PWSTR
UpdateLocaleSample(HWND hwndDlg, LCID lcidLocale) GetLocaleString(
PWSTR *pLocaleArray,
LCTYPE lcType)
{ {
TCHAR OutBuffer[MAX_SAMPLES_STR_SIZE]; DWORD dwDataCount, i;
dwDataCount = sizeof(LocaleKeyData) / sizeof(LOCALE_KEY_DATA);
for (i = 0; i < dwDataCount; i++)
{
if (LocaleKeyData[i].lcType == lcType)
return pLocaleArray[i];
}
return NULL;
}
/* Update all locale samples */
static
VOID
UpdateLocaleSample(
HWND hwndDlg,
PGLOBALDATA pGlobalData)
{
WCHAR OutBuffer[MAX_SAMPLES_STR_SIZE];
/* Get number format sample */ /* Get number format sample */
GetNumberFormat(lcidLocale, NO_FLAG, SAMPLE_NUMBER, NULL, OutBuffer, GetNumberFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL,
MAX_SAMPLES_STR_SIZE); OutBuffer, MAX_SAMPLES_STR_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_NUMSAMPLE_EDIT), SendDlgItemMessageW(hwndDlg, IDC_NUMSAMPLE_EDIT,
WM_SETTEXT, 0, (LPARAM)OutBuffer); WM_SETTEXT, 0, (LPARAM)OutBuffer);
ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get monetary format sample */ /* Get monetary format sample */
GetCurrencyFormat(lcidLocale, LOCALE_USE_CP_ACP, SAMPLE_NUMBER, NULL, GetCurrencyFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL,
OutBuffer, MAX_SAMPLES_STR_SIZE); OutBuffer, MAX_SAMPLES_STR_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_MONEYSAMPLE_EDIT), SendDlgItemMessageW(hwndDlg, IDC_MONEYSAMPLE_EDIT,
WM_SETTEXT, 0, (LPARAM)OutBuffer); WM_SETTEXT, 0, (LPARAM)OutBuffer);
ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get time format sample */ /* Get time format sample */
GetTimeFormat(lcidLocale, NO_FLAG, NULL, NULL, OutBuffer, MAX_SAMPLES_STR_SIZE); GetTimeFormatW(pGlobalData->lcid, NO_FLAG, NULL, NULL,
SendMessage(GetDlgItem(hwndDlg, IDC_TIMESAMPLE_EDIT), OutBuffer, MAX_SAMPLES_STR_SIZE);
WM_SETTEXT, SendDlgItemMessageW(hwndDlg, IDC_TIMESAMPLE_EDIT,
0, WM_SETTEXT, 0, (LPARAM)OutBuffer);
(LPARAM)OutBuffer); ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get short date format sample */ /* Get short date format sample */
GetDateFormat(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer, GetDateFormatW(pGlobalData->lcid, DATE_SHORTDATE, NULL, NULL,
MAX_SAMPLES_STR_SIZE); OutBuffer, MAX_SAMPLES_STR_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT), WM_SETTEXT, SendDlgItemMessageW(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT,
0, (LPARAM)OutBuffer); WM_SETTEXT, 0, (LPARAM)OutBuffer);
/* Get long date sample */ /* Get long date sample */
GetDateFormat(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer, GetDateFormatW(pGlobalData->lcid, DATE_LONGDATE, NULL, NULL,
MAX_SAMPLES_STR_SIZE); OutBuffer, MAX_SAMPLES_STR_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_FULLTIMESAMPLE_EDIT), SendDlgItemMessageW(hwndDlg, IDC_FULLTIMESAMPLE_EDIT,
WM_SETTEXT, 0, (LPARAM)OutBuffer); WM_SETTEXT, 0, (LPARAM)OutBuffer);
} }
static VOID static VOID
@ -135,9 +206,6 @@ CreateLanguagesList(HWND hwnd)
/* or should it be System and not user? */ /* or should it be System and not user? */
GetLocaleInfo(GetUserDefaultLCID(), LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(TCHAR)); GetLocaleInfo(GetUserDefaultLCID(), LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(TCHAR));
DPRINT("LCID: %08lx\n", GetUserDefaultLCID());
DPRINT("Language: %S\n", langSel);
SendMessage(hList, SendMessage(hList,
CB_SELECTSTRING, CB_SELECTSTRING,
-1, -1,
@ -145,33 +213,134 @@ CreateLanguagesList(HWND hwnd)
} }
static BOOL
VOID LoadCurrentLocale(
SetLocaleString(HKEY hKey, PGLOBALDATA pGlobalData)
LCID lcId,
LCTYPE lcType,
PWSTR pszValueName)
{ {
WCHAR szBuffer[256]; WCHAR szValue[9];
PWSTR ptr;
HKEY hLocaleKey;
DWORD ret;
DWORD dwSize;
DWORD i;
if (GetLocaleInfo(lcId, ret = RegOpenKeyExW(HKEY_CURRENT_USER,
lcType | LOCALE_NOUSEROVERRIDE, L"Control Panel\\International",
szBuffer, 0,
256)) KEY_READ,
&hLocaleKey);
if (ret != ERROR_SUCCESS)
{ {
RegSetValueExW(hKey, PrintErrorMsgBox(IDS_ERROR_INT_KEY_REG);
pszValueName, return FALSE;
0, }
REG_SZ,
(PBYTE)szBuffer, pGlobalData->dwLocaleCount = sizeof(LocaleKeyData) / sizeof(LOCALE_KEY_DATA);
(wcslen(szBuffer) + 1) * sizeof(WCHAR));
pGlobalData->pLocaleArray = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
pGlobalData->dwLocaleCount * sizeof(PWSTR));
if (pGlobalData->pLocaleArray == NULL)
{
RegCloseKey(hLocaleKey);
return FALSE;
}
dwSize = 9 * sizeof(WCHAR);
RegQueryValueExW(hLocaleKey,
L"Locale",
NULL,
NULL,
(PBYTE)szValue,
&dwSize);
pGlobalData->lcid = (LCID)wcstoul(szValue, &ptr, 16);
for (i = 0; i < pGlobalData->dwLocaleCount; i++)
{
RegQueryValueExW(hLocaleKey,
LocaleKeyData[i].pKeyName,
NULL,
NULL,
NULL,
&dwSize);
if (dwSize > 0)
{
pGlobalData->pLocaleArray[i] = HeapAlloc(GetProcessHeap(), 0, dwSize);
if (pGlobalData->pLocaleArray[i])
{
RegQueryValueExW(hLocaleKey,
LocaleKeyData[i].pKeyName,
NULL,
NULL,
(LPVOID)pGlobalData->pLocaleArray[i],
&dwSize);
}
}
}
RegCloseKey(hLocaleKey);
return TRUE;
}
VOID
FreeCurrentLocale(
PGLOBALDATA pGlobalData)
{
DWORD i;
if (pGlobalData == NULL || pGlobalData->pLocaleArray == NULL)
return;
for (i = 0; i < pGlobalData->dwLocaleCount; i++)
{
if (pGlobalData->pLocaleArray[i])
HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray[i]);
}
HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray);
}
VOID
SetNewLocale(
PGLOBALDATA pGlobalData,
LCID lcid)
{
DWORD i, dwSize;
pGlobalData->lcid = lcid;
for (i = 0; i < pGlobalData->dwLocaleCount; i++)
{
if (pGlobalData->pLocaleArray[i])
{
HeapFree(GetProcessHeap(), 0, pGlobalData->pLocaleArray[i]);
pGlobalData->pLocaleArray[i] = NULL;
}
dwSize = GetLocaleInfo(lcid,
LocaleKeyData[i].lcType | LOCALE_NOUSEROVERRIDE,
NULL,
0);
if (dwSize > 0)
{
pGlobalData->pLocaleArray[i] = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR));
if (pGlobalData->pLocaleArray[i])
{
GetLocaleInfo(lcid,
LocaleKeyData[i].lcType | LOCALE_NOUSEROVERRIDE,
pGlobalData->pLocaleArray[i],
dwSize);
}
}
} }
} }
/* Sets new locale */ /* Sets new locale */
VOID VOID
SetNewLocale(LCID lcid) SaveCurrentLocale(
PGLOBALDATA pGlobalData)
{ {
// HKCU\\Control Panel\\International\\Locale = 0409 (type=0) // HKCU\\Control Panel\\International\\Locale = 0409 (type=0)
// HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" (type=0) // HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" (type=0)
@ -179,12 +348,10 @@ SetNewLocale(LCID lcid)
// Set locale // Set locale
HKEY localeKey; HKEY localeKey;
// HKEY langKey;
DWORD ret; DWORD ret;
WCHAR value[9]; WCHAR value[9];
DWORD valuesize; DWORD valuesize;
// TCHAR ACPPage[9]; DWORD i;
// TCHAR OEMPage[9];
#if 0 #if 0
ret = GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, OEMPage, sizeof(OEMPage)/sizeof(TCHAR)); ret = GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, OEMPage, sizeof(OEMPage)/sizeof(TCHAR));
@ -210,7 +377,7 @@ SetNewLocale(LCID lcid)
return; return;
} }
wsprintf(value, L"%08x", (DWORD)lcid); wsprintf(value, L"%08x", (DWORD)pGlobalData->lcid);
valuesize = (wcslen(value) + 1) * sizeof(WCHAR); valuesize = (wcslen(value) + 1) * sizeof(WCHAR);
ret = RegSetValueExW(localeKey, L"Locale", 0, REG_SZ, (PBYTE)value, valuesize); ret = RegSetValueExW(localeKey, L"Locale", 0, REG_SZ, (PBYTE)value, valuesize);
@ -221,49 +388,22 @@ SetNewLocale(LCID lcid)
return; return;
} }
SetLocaleString(localeKey, lcid, LOCALE_ICALENDARTYPE, L"iCalendarType"); for (i = 0; i < pGlobalData->dwLocaleCount; i++)
SetLocaleString(localeKey, lcid, LOCALE_ICOUNTRY, L"iCountry"); {
SetLocaleString(localeKey, lcid, LOCALE_ICURRDIGITS, L"iCurrDigits"); RegSetValueExW(localeKey,
SetLocaleString(localeKey, lcid, LOCALE_ICURRENCY, L"iCurrency"); LocaleKeyData[i].pKeyName,
SetLocaleString(localeKey, lcid, LOCALE_IDATE, L"iDate"); 0,
SetLocaleString(localeKey, lcid, LOCALE_IDIGITS, L"iDigits"); REG_SZ,
SetLocaleString(localeKey, lcid, LOCALE_IFIRSTDAYOFWEEK, L"iFirstDayOfWeek"); (PBYTE)pGlobalData->pLocaleArray[i],
SetLocaleString(localeKey, lcid, LOCALE_IFIRSTWEEKOFYEAR, L"iFirstWeekOfYear"); (wcslen(pGlobalData->pLocaleArray[i]) + 1) * sizeof(WCHAR));
SetLocaleString(localeKey, lcid, LOCALE_ILZERO, L"iLZero"); }
SetLocaleString(localeKey, lcid, LOCALE_IMEASURE, L"iMeasure");
SetLocaleString(localeKey, lcid, LOCALE_INEGCURR, L"iNegCurr");
SetLocaleString(localeKey, lcid, LOCALE_INEGNUMBER, L"iNegNumber");
SetLocaleString(localeKey, lcid, LOCALE_ITIME, L"iTime");
SetLocaleString(localeKey, lcid, LOCALE_ITIMEMARKPOSN, L"iTimePrefix");
SetLocaleString(localeKey, lcid, LOCALE_ITLZERO, L"iTLZero");
SetLocaleString(localeKey, lcid, LOCALE_IDIGITSUBSTITUTION, L"NumShape");
SetLocaleString(localeKey, lcid, LOCALE_S1159, L"s1159");
SetLocaleString(localeKey, lcid, LOCALE_S2359, L"s2359");
SetLocaleString(localeKey, lcid, LOCALE_SCOUNTRY, L"sCountry");
SetLocaleString(localeKey, lcid, LOCALE_SCURRENCY, L"sCurrency");
SetLocaleString(localeKey, lcid, LOCALE_SDATE, L"sDate");
SetLocaleString(localeKey, lcid, LOCALE_SDECIMAL, L"sDecimal");
SetLocaleString(localeKey, lcid, LOCALE_SGROUPING, L"sGrouping");
SetLocaleString(localeKey, lcid, LOCALE_SABBREVLANGNAME, L"sLanguage");
SetLocaleString(localeKey, lcid, LOCALE_SLIST, L"sList");
SetLocaleString(localeKey, lcid, LOCALE_SLONGDATE, L"sLongDate");
SetLocaleString(localeKey, lcid, LOCALE_SMONDECIMALSEP, L"sMonDecimalSep");
SetLocaleString(localeKey, lcid, LOCALE_SMONGROUPING, L"sMonGrouping");
SetLocaleString(localeKey, lcid, LOCALE_SMONTHOUSANDSEP, L"sMonThousandSep");
SetLocaleString(localeKey, lcid, LOCALE_SNATIVEDIGITS, L"sNativeDigits");
SetLocaleString(localeKey, lcid, LOCALE_SNEGATIVESIGN, L"sNegativeSign");
SetLocaleString(localeKey, lcid, LOCALE_SPOSITIVESIGN, L"sPositiveSign");
SetLocaleString(localeKey, lcid, LOCALE_SSHORTDATE, L"sShortDate");
SetLocaleString(localeKey, lcid, LOCALE_STHOUSAND, L"sThousand");
SetLocaleString(localeKey, lcid, LOCALE_STIME, L"sTime");
SetLocaleString(localeKey, lcid, LOCALE_STIMEFORMAT, L"sTimeFormat");
/* Flush and close the locale key */ /* Flush and close the locale key */
RegFlushKey(localeKey); RegFlushKey(localeKey);
RegCloseKey(localeKey); RegCloseKey(localeKey);
/* Set the new locale for the current process */ /* Set the new locale for the current process */
NtSetDefaultLocale(TRUE, lcid); NtSetDefaultLocale(TRUE, pGlobalData->lcid);
#if 0 #if 0
ret = RegOpenKey(HKEY_USERS, _T(".DEFAULT\\Control Panel\\International"), &localeKey); ret = RegOpenKey(HKEY_USERS, _T(".DEFAULT\\Control Panel\\International"), &localeKey);
@ -316,7 +456,7 @@ LocationsEnumProc(GEOID gId)
TCHAR loc[MAX_STR_SIZE]; TCHAR loc[MAX_STR_SIZE];
INT index; INT index;
if(GetGeoInfo(gId, GEO_FRIENDLYNAME, loc, MAX_STR_SIZE, LANG_SYSTEM_DEFAULT) == 0) if (GetGeoInfo(gId, GEO_FRIENDLYNAME, loc, MAX_STR_SIZE, LANG_SYSTEM_DEFAULT) == 0)
return TRUE; return TRUE;
index = (INT)SendMessage(hGeoList, index = (INT)SendMessage(hGeoList,
@ -334,7 +474,7 @@ LocationsEnumProc(GEOID gId)
/* Enumerate all system locations identifiers */ /* Enumerate all system locations identifiers */
static static
VOID GEOID
CreateLocationsList(HWND hWnd) CreateLocationsList(HWND hWnd)
{ {
GEOID userGeoID; GEOID userGeoID;
@ -356,6 +496,8 @@ CreateLocationsList(HWND hWnd)
CB_SELECTSTRING, CB_SELECTSTRING,
(WPARAM) -1, (WPARAM) -1,
(LPARAM)loc); (LPARAM)loc);
return userGeoID;
} }
DWORD DWORD
@ -396,21 +538,37 @@ GeneralPageProc(HWND hwndDlg,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
switch(uMsg) PGLOBALDATA pGlobalData;
pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg)
{ {
case WM_INITDIALOG: case WM_INITDIALOG:
CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST)); pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBALDATA));
UpdateLocaleSample(hwndDlg, GetUserDefaultLCID()); SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO));
if (IsUnattendedSetupEnabled) if (pGlobalData)
{ {
if (VerifyUnattendLCID(hwndDlg)) LoadCurrentLocale(pGlobalData);
CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST));
UpdateLocaleSample(hwndDlg, pGlobalData);
pGlobalData->geoid = CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO));
if (IsUnattendedSetupEnabled)
{ {
SetNewLocale(UnattendLCID); if (VerifyUnattendLCID(hwndDlg))
PostQuitMessage(0); {
} else SetNewLocale(pGlobalData, UnattendLCID);
DPRINT1("VerifyUnattendLCID failed\n"); SaveCurrentLocale(pGlobalData);
return TRUE; PostQuitMessage(0);
}
else
{
DPRINT1("VerifyUnattendLCID failed\n");
}
return TRUE;
}
} }
break; break;
@ -437,7 +595,9 @@ GeneralPageProc(HWND hwndDlg,
if (NewLcid == (LCID)CB_ERR) if (NewLcid == (LCID)CB_ERR)
break; break;
UpdateLocaleSample(hwndDlg, NewLcid); SetNewLocale(pGlobalData, NewLcid);
UpdateLocaleSample(hwndDlg, pGlobalData);
pGlobalData->fUserLocaleChanged = TRUE;
PropSheet_Changed(GetParent(hwndDlg), hwndDlg); PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
} }
@ -446,31 +606,33 @@ GeneralPageProc(HWND hwndDlg,
case IDC_LOCATION_COMBO: case IDC_LOCATION_COMBO:
if (HIWORD(wParam) == CBN_SELCHANGE) if (HIWORD(wParam) == CBN_SELCHANGE)
{ {
PropSheet_Changed(GetParent(hwndDlg), hwndDlg); GEOID NewGeoID;
}
break;
case IDC_SETUP_BUTTON:
{
LCID NewLcid;
INT iCurSel; INT iCurSel;
iCurSel = SendMessage(hList, iCurSel = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
CB_GETCURSEL, CB_GETCURSEL,
0, 0,
0); 0);
if (iCurSel == CB_ERR) if (iCurSel == CB_ERR)
break; break;
NewLcid = SendMessage(hList, NewGeoID = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
CB_GETITEMDATA, CB_GETITEMDATA,
iCurSel, iCurSel,
0); 0);
if (NewLcid == (LCID)CB_ERR) if (NewGeoID == (GEOID)CB_ERR)
break; break;
SetupApplet(GetParent(hwndDlg), NewLcid); pGlobalData->geoid = NewGeoID;
pGlobalData->fGeoIdChanged = TRUE;
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
} }
break; break;
case IDC_SETUP_BUTTON:
SetupApplet(GetParent(hwndDlg), pGlobalData);
break;
} }
break; break;
@ -481,49 +643,35 @@ GeneralPageProc(HWND hwndDlg,
if (lpnm->code == (UINT)PSN_APPLY) if (lpnm->code == (UINT)PSN_APPLY)
{ {
/* Apply changes */ /* Apply changes */
LCID NewLcid;
GEOID NewGeoID;
INT iCurSel;
PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg); PropSheet_UnChanged(GetParent(hwndDlg), hwndDlg);
/* Acquire new value */
iCurSel = SendMessage(hList,
CB_GETCURSEL,
0,
0);
if (iCurSel == CB_ERR)
break;
NewLcid = SendMessage(hList,
CB_GETITEMDATA,
iCurSel,
0);
if (NewLcid == (LCID)CB_ERR)
break;
iCurSel = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
CB_GETCURSEL,
0,
0);
if (iCurSel == CB_ERR)
break;
NewGeoID = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
CB_GETITEMDATA,
iCurSel,
0);
if (NewGeoID == (GEOID)CB_ERR)
break;
/* Set new locale */ /* Set new locale */
SetNewLocale(NewLcid); if (pGlobalData->fUserLocaleChanged == TRUE)
AddNewKbLayoutsByLcid(NewLcid); {
SetUserGeoID(NewGeoID); SaveCurrentLocale(pGlobalData);
SetNonUnicodeLang(hwndDlg, NewLcid); pGlobalData->fUserLocaleChanged = FALSE;
}
/* Set new GEO ID */
if (pGlobalData->fGeoIdChanged == TRUE)
{
SetUserGeoID(pGlobalData->geoid);
pGlobalData->fGeoIdChanged = FALSE;
}
AddNewKbLayoutsByLcid(pGlobalData->lcid);
SetNonUnicodeLang(hwndDlg, pGlobalData->lcid);
} }
} }
break; break;
case WM_DESTROY:
if (pGlobalData)
{
FreeCurrentLocale(pGlobalData);
HeapFree(GetProcessHeap(), 0, pGlobalData);
}
break;
} }
return FALSE; return FALSE;

View file

@ -2,6 +2,7 @@
#define _INTL_H #define _INTL_H
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h>
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include <windef.h> #include <windef.h>
@ -53,7 +54,13 @@ typedef struct _APPLET
typedef struct _GLOBALDATA typedef struct _GLOBALDATA
{ {
GEOID geoid;
BOOL fGeoIdChanged;
LCID lcid; LCID lcid;
DWORD dwLocaleCount;
PWSTR *pLocaleArray;
BOOL fUserLocaleChanged;
} GLOBALDATA, *PGLOBALDATA; } GLOBALDATA, *PGLOBALDATA;
extern HINSTANCE hApplet; extern HINSTANCE hApplet;
@ -113,7 +120,7 @@ ReplaceSubStr(LPCTSTR szSourceStr, LPCTSTR szStrToReplace, LPCTSTR szTempl);
LONG LONG
APIENTRY APIENTRY
SetupApplet(HWND hwndDlg, LCID lcid); SetupApplet(HWND hwndDlg, PGLOBALDATA pGlobalData);
/* kblayouts.c */ /* kblayouts.c */
VOID AddNewKbLayoutsByLcid(LCID Lcid); VOID AddNewKbLayoutsByLcid(LCID Lcid);

View file

@ -184,20 +184,17 @@ InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, PGLOBALDATA p
/* Create applets */ /* Create applets */
LONG LONG
APIENTRY APIENTRY
SetupApplet(HWND hwndDlg, LCID lcid) SetupApplet(
HWND hwndDlg,
PGLOBALDATA pGlobalData)
{ {
PROPSHEETPAGE PsPage[NUM_SHEETS + 1]; PROPSHEETPAGE PsPage[NUM_SHEETS + 1];
PROPSHEETHEADER psh; PROPSHEETHEADER psh;
PGLOBALDATA pGlobalData;
TCHAR Caption[MAX_STR_SIZE]; TCHAR Caption[MAX_STR_SIZE];
INT ret; INT ret;
LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR)); LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR));
pGlobalData = (PGLOBALDATA)malloc(sizeof(GLOBALDATA));
pGlobalData->lcid = lcid;
ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE; psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;
@ -214,7 +211,7 @@ SetupApplet(HWND hwndDlg, LCID lcid)
InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, pGlobalData); InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, pGlobalData);
InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, pGlobalData); InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, pGlobalData);
if (IsSortPageNeeded(lcid)) if (IsSortPageNeeded(pGlobalData->lcid))
{ {
psh.nPages++; psh.nPages++;
InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, pGlobalData); InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, pGlobalData);
@ -222,8 +219,6 @@ SetupApplet(HWND hwndDlg, LCID lcid)
ret = PropertySheet(&psh); ret = PropertySheet(&psh);
free(pGlobalData);
return (LONG)(ret != -1); return (LONG)(ret != -1);
} }