xref: /reactos/base/applications/osk/settings.c (revision ebaf247c)
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 "precomp.h"
11 
12 /* FUNCTIONS *******************************************************************/
13 
14 BOOL LoadDataFromRegistry(VOID)
15 {
16     HKEY hKey;
17     LONG lResult;
18     DWORD dwValue;
19     DWORD cbData = sizeof(dwValue);
20 
21     /* Initialize the registry application settings */
22     Globals.bShowWarning = TRUE;
23     Globals.bIsEnhancedKeyboard = TRUE;
24     Globals.bSoundClick = FALSE;
25     Globals.bAlwaysOnTop = TRUE;
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 *)&dwValue,
50                                &cbData);
51 
52     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
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 = (dwValue != 0);
61 
62     /* Query the key */
63     lResult = RegQueryValueExW(hKey,
64                                L"IsEnhancedKeyboard",
65                                0,
66                                0,
67                                (BYTE *)&dwValue,
68                                &cbData);
69 
70     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
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 = (dwValue != 0);
79 
80     /* Query the key */
81     lResult = RegQueryValueExW(hKey,
82                                L"ClickSound",
83                                0,
84                                0,
85                                (BYTE *)&dwValue,
86                                &cbData);
87 
88     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
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 = (dwValue != 0);
97 
98     /* Query the key */
99     lResult = RegQueryValueExW(hKey,
100                                L"WindowLeft",
101                                0,
102                                0,
103                                (BYTE *)&dwValue,
104                                &cbData);
105 
106     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
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 = dwValue;
115 
116     lResult = RegQueryValueExW(hKey,
117                                L"WindowTop",
118                                0,
119                                0,
120                                (BYTE *)&dwValue,
121                                &cbData);
122 
123     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
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 = dwValue;
132 
133     lResult = RegQueryValueExW(hKey,
134                                L"AlwaysOnTop",
135                                0,
136                                0,
137                                (BYTE *)&dwValue,
138                                &cbData);
139 
140     if (lResult != ERROR_SUCCESS || cbData != sizeof(dwValue))
141     {
142         /* Bail out and return FALSE if we fail */
143         RegCloseKey(hKey);
144         return FALSE;
145     }
146 
147     /* Load the window state value data */
148     Globals.bAlwaysOnTop = (dwValue != 0);
149 
150     /* If we're here then we succeed, close the key and return TRUE */
151     RegCloseKey(hKey);
152     return TRUE;
153 }
154 
155 BOOL SaveDataToRegistry(VOID)
156 {
157     HKEY hKey;
158     LONG lResult;
159     DWORD dwValue;
160     WINDOWPLACEMENT wp;
161 
162     /* Set the structure length and retrieve the dialog's placement */
163     wp.length = sizeof(WINDOWPLACEMENT);
164     GetWindowPlacement(Globals.hMainWnd, &wp);
165 
166     /* If no key has been made, create one */
167     lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
168                               L"Software\\Microsoft\\Osk",
169                               0,
170                               NULL,
171                               0,
172                               KEY_WRITE,
173                               NULL,
174                               &hKey,
175                               NULL);
176 
177     if (lResult != ERROR_SUCCESS)
178     {
179         /* Bail out and return FALSE if we fail */
180         return FALSE;
181     }
182 
183     /* The data value of the subkey will be appended to the warning dialog switch */
184     dwValue = Globals.bShowWarning;
185 
186     /* Welcome warning box value key */
187     lResult = RegSetValueExW(hKey,
188                              L"ShowWarning",
189                              0,
190                              REG_DWORD,
191                              (BYTE *)&dwValue,
192                              sizeof(dwValue));
193 
194     if (lResult != ERROR_SUCCESS)
195     {
196         /* Bail out and return FALSE if we fail */
197         RegCloseKey(hKey);
198         return FALSE;
199     }
200 
201     /* The value will be appended to the layout dialog */
202     dwValue = Globals.bIsEnhancedKeyboard;
203 
204     /* Keyboard dialog switcher */
205     lResult = RegSetValueExW(hKey,
206                              L"IsEnhancedKeyboard",
207                              0,
208                              REG_DWORD,
209                              (BYTE *)&dwValue,
210                              sizeof(dwValue));
211 
212     if (lResult != ERROR_SUCCESS)
213     {
214         /* Bail out and return FALSE if we fail */
215         RegCloseKey(hKey);
216         return FALSE;
217     }
218 
219     /* The value will be appended to the sound on click event */
220     dwValue = Globals.bSoundClick;
221 
222     /* "Sound on Click" switcher value key */
223     lResult = RegSetValueExW(hKey,
224                              L"ClickSound",
225                              0,
226                              REG_DWORD,
227                              (BYTE *)&dwValue,
228                              sizeof(dwValue));
229 
230     if (lResult != ERROR_SUCCESS)
231     {
232         /* Bail out and return FALSE if we fail */
233         RegCloseKey(hKey);
234         return FALSE;
235     }
236 
237     /* The value will be appended to the X coordination dialog's placement */
238     dwValue = wp.rcNormalPosition.left;
239 
240     /* Position X coordination of dialog's placement value key */
241     lResult = RegSetValueExW(hKey,
242                              L"WindowLeft",
243                              0,
244                              REG_DWORD,
245                              (BYTE *)&dwValue,
246                              sizeof(dwValue));
247 
248     if (lResult != ERROR_SUCCESS)
249     {
250         /* Bail out and return FALSE if we fail */
251         RegCloseKey(hKey);
252         return FALSE;
253     }
254 
255     /* The value will be appended to the Y coordination dialog's placement */
256     dwValue = wp.rcNormalPosition.top;
257 
258     /* Position Y coordination of dialog's placement value key */
259     lResult = RegSetValueExW(hKey,
260                              L"WindowTop",
261                              0,
262                              REG_DWORD,
263                              (BYTE *)&dwValue,
264                              sizeof(dwValue));
265 
266     if (lResult != ERROR_SUCCESS)
267     {
268         /* Bail out and return FALSE if we fail */
269         RegCloseKey(hKey);
270         return FALSE;
271     }
272 
273     /* Window top state value */
274     dwValue = Globals.bAlwaysOnTop;
275 
276     /* "Always on Top" state value key */
277     lResult = RegSetValueExW(hKey,
278                              L"AlwaysOnTop",
279                              0,
280                              REG_DWORD,
281                              (BYTE *)&dwValue,
282                              sizeof(dwValue));
283 
284     if (lResult != ERROR_SUCCESS)
285     {
286         /* Bail out and return FALSE if we fail */
287         RegCloseKey(hKey);
288         return FALSE;
289     }
290 
291     /* If we're here then we succeed, close the key and return TRUE */
292     RegCloseKey(hKey);
293     return TRUE;
294 }
295