Index: base/applications/charmap/charmap.c =================================================================== --- base/applications/charmap/charmap.c (revision 55832) +++ base/applications/charmap/charmap.c (working copy) @@ -11,17 +11,11 @@ #define ID_ABOUT 0x1 -typedef struct { - BOOL IsAdvancedView; -} SETTINGS; - HINSTANCE hInstance; -HWND hCharmapDlg; HWND hAdvancedDlg; HWND hStatusWnd; HICON hSmIcon; HICON hBgIcon; -SETTINGS Settings; /* Font-enumeration callback */ static @@ -103,7 +97,7 @@ } -static +extern VOID ChangeMapFont(HWND hDlg) { @@ -464,6 +458,7 @@ break; case WM_DESTROY: + SaveSettings(); PostQuitMessage(0); return 0; @@ -534,6 +529,7 @@ if (hWnd != NULL) { + LoadSettings(); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); } Index: base/applications/charmap/charmap.rbuild =================================================================== --- base/applications/charmap/charmap.rbuild (revision 55832) +++ base/applications/charmap/charmap.rbuild (working copy) @@ -2,6 +2,7 @@ . + advapi32 gdi32 user32 comctl32 Index: base/applications/charmap/CMakeLists.txt =================================================================== --- base/applications/charmap/CMakeLists.txt (revision 55832) +++ base/applications/charmap/CMakeLists.txt (working copy) @@ -6,13 +6,14 @@ charmap.c lrgcell.c map.c + settings.c charmap.rc) add_executable(charmap ${SOURCE}) set_module_type(charmap win32gui UNICODE) -add_importlibs(charmap msvcrt user32 gdi32 comctl32 kernel32) +add_importlibs(charmap msvcrt user32 gdi32 comctl32 kernel32 advapi32) add_pch(charmap precomp.h) Index: base/applications/charmap/precomp.h =================================================================== --- base/applications/charmap/precomp.h (revision 55832) +++ base/applications/charmap/precomp.h (working copy) @@ -3,6 +3,8 @@ #define WIN32_LEAN_AND_MEAN #include +#include +#include #include #include #include @@ -51,7 +53,13 @@ WCHAR ch; } MAPNOTIFY, *LPMAPNOTIFY; +typedef struct { + BOOL IsAdvancedView; +} SETTINGS; +SETTINGS Settings; +HWND hCharmapDlg; + LRESULT CALLBACK LrgCellWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID ShowAboutDlg(HWND hWndParent); @@ -59,4 +67,11 @@ BOOL RegisterMapClasses(HINSTANCE hInstance); VOID UnregisterMapClasses(HINSTANCE hInstance); +/* charmap.c */ +extern VOID ChangeMapFont(HWND hDlg); + +/* settings.c */ +extern void LoadSettings(void); +extern void SaveSettings(void); + #endif /* __CHARMAP_PRECOMP_H */ Index: base/applications/charmap/settings.c =================================================================== --- base/applications/charmap/settings.c (revision 0) +++ base/applications/charmap/settings.c (working copy) @@ -0,0 +1,136 @@ +/* + * PROJECT: ReactOS Character Map + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/applications/charmap/settings.c + * PURPOSE: save/load settings + * COPYRIGHT: Copyright 2012 Edijs Kolesnikovics + * + */ + +#include + + +const TCHAR g_szGeneralRegKey[] = _T("Software\\Microsoft\\CharMap"); +HWND hWnd; + +LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen) +{ + LONG lResult; + HKEY hSubKey = NULL; + DWORD cbData, dwType; + + if (lpSubKey) + { + lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); + if (lResult != ERROR_SUCCESS) + goto done; + hKey = hSubKey; + } + + cbData = (dwBufferLen - 1) * sizeof(*pszBuffer); + lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData); + if (lResult != ERROR_SUCCESS) + goto done; + if (dwType != REG_SZ) + { + lResult = -1; + goto done; + } + + pszBuffer[cbData / sizeof(*pszBuffer)] = _T('\0'); + +done: + if (lResult != ERROR_SUCCESS) + pszBuffer[0] = _T('\0'); + if (hSubKey) + RegCloseKey(hSubKey); + return lResult; +} + +extern void LoadSettings(void) +{ + HKEY hKey = NULL; + int iItemIndex = -1; + + if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + TCHAR szBuffer[MAX_PATH]; + + /* Restore last selected font */ + if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("Font"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS) + { + //Get combobox handle + hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO); + + //Search for match and return index if match found + iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer); + if(iItemIndex != CB_ERR) + { + ComboBox_SetCurSel(hWnd, iItemIndex); + ChangeMapFont(hCharmapDlg); + } + } + + /* Restore last selected character set */ + if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("CodePage"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS) + { + //Get combobox handle + hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET); + + iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer); + if(iItemIndex != CB_ERR) + { + ComboBox_SetCurSel(hWnd, iItemIndex); + } + } + + DWORD dwAdvanChecked; + unsigned long type=REG_DWORD, size=1024; + RegQueryValueEx(hKey, _T("Advanced"), NULL, &type, (LPBYTE)&dwAdvanChecked, &size); + if(dwAdvanChecked == TRUE) + SendDlgItemMessage(hCharmapDlg, IDC_CHECK_ADVANCED, BM_CLICK, (dwAdvanChecked ? MF_CHECKED : MF_UNCHECKED), 0); + + RegCloseKey(hKey); + } + else + { + /* Default font seems to be Arial */ + hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO); + + iItemIndex = ComboBox_FindStringExact(hWnd, -1, _T("Arial")); + if(iItemIndex != CB_ERR) + { + ComboBox_SetCurSel(hWnd, iItemIndex); + ChangeMapFont(hCharmapDlg); + } + } +} + +extern void SaveSettings(void) +{ + HKEY hKey = NULL; + + if (RegCreateKey(HKEY_CURRENT_USER, g_szGeneralRegKey, &hKey) == ERROR_SUCCESS) + { + if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) + { + TCHAR szBuffer[MAX_PATH]; + + hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO); + ComboBox_GetText(hWnd, szBuffer, MAX_PATH); + + if(szBuffer != NULL && *szBuffer != '\0') + RegSetValueEx(hKey, _T("Font"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH); + + hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET); + ComboBox_GetText(hWnd, szBuffer, MAX_PATH); + + if(szBuffer != NULL && *szBuffer != '\0') + RegSetValueEx(hKey, _T("CodePage"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH); + + RegSetValueEx(hKey, _T("Advanced"), 0, REG_DWORD, (LPBYTE)&Settings.IsAdvancedView, (DWORD) sizeof(DWORD)); + + RegCloseKey(hKey); + } + } +}