[OSK] Restore the previous window coordination
[reactos.git] / base / applications / osk / settings.c
1 /*
2 * PROJECT: ReactOS On-Screen Keyboard
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Configuration settings of the application
5 * COPYRIGHT: Copyright 2018-2019 Bișoc George (fraizeraust99 at gmail dot com)
6 */
7
8 /* INCLUDES *******************************************************************/
9
10 #include "osk.h"
11 #include "settings.h"
12
13 /* FUNCTIONS *******************************************************************/
14
15 BOOL LoadDataFromRegistry()
16 {
17 HKEY hKey;
18 LONG lResult;
19 DWORD dwShowWarningData, dwLayout, dwSoundOnClick, dwPositionLeft, dwPositionTop;
20 DWORD cbData = sizeof(DWORD);
21
22 /* Set the structure members to TRUE (and the bSoundClick member to FALSE) */
23 Globals.bShowWarning = TRUE;
24 Globals.bIsEnhancedKeyboard = TRUE;
25 Globals.bSoundClick = FALSE;
26
27 /* Set the coordinate values to default */
28 Globals.PosX = CW_USEDEFAULT;
29 Globals.PosY = CW_USEDEFAULT;
30
31 /* Open the key, so that we can query it */
32 lResult = RegOpenKeyExW(HKEY_CURRENT_USER,
33 L"Software\\Microsoft\\Osk",
34 0,
35 KEY_READ,
36 &hKey);
37
38 if (lResult != ERROR_SUCCESS)
39 {
40 /* Bail out and return FALSE if we fail */
41 return FALSE;
42 }
43
44 /* Query the key */
45 lResult = RegQueryValueExW(hKey,
46 L"ShowWarning",
47 0,
48 0,
49 (BYTE *)&dwShowWarningData,
50 &cbData);
51
52 if (lResult != ERROR_SUCCESS)
53 {
54 /* Bail out and return FALSE if we fail */
55 RegCloseKey(hKey);
56 return FALSE;
57 }
58
59 /* Load the data value (it can be either FALSE or TRUE depending on the data itself) */
60 Globals.bShowWarning = (dwShowWarningData != 0);
61
62 /* Query the key */
63 lResult = RegQueryValueExW(hKey,
64 L"IsEnhancedKeyboard",
65 0,
66 0,
67 (BYTE *)&dwLayout,
68 &cbData);
69
70 if (lResult != ERROR_SUCCESS)
71 {
72 /* Bail out and return FALSE if we fail */
73 RegCloseKey(hKey);
74 return FALSE;
75 }
76
77 /* Load the dialog layout value */
78 Globals.bIsEnhancedKeyboard = (dwLayout != 0);
79
80 /* Query the key */
81 lResult = RegQueryValueExW(hKey,
82 L"ClickSound",
83 0,
84 0,
85 (BYTE *)&dwSoundOnClick,
86 &cbData);
87
88 if (lResult != ERROR_SUCCESS)
89 {
90 /* Bail out and return FALSE if we fail */
91 RegCloseKey(hKey);
92 return FALSE;
93 }
94
95 /* Load the sound on click value event */
96 Globals.bSoundClick = (dwSoundOnClick != 0);
97
98 /* Query the key */
99 lResult = RegQueryValueExW(hKey,
100 L"WindowLeft",
101 0,
102 0,
103 (BYTE *)&dwPositionLeft,
104 &cbData);
105
106 if (lResult != ERROR_SUCCESS)
107 {
108 /* Bail out and return FALSE if we fail */
109 RegCloseKey(hKey);
110 return FALSE;
111 }
112
113 /* Load the X value data of the dialog's coordinate */
114 Globals.PosX = dwPositionLeft;
115
116 lResult = RegQueryValueExW(hKey,
117 L"WindowTop",
118 0,
119 0,
120 (BYTE *)&dwPositionTop,
121 &cbData);
122
123 if (lResult != ERROR_SUCCESS)
124 {
125 /* Bail out and return FALSE if we fail */
126 RegCloseKey(hKey);
127 return FALSE;
128 }
129
130 /* Load the Y value data of the dialog's coordinate */
131 Globals.PosY = dwPositionTop;
132
133 /* If we're here then we succeed, close the key and return TRUE */
134 RegCloseKey(hKey);
135 return TRUE;
136 }
137
138 BOOL SaveDataToRegistry()
139 {
140 HKEY hKey;
141 LONG lResult;
142 DWORD dwShowWarningData, dwLayout, dwSoundOnClick, dwPositionLeft, dwPositionTop;
143 WINDOWPLACEMENT wp;
144
145 /* Set the structure length and retrieve the dialog's placement */
146 wp.length = sizeof(WINDOWPLACEMENT);
147 GetWindowPlacement(Globals.hMainWnd, &wp);
148
149 /* If no key has been made, create one */
150 lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
151 L"Software\\Microsoft\\Osk",
152 0,
153 NULL,
154 0,
155 KEY_WRITE,
156 NULL,
157 &hKey,
158 NULL);
159
160 if (lResult != ERROR_SUCCESS)
161 {
162 /* Bail out and return FALSE if we fail */
163 return FALSE;
164 }
165
166 /* The data value of the subkey will be appended to the warning dialog switch */
167 dwShowWarningData = Globals.bShowWarning;
168
169 /* Welcome warning box value key */
170 lResult = RegSetValueExW(hKey,
171 L"ShowWarning",
172 0,
173 REG_DWORD,
174 (BYTE *)&dwShowWarningData,
175 sizeof(dwShowWarningData));
176
177 if (lResult != ERROR_SUCCESS)
178 {
179 /* Bail out and return FALSE if we fail */
180 RegCloseKey(hKey);
181 return FALSE;
182 }
183
184 /* The value will be appended to the layout dialog */
185 dwLayout = Globals.bIsEnhancedKeyboard;
186
187 /* Keyboard dialog switcher */
188 lResult = RegSetValueExW(hKey,
189 L"IsEnhancedKeyboard",
190 0,
191 REG_DWORD,
192 (BYTE *)&dwLayout,
193 sizeof(dwLayout));
194
195 if (lResult != ERROR_SUCCESS)
196 {
197 /* Bail out and return FALSE if we fail */
198 RegCloseKey(hKey);
199 return FALSE;
200 }
201
202 /* The value will be appended to the sound on click event */
203 dwSoundOnClick = Globals.bSoundClick;
204
205 /* "Sound on Click" switcher value key */
206 lResult = RegSetValueExW(hKey,
207 L"ClickSound",
208 0,
209 REG_DWORD,
210 (BYTE *)&dwSoundOnClick,
211 sizeof(dwSoundOnClick));
212
213 if (lResult != ERROR_SUCCESS)
214 {
215 /* Bail out and return FALSE if we fail */
216 RegCloseKey(hKey);
217 return FALSE;
218 }
219
220 /* The value will be appended to the X coordination dialog's placement */
221 dwPositionLeft = wp.rcNormalPosition.left;
222
223 /* Position X coordination of dialog's placement value key */
224 lResult = RegSetValueExW(hKey,
225 L"WindowLeft",
226 0,
227 REG_DWORD,
228 (BYTE *)&dwPositionLeft,
229 sizeof(dwPositionLeft));
230
231 if (lResult != ERROR_SUCCESS)
232 {
233 /* Bail out and return FALSE if we fail */
234 RegCloseKey(hKey);
235 return FALSE;
236 }
237
238 /* The value will be appended to the Y coordination dialog's placement */
239 dwPositionTop = wp.rcNormalPosition.top;
240
241 /* Position Y coordination of dialog's placement value key */
242 lResult = RegSetValueExW(hKey,
243 L"WindowTop",
244 0,
245 REG_DWORD,
246 (BYTE *)&dwPositionTop,
247 sizeof(dwPositionTop));
248
249 if (lResult != ERROR_SUCCESS)
250 {
251 /* Bail out and return FALSE if we fail */
252 RegCloseKey(hKey);
253 return FALSE;
254 }
255
256 /* If we're here then we succeed, close the key and return TRUE */
257 RegCloseKey(hKey);
258 return TRUE;
259 }