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 } 260