3 typedef struct CPStruct
9 struct CPStruct
*NextItem
;
12 static LPCPAGE PCPage
= NULL
;
14 static BOOL bSpain
= FALSE
;
15 static HWND hLangList
;
26 //TCHAR Section[MAX_PATH];
28 Count
= SetupGetLineCountW(hIntlInf
, L
"CodePages");
29 if (Count
<= 0) return FALSE
;
31 for (Number
= 0; Number
< (UINT
)Count
; Number
++)
33 if (SetupGetLineByIndexW(hIntlInf
, L
"CodePages", Number
, &infCont
) &&
34 SetupGetIntField(&infCont
, 0, (PINT
)&uiCPage
))
36 if (!(hCPage
= GlobalAlloc(GHND
, sizeof(CPAGE
)))) return FALSE
;
38 lpCPage
= GlobalLock(hCPage
);
39 lpCPage
->CPage
= uiCPage
;
40 lpCPage
->hCPage
= hCPage
;
42 (lpCPage
->Name
)[0] = 0;
44 if (GetCPInfoEx(uiCPage
, 0, &cpInfEx
))
46 wcscpy(lpCPage
->Name
, cpInfEx
.CodePageName
);
48 else if (!SetupGetStringFieldW(&infCont
, 1, lpCPage
->Name
, MAX_PATH
, NULL
))
55 lpCPage
->NextItem
= PCPage
;
64 InstalledCPProc(PWSTR lpStr
)
75 if (lpCP
->CPage
== uiCP
)
77 lpCP
->Status
|= 0x0001;
80 lpCP
= lpCP
->NextItem
;
87 InitCodePagesList(HWND hwndDlg
)
96 hList
= GetDlgItem(hwndDlg
, IDC_CONV_TABLES
);
98 hIntlInf
= SetupOpenInfFileW(L
"intl.inf", NULL
, INF_STYLE_WIN4
, NULL
);
100 if (hIntlInf
== INVALID_HANDLE_VALUE
)
103 if (!SetupOpenAppendInfFile(NULL
, hIntlInf
, NULL
))
105 SetupCloseInfFile(hIntlInf
);
110 if (!GetSupportedCP())
113 SetupCloseInfFile(hIntlInf
);
115 if (!EnumSystemCodePages(InstalledCPProc
, CP_INSTALLED
))
118 ZeroMemory(&column
, sizeof(LV_COLUMN
));
119 column
.mask
= LVCF_FMT
|LVCF_TEXT
|LVCF_WIDTH
;
120 column
.fmt
= LVCFMT_LEFT
;
121 GetClientRect(hList
, &ListRect
);
122 column
.cx
= ListRect
.right
- GetSystemMetrics(SM_CYHSCROLL
);
123 (VOID
) ListView_InsertColumn(hList
, 0, &column
);
125 (VOID
) ListView_SetExtendedListViewStyle(hList
, LVS_EX_CHECKBOXES
|LVS_EX_FULLROWSELECT
);
132 ZeroMemory(&item
, sizeof(LV_ITEM
));
133 item
.mask
= LVIF_TEXT
|LVIF_PARAM
|LVIF_STATE
;
135 item
.stateMask
= LVIS_STATEIMAGEMASK
;
136 item
.pszText
= lpCPage
->Name
;
137 item
.lParam
= (LPARAM
)lpCPage
;
139 ItemIndex
= ListView_InsertItem(hList
, &item
);
143 if (lpCPage
->Status
& 0x0001)
145 ListView_SetItemState(hList
, ItemIndex
,
146 INDEXTOSTATEIMAGEMASK(LVIS_SELECTED
),
147 LVIS_STATEIMAGEMASK
);
151 ListView_SetItemState(hList
, ItemIndex
,
152 INDEXTOSTATEIMAGEMASK(LVIS_FOCUSED
),
153 LVIS_STATEIMAGEMASK
);
157 lpCPage
= lpCPage
->NextItem
;
162 LocalesEnumProc(PWSTR lpLocale
)
167 BOOL bNoShow
= FALSE
;
169 lcid
= wcstoul(lpLocale
, NULL
, 16);
171 if (lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH
), SORT_DEFAULT
) ||
172 lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH_MODERN
), SORT_DEFAULT
))
176 LoadStringW(hApplet
, IDS_SPAIN
, lang
, 255);
186 GetLocaleInfoW(lcid
, LOCALE_SLANGUAGE
, lang
, sizeof(lang
)/sizeof(WCHAR
));
189 if (bNoShow
== FALSE
)
191 index
= SendMessageW(hLangList
,
196 SendMessageW(hLangList
,
206 InitLanguagesList(HWND hwndDlg
)
210 hLangList
= GetDlgItem(hwndDlg
, IDC_LANGUAGE_COMBO
);
213 EnumSystemLocalesW(LocalesEnumProc
, LCID_SUPPORTED
);
215 /* Select current locale */
216 GetLocaleInfoW(GetSystemDefaultLCID(), LOCALE_SLANGUAGE
, langSel
, sizeof(langSel
)/sizeof(WCHAR
));
218 SendMessageW(hLangList
, CB_SELECTSTRING
, -1, (LPARAM
)langSel
);
222 GetCurrentDPI(LPTSTR szDPI
)
224 DWORD dwType
, dwSize
, dwDPI
, dwDefDPI
= 0x00000060; // Default 96 DPI
227 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI", 0, NULL
,
228 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
230 wcscpy(szDPI
, L
"96");
235 dwSize
= sizeof(DWORD
);
237 if (RegQueryValueExW(hKey
, L
"LogPixels", NULL
, &dwType
, (LPBYTE
)&dwDPI
, &dwSize
) != ERROR_SUCCESS
)
239 if (RegSetValueExW(hKey
, L
"LogPixels", 0, REG_DWORD
, (LPBYTE
)&dwDefDPI
, sizeof(DWORD
)) == ERROR_SUCCESS
)
241 wcscpy(szDPI
, L
"96");
246 else wsprintf(szDPI
, L
"%d", dwDPI
);
252 SetNonUnicodeLang(HWND hwnd
, LCID lcid
)
254 WCHAR szDefCP
[5 + 1], szSection
[MAX_PATH
], szDPI
[3 + 1];
258 GetLocaleInfoW(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_IDEFAULTCODEPAGE
, szDefCP
, sizeof(szDefCP
) / sizeof(WCHAR
));
259 GetCurrentDPI(szDPI
);
261 wsprintf(szSection
, L
"Font.CP%s.%s", szDefCP
, szDPI
);
263 hFontInf
= SetupOpenInfFileW(L
"font.inf", NULL
, INF_STYLE_WIN4
, NULL
);
265 if (hFontInf
== INVALID_HANDLE_VALUE
)
268 if (!SetupOpenAppendInfFile(NULL
, hFontInf
, NULL
))
270 SetupCloseInfFile(hFontInf
);
274 Count
= (UINT
) SetupGetLineCount(hFontInf
, szSection
);
275 if (Count
<= 0) return;
277 if (!SetupInstallFromInfSectionW(hwnd
, hFontInf
, szSection
, SPINST_REGISTRY
& ~SPINST_FILES
,
278 NULL
, NULL
, 0, NULL
, NULL
, NULL
, NULL
))
279 MessageBoxW(hwnd
, L
"Unable to install a new language for programs don't support unicode!",
280 NULL
, MB_ICONERROR
| MB_OK
);
282 SetupCloseInfFile(hFontInf
);
298 ret
= GetLocaleInfoW(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_IDEFAULTCODEPAGE
, OEMPage
, sizeof(OEMPage
)/sizeof(WCHAR
));
301 PrintErrorMsgBox(IDS_ERROR_OEM_CODE_PAGE
);
305 ret
= GetLocaleInfoW(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_IDEFAULTANSICODEPAGE
, ACPPage
, sizeof(ACPPage
)/sizeof(WCHAR
));
308 PrintErrorMsgBox(IDS_ERROR_ANSI_CODE_PAGE
);
313 ret
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage", &langKey
);
314 if (ret
!= ERROR_SUCCESS
)
316 PrintErrorMsgBox(IDS_ERROR_NLS_CODE_REG
);
320 RegSetValueExW(langKey
, L
"OEMCP", 0, REG_SZ
, (BYTE
*)OEMPage
, (wcslen(OEMPage
) +1 ) * sizeof(WCHAR
));
321 RegSetValueExW(langKey
, L
"ACP", 0, REG_SZ
, (BYTE
*)ACPPage
, (wcslen(ACPPage
) +1 ) * sizeof(WCHAR
));
323 RegCloseKey(langKey
);
326 wsprintf(value
, L
"%04hX", LANGIDFROMLCID(lcid
));
327 valuesize
= (wcslen(value
) + 1) * sizeof(WCHAR
);
330 ret
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Control\\NLS\\Language", &langKey
);
331 if (ret
!= ERROR_SUCCESS
)
333 PrintErrorMsgBox(IDS_ERROR_NLS_KEY_REG
);
337 RegSetValueExW(langKey
, L
"Default", 0, REG_SZ
, (BYTE
*)value
, valuesize
);
338 RegCloseKey(langKey
);
342 /* Property page dialog callback */
344 AdvancedPageProc(HWND hwndDlg
,
349 PGLOBALDATA pGlobalData
;
351 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
356 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
357 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
359 InitLanguagesList(hwndDlg
);
360 InitCodePagesList(hwndDlg
);
364 switch (LOWORD(wParam
))
366 case IDC_LANGUAGE_COMBO
:
367 if (HIWORD(wParam
) == CBN_SELCHANGE
)
369 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
373 case IDC_APPLY_CUR_USER_DEF_PROFILE
:
374 if (HIWORD(wParam
) == BN_CLICKED
)
376 if (SendDlgItemMessageW(hwndDlg
, IDC_APPLY_CUR_USER_DEF_PROFILE
, BM_GETCHECK
, 0, 0))
378 ResourceMessageBox(hwndDlg
,
379 MB_OK
| MB_ICONWARNING
,
380 IDS_APPLY_DEFAULT_TITLE
,
381 IDS_APPLY_DEFAULT_TEXT
);
382 pGlobalData
->bApplyToDefaultUser
= TRUE
;
386 pGlobalData
->bApplyToDefaultUser
= FALSE
;
389 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
397 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
399 if (lpnm
->code
== (UINT
)PSN_APPLY
)
404 PropSheet_UnChanged(GetParent(hwndDlg
), hwndDlg
);
406 iIndex
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
407 if (iIndex
== CB_ERR
)
410 lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iIndex
, 0);
411 if (lcid
== (LCID
)CB_ERR
)
414 SetNonUnicodeLang(hwndDlg
, lcid
);
415 SaveSystemSettings(lcid
);