ReactOS 0.4.15-dev-8413-gc1c91f2
settings.c
Go to the documentation of this file.
1/*
2 * Regedit settings
3 *
4 * Copyright (C) 2012 Edijs Kolesnikovics <terminedijs@yahoo.com>
5 * Copyright (C) 2012 Grégori Macário Harbs <mysoft64bits at gmail dot com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "regedit.h"
23
24const WCHAR g_szGeneralRegKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit";
26
27/*
28VV,VV,VV,VV,WA,WA,WA,WA,WB,WB,WB,WB,R1,R1,R1,R1
29R2,R2,R2,R2,R3,R3,R3,R3,R4,R4,R4,r4,LL,LL,LL,LL
30TT,TT,TT,TT,RR,RR,RR,RR,BB,BB,BB,BB,SS,SS,SS,SS
31NN,NN,NN,NN,KK,KK,KK,KK,DD,DD,DD,DD,SB,SB,SB,SB
32
33VV = Version or Sanity? WINDOWPLACEMENT? (2C?)
34WA = (0=restored / 1=maximized)
35WB = (1=restored / 3=maximized)
36R1 = ???? \
37R2 = ???? | either those are reserved unused or they will
38R3 = ???? | have IP/INFO if connected to remote registry
39R4 = ???? /
40LL = Left position of window
41TT = top position of window
42RR = right position of window
43BB = bottom position of window
44SS = size of key tree view (splitter)
45NN = size of 'name' column
46KK = size of 'type' column (kind)
47DD = size of 'data' coumn
48SB = status bar (1=visible / 0=hidden)
49*/
50
51typedef struct
52{
60
61extern void LoadSettings(void)
62{
63 HKEY hKey = NULL;
64 WCHAR szBuffer[MAX_PATH];
65
67 {
69 DWORD iBufferSize = sizeof(tConfig);
70 BOOL bVisible = FALSE;
71
72 if (RegQueryValueExW(hKey, L"View", NULL, NULL, (LPBYTE)&tConfig, &iBufferSize) == ERROR_SUCCESS)
73 {
74 if (iBufferSize == sizeof(tConfig))
75 {
76 RECT rcTemp;
77
78 /* Update status bar settings */
81
82 /* Update listview column width */
86
87 /* Update treeview (splitter) */
88 GetClientRect(hFrameWnd, &rcTemp);
90 ResizeWnd(rcTemp.right, rcTemp.bottom);
91
92 /* Apply program window settings */
93 tConfig.tPlacement.length = sizeof(WINDOWPLACEMENT);
94 bVisible = SetWindowPlacement(hFrameWnd, &tConfig.tPlacement);
95 }
96 }
97
98 /* In case we fail to restore the window, or open the key, show normal */
99 if (!bVisible)
101
102 /* Restore key position */
103 if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, L"LastKey", szBuffer, ARRAY_SIZE(szBuffer)) == ERROR_SUCCESS)
104 {
105 SelectNode(g_pChildWnd->hTreeWnd, szBuffer);
106 }
107
109 }
110 else
111 {
112 /* Failed to open key, show normal */
114 }
115}
116
117extern void SaveSettings(void)
118{
119 HKEY hKey = NULL;
120
122 {
123 RegistryBinaryConfig tConfig;
124 DWORD iBufferSize = sizeof(tConfig);
125 WCHAR szBuffer[MAX_PATH]; /* FIXME: a complete registry path can be longer than that */
126 LPCWSTR keyPath, rootName;
127 HKEY hRootKey;
128
129 /* Save key position */
130 keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey);
131 rootName = get_root_key_name(hRootKey);
132
133 /* Load "My Computer" string and complete it */
134 if (LoadStringW(hInst, IDS_MY_COMPUTER, szBuffer, ARRAY_SIZE(szBuffer)) &&
135 SUCCEEDED(StringCbCatW(szBuffer, sizeof(szBuffer), L"\\")) &&
136 SUCCEEDED(StringCbCatW(szBuffer, sizeof(szBuffer), rootName)) &&
137 SUCCEEDED(StringCbCatW(szBuffer, sizeof(szBuffer), L"\\")))
138 {
139 HRESULT hr = S_OK;
140 if (keyPath)
141 hr = StringCbCatW(szBuffer, sizeof(szBuffer), keyPath);
142 if (SUCCEEDED(hr))
143 RegSetValueExW(hKey, L"LastKey", 0, REG_SZ, (LPBYTE)szBuffer, (DWORD)wcslen(szBuffer) * sizeof(WCHAR));
144 else
145 DbgPrint("err: (%s:%d): Buffer not big enough for '%S + %S'\n", __FILE__, __LINE__, rootName, keyPath);
146 }
147 else
148 {
149 DbgPrint("err: (%s:%d): Buffer not big enough for '%S'\n", __FILE__, __LINE__, rootName);
150 }
151
152 /* Get statusbar settings */
154
155 /* Get splitter position */
157
158 /* Get list view column width*/
162
163 /* Get program window settings */
164 tConfig.tPlacement.length = sizeof(WINDOWPLACEMENT);
166
167 /* Save all the data */
168 RegSetValueExW(hKey, L"View", 0, REG_BINARY, (LPBYTE)&tConfig, iBufferSize);
169
171 }
172}
173/* EOF */
LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen)
Definition: settings.c:19
void SaveSettings(void)
Definition: settings.c:115
const TCHAR g_szGeneralRegKey[]
Definition: settings.c:16
void LoadSettings(void)
Definition: settings.c:53
ChildWnd * g_pChildWnd
Definition: childwnd.c:26
LPCWSTR get_root_key_name(HKEY hRootKey)
Definition: childwnd.c:89
HWND hFrameWnd
Definition: main.c:35
HMENU hMenuFrame
Definition: main.c:37
HWND hStatusBar
Definition: main.c:36
BOOL SelectNode(HWND hwndTV, LPCWSTR keyPath)
Definition: treeview.c:787
#define ARRAY_SIZE(A)
Definition: main.h:33
LPCWSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY *phRootKey)
Definition: treeview.c:88
#define IDS_MY_COMPUTER
Definition: resource.h:129
#define ID_VIEW_STATUSBAR
Definition: resource.h:54
#define ID_VIEW_MENU
Definition: resource.h:25
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1201
#define MAX_PATH
Definition: compat.h:34
HINSTANCE hInst
Definition: dxdiag.c:13
VOID ResizeWnd(INT cx, INT cy)
Definition: eventvwr.c:3267
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
#define DbgPrint
Definition: hal.h:12
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define REG_SZ
Definition: layer.c:22
#define REG_BINARY
Definition: nt_native.h:1496
CONST CHAR * PCCH
Definition: ntbasedef.h:392
#define L(x)
Definition: ntvdm.h:50
#define ListView_GetColumnWidth(hwnd, iCol)
Definition: commctrl.h:2642
#define ListView_SetColumnWidth(hwnd, iCol, cx)
Definition: commctrl.h:2648
#define WINAPIV
Definition: sdbpapi.h:64
#define DECLSPEC_IMPORT
Definition: rpc.h:78
HRESULT hr
Definition: shlfolder.c:183
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
int nSplitPos
Definition: main.h:69
HWND hTreeWnd
Definition: main.h:63
HWND hListWnd
Definition: main.h:64
WINDOWPLACEMENT tPlacement
Definition: settings.c:53
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define SW_HIDE
Definition: winuser.h:768
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
UINT WINAPI GetMenuState(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT *)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define MF_CHECKED
Definition: winuser.h:132
#define MF_UNCHECKED
Definition: winuser.h:204
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define SW_SHOW
Definition: winuser.h:775
struct _WINDOWPLACEMENT WINDOWPLACEMENT
BOOL WINAPI SetWindowPlacement(_In_ HWND hWnd, _In_ const WINDOWPLACEMENT *)
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185