Author: ekohl Date: Sat Sep 12 15:25:36 2015 New Revision: 69199
URL: http://svn.reactos.org/svn/reactos?rev=69199&view=rev Log: [INTL] - 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
Modified: trunk/reactos/dll/cpl/intl/generalp.c trunk/reactos/dll/cpl/intl/intl.h trunk/reactos/dll/cpl/intl/misc.c
Modified: trunk/reactos/dll/cpl/intl/generalp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/intl/generalp.c?rev... ============================================================================== --- trunk/reactos/dll/cpl/intl/generalp.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/intl/generalp.c [iso-8859-1] Sat Sep 12 15:25:36 2015 @@ -32,9 +32,56 @@ #define SAMPLE_NUMBER _T("123456789") #define NO_FLAG 0
+typedef struct +{ + LCTYPE lcType; + PWSTR pKeyName; +} LOCALE_KEY_DATA, *PLOCALE_KEY_DATA; + HWND hList; HWND hLocaleList, hGeoList; 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 LocalesEnumProc(LPTSTR lpLocale) @@ -84,42 +131,66 @@ return TRUE; }
+ +PWSTR +GetLocaleString( + PWSTR *pLocaleArray, + LCTYPE lcType) +{ + 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, LCID lcidLocale) -{ - TCHAR OutBuffer[MAX_SAMPLES_STR_SIZE]; +static +VOID +UpdateLocaleSample( + HWND hwndDlg, + PGLOBALDATA pGlobalData) +{ + WCHAR OutBuffer[MAX_SAMPLES_STR_SIZE];
/* Get number format sample */ - GetNumberFormat(lcidLocale, NO_FLAG, SAMPLE_NUMBER, NULL, OutBuffer, - MAX_SAMPLES_STR_SIZE); - SendMessage(GetDlgItem(hwndDlg, IDC_NUMSAMPLE_EDIT), - WM_SETTEXT, 0, (LPARAM)OutBuffer); + GetNumberFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL, + OutBuffer, MAX_SAMPLES_STR_SIZE); + SendDlgItemMessageW(hwndDlg, IDC_NUMSAMPLE_EDIT, + WM_SETTEXT, 0, (LPARAM)OutBuffer); + ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get monetary format sample */ - GetCurrencyFormat(lcidLocale, LOCALE_USE_CP_ACP, SAMPLE_NUMBER, NULL, - OutBuffer, MAX_SAMPLES_STR_SIZE); - SendMessage(GetDlgItem(hwndDlg, IDC_MONEYSAMPLE_EDIT), - WM_SETTEXT, 0, (LPARAM)OutBuffer); + GetCurrencyFormatW(pGlobalData->lcid, NO_FLAG, SAMPLE_NUMBER, NULL, + OutBuffer, MAX_SAMPLES_STR_SIZE); + SendDlgItemMessageW(hwndDlg, IDC_MONEYSAMPLE_EDIT, + WM_SETTEXT, 0, (LPARAM)OutBuffer); + ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get time format sample */ - GetTimeFormat(lcidLocale, NO_FLAG, NULL, NULL, OutBuffer, MAX_SAMPLES_STR_SIZE); - SendMessage(GetDlgItem(hwndDlg, IDC_TIMESAMPLE_EDIT), - WM_SETTEXT, - 0, - (LPARAM)OutBuffer); + GetTimeFormatW(pGlobalData->lcid, NO_FLAG, NULL, NULL, + OutBuffer, MAX_SAMPLES_STR_SIZE); + SendDlgItemMessageW(hwndDlg, IDC_TIMESAMPLE_EDIT, + WM_SETTEXT, 0, (LPARAM)OutBuffer); + ZeroMemory(OutBuffer, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
/* Get short date format sample */ - GetDateFormat(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer, - MAX_SAMPLES_STR_SIZE); - SendMessage(GetDlgItem(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT), WM_SETTEXT, - 0, (LPARAM)OutBuffer); + GetDateFormatW(pGlobalData->lcid, DATE_SHORTDATE, NULL, NULL, + OutBuffer, MAX_SAMPLES_STR_SIZE); + SendDlgItemMessageW(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT, + WM_SETTEXT, 0, (LPARAM)OutBuffer);
/* Get long date sample */ - GetDateFormat(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer, - MAX_SAMPLES_STR_SIZE); - SendMessage(GetDlgItem(hwndDlg, IDC_FULLTIMESAMPLE_EDIT), - WM_SETTEXT, 0, (LPARAM)OutBuffer); + GetDateFormatW(pGlobalData->lcid, DATE_LONGDATE, NULL, NULL, + OutBuffer, MAX_SAMPLES_STR_SIZE); + SendDlgItemMessageW(hwndDlg, IDC_FULLTIMESAMPLE_EDIT, + WM_SETTEXT, 0, (LPARAM)OutBuffer); }
static VOID @@ -134,9 +205,6 @@ /* Select current locale */ /* or should it be System and not user? */ GetLocaleInfo(GetUserDefaultLCID(), LOCALE_SLANGUAGE, langSel, sizeof(langSel)/sizeof(TCHAR)); - - DPRINT("LCID: %08lx\n", GetUserDefaultLCID()); - DPRINT("Language: %S\n", langSel);
SendMessage(hList, CB_SELECTSTRING, @@ -145,33 +213,134 @@ }
-static +BOOL +LoadCurrentLocale( + PGLOBALDATA pGlobalData) +{ + WCHAR szValue[9]; + PWSTR ptr; + HKEY hLocaleKey; + DWORD ret; + DWORD dwSize; + DWORD i; + + ret = RegOpenKeyExW(HKEY_CURRENT_USER, + L"Control Panel\International", + 0, + KEY_READ, + &hLocaleKey); + if (ret != ERROR_SUCCESS) + { + PrintErrorMsgBox(IDS_ERROR_INT_KEY_REG); + return FALSE; + } + + pGlobalData->dwLocaleCount = sizeof(LocaleKeyData) / sizeof(LOCALE_KEY_DATA); + + 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 -SetLocaleString(HKEY hKey, - LCID lcId, - LCTYPE lcType, - PWSTR pszValueName) -{ - WCHAR szBuffer[256]; - - if (GetLocaleInfo(lcId, - lcType | LOCALE_NOUSEROVERRIDE, - szBuffer, - 256)) - { - RegSetValueExW(hKey, - pszValueName, - 0, - REG_SZ, - (PBYTE)szBuffer, - (wcslen(szBuffer) + 1) * sizeof(WCHAR)); +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 */ VOID -SetNewLocale(LCID lcid) +SaveCurrentLocale( + PGLOBALDATA pGlobalData) { // HKCU\Control Panel\International\Locale = 0409 (type=0) // HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" (type=0) @@ -179,12 +348,10 @@
// Set locale HKEY localeKey; -// HKEY langKey; DWORD ret; WCHAR value[9]; DWORD valuesize; -// TCHAR ACPPage[9]; -// TCHAR OEMPage[9]; + DWORD i;
#if 0 ret = GetLocaleInfo(MAKELCID(lcid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, OEMPage, sizeof(OEMPage)/sizeof(TCHAR)); @@ -210,7 +377,7 @@ return; }
- wsprintf(value, L"%08x", (DWORD)lcid); + wsprintf(value, L"%08x", (DWORD)pGlobalData->lcid); valuesize = (wcslen(value) + 1) * sizeof(WCHAR);
ret = RegSetValueExW(localeKey, L"Locale", 0, REG_SZ, (PBYTE)value, valuesize); @@ -221,49 +388,22 @@ return; }
- SetLocaleString(localeKey, lcid, LOCALE_ICALENDARTYPE, L"iCalendarType"); - SetLocaleString(localeKey, lcid, LOCALE_ICOUNTRY, L"iCountry"); - SetLocaleString(localeKey, lcid, LOCALE_ICURRDIGITS, L"iCurrDigits"); - SetLocaleString(localeKey, lcid, LOCALE_ICURRENCY, L"iCurrency"); - SetLocaleString(localeKey, lcid, LOCALE_IDATE, L"iDate"); - SetLocaleString(localeKey, lcid, LOCALE_IDIGITS, L"iDigits"); - SetLocaleString(localeKey, lcid, LOCALE_IFIRSTDAYOFWEEK, L"iFirstDayOfWeek"); - SetLocaleString(localeKey, lcid, LOCALE_IFIRSTWEEKOFYEAR, L"iFirstWeekOfYear"); - 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"); + for (i = 0; i < pGlobalData->dwLocaleCount; i++) + { + RegSetValueExW(localeKey, + LocaleKeyData[i].pKeyName, + 0, + REG_SZ, + (PBYTE)pGlobalData->pLocaleArray[i], + (wcslen(pGlobalData->pLocaleArray[i]) + 1) * sizeof(WCHAR)); + }
/* Flush and close the locale key */ RegFlushKey(localeKey); RegCloseKey(localeKey);
/* Set the new locale for the current process */ - NtSetDefaultLocale(TRUE, lcid); + NtSetDefaultLocale(TRUE, pGlobalData->lcid);
#if 0 ret = RegOpenKey(HKEY_USERS, _T(".DEFAULT\Control Panel\International"), &localeKey); @@ -316,7 +456,7 @@ TCHAR loc[MAX_STR_SIZE]; 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;
index = (INT)SendMessage(hGeoList, @@ -334,7 +474,7 @@
/* Enumerate all system locations identifiers */ static -VOID +GEOID CreateLocationsList(HWND hWnd) { GEOID userGeoID; @@ -356,6 +496,8 @@ CB_SELECTSTRING, (WPARAM) -1, (LPARAM)loc); + + return userGeoID; }
DWORD @@ -396,21 +538,37 @@ WPARAM wParam, LPARAM lParam) { - switch(uMsg) + PGLOBALDATA pGlobalData; + + pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch (uMsg) { case WM_INITDIALOG: - CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST)); - UpdateLocaleSample(hwndDlg, GetUserDefaultLCID()); - CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO)); - if (IsUnattendedSetupEnabled) + pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBALDATA)); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData); + + 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); - PostQuitMessage(0); - } else - DPRINT1("VerifyUnattendLCID failed\n"); - return TRUE; + if (VerifyUnattendLCID(hwndDlg)) + { + SetNewLocale(pGlobalData, UnattendLCID); + SaveCurrentLocale(pGlobalData); + PostQuitMessage(0); + } + else + { + DPRINT1("VerifyUnattendLCID failed\n"); + } + return TRUE; + } } break;
@@ -437,7 +595,9 @@ if (NewLcid == (LCID)CB_ERR) break;
- UpdateLocaleSample(hwndDlg, NewLcid); + SetNewLocale(pGlobalData, NewLcid); + UpdateLocaleSample(hwndDlg, pGlobalData); + pGlobalData->fUserLocaleChanged = TRUE;
PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } @@ -446,30 +606,32 @@ case IDC_LOCATION_COMBO: if (HIWORD(wParam) == CBN_SELCHANGE) { - PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - } - break; - case IDC_SETUP_BUTTON: - { - LCID NewLcid; + GEOID NewGeoID; INT iCurSel;
- iCurSel = SendMessage(hList, + iCurSel = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO), CB_GETCURSEL, 0, 0); if (iCurSel == CB_ERR) break;
- NewLcid = SendMessage(hList, - CB_GETITEMDATA, - iCurSel, - 0); - if (NewLcid == (LCID)CB_ERR) + NewGeoID = SendMessage(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO), + CB_GETITEMDATA, + iCurSel, + 0); + if (NewGeoID == (GEOID)CB_ERR) break;
- SetupApplet(GetParent(hwndDlg), NewLcid); + pGlobalData->geoid = NewGeoID; + pGlobalData->fGeoIdChanged = TRUE; + + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } + break; + + case IDC_SETUP_BUTTON: + SetupApplet(GetParent(hwndDlg), pGlobalData); break; } break; @@ -481,49 +643,35 @@ if (lpnm->code == (UINT)PSN_APPLY) { /* Apply changes */ - LCID NewLcid; - GEOID NewGeoID; - INT iCurSel; - 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 */ - SetNewLocale(NewLcid); - AddNewKbLayoutsByLcid(NewLcid); - SetUserGeoID(NewGeoID); - SetNonUnicodeLang(hwndDlg, NewLcid); + if (pGlobalData->fUserLocaleChanged == TRUE) + { + SaveCurrentLocale(pGlobalData); + 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; + + case WM_DESTROY: + if (pGlobalData) + { + FreeCurrentLocale(pGlobalData); + HeapFree(GetProcessHeap(), 0, pGlobalData); + } + break; }
return FALSE;
Modified: trunk/reactos/dll/cpl/intl/intl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/intl/intl.h?rev=691... ============================================================================== --- trunk/reactos/dll/cpl/intl/intl.h [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/intl/intl.h [iso-8859-1] Sat Sep 12 15:25:36 2015 @@ -2,6 +2,7 @@ #define _INTL_H
#include <stdarg.h> +#include <stdlib.h>
#define WIN32_NO_STATUS #include <windef.h> @@ -53,7 +54,13 @@
typedef struct _GLOBALDATA { + GEOID geoid; + BOOL fGeoIdChanged; + LCID lcid; + DWORD dwLocaleCount; + PWSTR *pLocaleArray; + BOOL fUserLocaleChanged; } GLOBALDATA, *PGLOBALDATA;
extern HINSTANCE hApplet; @@ -113,7 +120,7 @@
LONG APIENTRY -SetupApplet(HWND hwndDlg, LCID lcid); +SetupApplet(HWND hwndDlg, PGLOBALDATA pGlobalData);
/* kblayouts.c */ VOID AddNewKbLayoutsByLcid(LCID Lcid);
Modified: trunk/reactos/dll/cpl/intl/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/intl/misc.c?rev=691... ============================================================================== --- trunk/reactos/dll/cpl/intl/misc.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/intl/misc.c [iso-8859-1] Sat Sep 12 15:25:36 2015 @@ -184,19 +184,16 @@ /* Create applets */ LONG APIENTRY -SetupApplet(HWND hwndDlg, LCID lcid) +SetupApplet( + HWND hwndDlg, + PGLOBALDATA pGlobalData) { PROPSHEETPAGE PsPage[NUM_SHEETS + 1]; PROPSHEETHEADER psh; - PGLOBALDATA pGlobalData; TCHAR Caption[MAX_STR_SIZE]; INT ret;
LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR)); - - pGlobalData = (PGLOBALDATA)malloc(sizeof(GLOBALDATA)); - - pGlobalData->lcid = lcid;
ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); @@ -214,7 +211,7 @@ InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, pGlobalData); InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, pGlobalData);
- if (IsSortPageNeeded(lcid)) + if (IsSortPageNeeded(pGlobalData->lcid)) { psh.nPages++; InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, pGlobalData); @@ -222,8 +219,6 @@
ret = PropertySheet(&psh);
- free(pGlobalData); - return (LONG)(ret != -1); }