diff --git a/reactos/base/applications/charmap/CMakeLists.txt b/reactos/base/applications/charmap/CMakeLists.txt index 7017fec68fe..cb3878b6c18 100644 --- a/reactos/base/applications/charmap/CMakeLists.txt +++ b/reactos/base/applications/charmap/CMakeLists.txt @@ -6,13 +6,14 @@ list(APPEND SOURCE 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 advapi32 user32 gdi32 comctl32 msvcrt kernel32) add_pch(charmap precomp.h) diff --git a/reactos/base/applications/charmap/charmap.c b/reactos/base/applications/charmap/charmap.c index 5b4b4026dc5..33d73517124 100644 --- a/reactos/base/applications/charmap/charmap.c +++ b/reactos/base/applications/charmap/charmap.c @@ -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 @@ FillFontStyleComboList(HWND hwndCombo) } -static +extern VOID ChangeMapFont(HWND hDlg) { @@ -464,6 +458,7 @@ PanelWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_DESTROY: + SaveSettings(); PostQuitMessage(0); return 0; @@ -534,6 +529,7 @@ InitInstance(HINSTANCE hInst) if (hWnd != NULL) { + LoadSettings(); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); } diff --git a/reactos/base/applications/charmap/precomp.h b/reactos/base/applications/charmap/precomp.h index 9825aa47560..e59ad0dac30 100644 --- a/reactos/base/applications/charmap/precomp.h +++ b/reactos/base/applications/charmap/precomp.h @@ -3,6 +3,8 @@ #define WIN32_LEAN_AND_MEAN #include +#include +#include #include #include #include @@ -51,6 +53,12 @@ typedef struct { WCHAR ch; } MAPNOTIFY, *LPMAPNOTIFY; +typedef struct { + BOOL IsAdvancedView; +} SETTINGS; + +SETTINGS Settings; +HWND hCharmapDlg; LRESULT CALLBACK LrgCellWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -59,4 +67,11 @@ VOID ShowAboutDlg(HWND hWndParent); 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 */ diff --git a/reactos/base/applications/charmap/settings.c b/reactos/base/applications/charmap/settings.c new file mode 100644 index 00000000000..4eae8d916e5 --- /dev/null +++ b/reactos/base/applications/charmap/settings.c @@ -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]; + DWORD dwAdvanChecked; + unsigned long type = REG_DWORD, size = 1024; + + /* 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); + } + } + + 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); + } + } +}