6 typedef struct CPStruct
11 struct CPStruct
*NextItem
;
14 #define CODEPAGE_INSTALLED 0x00000001
15 #define CODEPAGE_NOT_REMOVEABLE 0x00000002
16 #define CODEPAGE_INSTALL 0x00000004
17 #define CODEPAGE_REMOVE 0x00000008
19 static PCPAGE PCPage
= NULL
;
20 static BOOL bSpain
= FALSE
;
21 static HWND hLangList
;
27 WCHAR szSection
[MAX_PATH
];
28 INFCONTEXT Context
, Context2
;
33 if (!SetupFindFirstLine(hInf
,
41 if (SetupGetIntField(&Context
, 0, (PINT
)&uiCodePage
))
43 pCodePage
= HeapAlloc(GetProcessHeap(), 0, sizeof(CPAGE
));
44 if (pCodePage
== NULL
)
47 pCodePage
->CodePage
= uiCodePage
;
49 (pCodePage
->Name
)[0] = UNICODE_NULL
;
51 if (GetCPInfoExW(uiCodePage
, 0, &cpInfEx
))
53 wcscpy(pCodePage
->Name
, cpInfEx
.CodePageName
);
57 SetupGetStringFieldW(&Context
, 1, pCodePage
->Name
, MAX_PATH
, NULL
);
60 if (wcslen(pCodePage
->Name
) != 0)
62 pCodePage
->NextItem
= PCPage
;
65 wsprintf(szSection
, L
"CODEPAGE_REMOVE_%d", uiCodePage
);
67 if ((uiCodePage
== GetACP()) ||
68 (uiCodePage
== GetOEMCP()) ||
69 (!SetupFindFirstLineW(hInf
, szSection
, L
"AddReg", &Context2
)))
71 pCodePage
->Flags
|= CODEPAGE_NOT_REMOVEABLE
;
76 HeapFree(GetProcessHeap(), 0, pCodePage
);
80 if (!SetupFindNextLine(&Context
, &Context
))
88 InstalledCPProc(PWSTR lpStr
)
101 if (lpCP
->CodePage
== uiCP
)
103 lpCP
->Flags
|= CODEPAGE_INSTALLED
;
107 lpCP
= lpCP
->NextItem
;
114 InitCodePagesList(HWND hwndDlg
)
124 hIntlInf
= SetupOpenInfFileW(L
"intl.inf", NULL
, INF_STYLE_WIN4
, NULL
);
125 if (hIntlInf
== INVALID_HANDLE_VALUE
)
128 if (!SetupOpenAppendInfFile(NULL
, hIntlInf
, NULL
))
130 SetupCloseInfFile(hIntlInf
);
135 if (!GetSupportedCP(hIntlInf
))
138 SetupCloseInfFile(hIntlInf
);
140 if (!EnumSystemCodePagesW(InstalledCPProc
, CP_INSTALLED
))
142 /* Hack: EnumSystemCodePages returns FALSE on successful completion! */
146 hList
= GetDlgItem(hwndDlg
, IDC_CONV_TABLES
);
148 ZeroMemory(&column
, sizeof(LV_COLUMN
));
149 column
.mask
= LVCF_FMT
| LVCF_WIDTH
;
150 column
.fmt
= LVCFMT_LEFT
;
151 GetClientRect(hList
, &ListRect
);
152 column
.cx
= ListRect
.right
- GetSystemMetrics(SM_CYHSCROLL
);
153 ListView_InsertColumn(hList
, 0, &column
);
155 (VOID
) ListView_SetExtendedListViewStyle(hList
, LVS_EX_CHECKBOXES
| LVS_EX_FULLROWSELECT
);
161 if (pCodePage
== NULL
)
164 ZeroMemory(&item
, sizeof(LV_ITEM
));
165 item
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
;
167 item
.stateMask
= LVIS_STATEIMAGEMASK
;
168 item
.pszText
= pCodePage
->Name
;
169 item
.lParam
= (LPARAM
)pCodePage
;
171 ItemIndex
= ListView_InsertItem(hList
, &item
);
174 if (pCodePage
->Flags
& CODEPAGE_INSTALLED
)
176 ListView_SetItemState(hList
, ItemIndex
,
177 INDEXTOSTATEIMAGEMASK(LVIS_SELECTED
),
178 LVIS_STATEIMAGEMASK
);
182 ListView_SetItemState(hList
, ItemIndex
,
183 INDEXTOSTATEIMAGEMASK(LVIS_FOCUSED
),
184 LVIS_STATEIMAGEMASK
);
188 pCodePage
= pCodePage
->NextItem
;
193 LocalesEnumProc(PWSTR lpLocale
)
198 BOOL bNoShow
= FALSE
;
200 lcid
= wcstoul(lpLocale
, NULL
, 16);
202 if (lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH
), SORT_DEFAULT
) ||
203 lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH_MODERN
), SORT_DEFAULT
))
207 LoadStringW(hApplet
, IDS_SPAIN
, lang
, 255);
217 GetLocaleInfoW(lcid
, LOCALE_SLANGUAGE
, lang
, sizeof(lang
)/sizeof(WCHAR
));
220 if (bNoShow
== FALSE
)
222 index
= SendMessageW(hLangList
,
227 SendMessageW(hLangList
,
239 PGLOBALDATA pGlobalData
)
243 hLangList
= GetDlgItem(hwndDlg
, IDC_LANGUAGE_COMBO
);
246 EnumSystemLocalesW(LocalesEnumProc
, LCID_SUPPORTED
);
248 /* Select current locale */
249 GetLocaleInfoW(pGlobalData
->SystemLCID
, LOCALE_SLANGUAGE
, langSel
, sizeof(langSel
)/sizeof(WCHAR
));
251 SendMessageW(hLangList
, CB_SELECTSTRING
, -1, (LPARAM
)langSel
);
255 GetCurrentDPI(LPTSTR szDPI
)
257 DWORD dwType
, dwSize
, dwDPI
, dwDefDPI
= 0x00000060; // Default 96 DPI
260 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI", 0, NULL
,
261 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
263 wcscpy(szDPI
, L
"96");
268 dwSize
= sizeof(DWORD
);
270 if (RegQueryValueExW(hKey
, L
"LogPixels", NULL
, &dwType
, (LPBYTE
)&dwDPI
, &dwSize
) != ERROR_SUCCESS
)
272 if (RegSetValueExW(hKey
, L
"LogPixels", 0, REG_DWORD
, (LPBYTE
)&dwDefDPI
, sizeof(DWORD
)) == ERROR_SUCCESS
)
274 wcscpy(szDPI
, L
"96");
281 wsprintf(szDPI
, L
"%d", dwDPI
);
289 SaveFontSubstitutionSettings(
291 PGLOBALDATA pGlobalData
)
293 WCHAR szDefCP
[5 + 1], szSection
[MAX_PATH
], szDPI
[3 + 1];
297 GetLocaleInfoW(MAKELCID(pGlobalData
->SystemLCID
, SORT_DEFAULT
), LOCALE_IDEFAULTCODEPAGE
, szDefCP
, sizeof(szDefCP
) / sizeof(WCHAR
));
298 GetCurrentDPI(szDPI
);
300 wsprintf(szSection
, L
"Font.CP%s.%s", szDefCP
, szDPI
);
302 hFontInf
= SetupOpenInfFileW(L
"font.inf", NULL
, INF_STYLE_WIN4
, NULL
);
303 if (hFontInf
== INVALID_HANDLE_VALUE
)
306 if (!SetupOpenAppendInfFile(NULL
, hFontInf
, NULL
))
308 SetupCloseInfFile(hFontInf
);
312 Count
= (UINT
)SetupGetLineCount(hFontInf
, szSection
);
316 if (!SetupInstallFromInfSectionW(hwnd
, hFontInf
, szSection
, SPINST_REGISTRY
& ~SPINST_FILES
,
317 NULL
, NULL
, 0, NULL
, NULL
, NULL
, NULL
))
319 MessageBoxW(hwnd
, L
"Unable to install a new language for programs don't support unicode!",
320 NULL
, MB_ICONERROR
| MB_OK
);
323 SetupCloseInfFile(hFontInf
);
329 SaveFontLinkingSettings(
331 PGLOBALDATA pGlobalData
)
340 PGLOBALDATA pGlobalData
)
349 ret
= GetLocaleInfoW(MAKELCID(pGlobalData
->SystemLCID
, SORT_DEFAULT
), LOCALE_IDEFAULTCODEPAGE
, OEMPage
, sizeof(OEMPage
)/sizeof(WCHAR
));
352 PrintErrorMsgBox(IDS_ERROR_OEM_CODE_PAGE
);
356 ret
= GetLocaleInfoW(MAKELCID(pGlobalData
->SystemLCID
, SORT_DEFAULT
), LOCALE_IDEFAULTANSICODEPAGE
, ACPPage
, sizeof(ACPPage
)/sizeof(WCHAR
));
359 PrintErrorMsgBox(IDS_ERROR_ANSI_CODE_PAGE
);
364 ret
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage", &langKey
);
365 if (ret
!= ERROR_SUCCESS
)
367 PrintErrorMsgBox(IDS_ERROR_NLS_CODE_REG
);
371 RegSetValueExW(langKey
, L
"OEMCP", 0, REG_SZ
, (BYTE
*)OEMPage
, (wcslen(OEMPage
) +1 ) * sizeof(WCHAR
));
372 RegSetValueExW(langKey
, L
"ACP", 0, REG_SZ
, (BYTE
*)ACPPage
, (wcslen(ACPPage
) +1 ) * sizeof(WCHAR
));
374 RegCloseKey(langKey
);
377 wsprintf(value
, L
"%04hX", LANGIDFROMLCID(pGlobalData
->SystemLCID
));
378 valuesize
= (wcslen(value
) + 1) * sizeof(WCHAR
);
381 ret
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Control\\NLS\\Language", &langKey
);
382 if (ret
!= ERROR_SUCCESS
)
384 PrintErrorMsgBox(IDS_ERROR_NLS_KEY_REG
);
388 RegSetValueExW(langKey
, L
"Default", 0, REG_SZ
, (BYTE
*)value
, valuesize
);
389 RegCloseKey(langKey
);
397 LPNMLVCUSTOMDRAW lplvcd
= (LPNMLVCUSTOMDRAW
)lParam
;
399 switch (lplvcd
->nmcd
.dwDrawStage
)
402 return CDRF_NOTIFYITEMDRAW
;
404 case CDDS_ITEMPREPAINT
:
405 if (((PCPAGE
)lplvcd
->nmcd
.lItemlParam
)->Flags
& CODEPAGE_NOT_REMOVEABLE
)
407 lplvcd
->clrText
= GetSysColor(COLOR_GRAYTEXT
);
411 lplvcd
->clrText
= GetSysColor(COLOR_WINDOWTEXT
);
413 lplvcd
->clrTextBk
= GetSysColor(COLOR_WINDOW
);
417 return CDRF_DODEFAULT
;
421 /* Property page dialog callback */
423 AdvancedPageProc(HWND hwndDlg
,
428 PGLOBALDATA pGlobalData
;
430 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
435 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
436 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
438 InitLanguagesList(hwndDlg
, pGlobalData
);
439 InitCodePagesList(hwndDlg
);
443 switch (LOWORD(wParam
))
445 case IDC_LANGUAGE_COMBO
:
446 if (HIWORD(wParam
) == CBN_SELCHANGE
)
451 iIndex
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
452 if (iIndex
== CB_ERR
)
455 lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iIndex
, 0);
456 if (lcid
== (LCID
)CB_ERR
)
459 pGlobalData
->SystemLCID
= lcid
;
461 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
465 case IDC_APPLY_CUR_USER_DEF_PROFILE
:
466 if (HIWORD(wParam
) == BN_CLICKED
)
468 if (SendDlgItemMessageW(hwndDlg
, IDC_APPLY_CUR_USER_DEF_PROFILE
, BM_GETCHECK
, 0, 0))
470 ResourceMessageBox(hwndDlg
,
471 MB_OK
| MB_ICONWARNING
,
472 IDS_APPLY_DEFAULT_TITLE
,
473 IDS_APPLY_DEFAULT_TEXT
);
474 pGlobalData
->bApplyToDefaultUser
= TRUE
;
478 pGlobalData
->bApplyToDefaultUser
= FALSE
;
481 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
488 if (((LPNMHDR
)lParam
)->code
== PSN_APPLY
)
490 PropSheet_UnChanged(GetParent(hwndDlg
), hwndDlg
);
492 SaveSystemSettings(pGlobalData
);
493 SaveFontSubstitutionSettings(hwndDlg
, pGlobalData
);
494 SaveFontLinkingSettings(hwndDlg
, pGlobalData
);
496 else if (((LPNMHDR
)lParam
)->idFrom
== IDC_CONV_TABLES
&&
497 ((LPNMHDR
)lParam
)->code
== NM_CUSTOMDRAW
)
499 SetWindowLong(hwndDlg
,
501 (LONG
)ListViewCustomDraw(lParam
));