reactos/base/applications/osk/settings.c

300 lines
9.5 KiB
C
Raw Normal View History

/*
* PROJECT: ReactOS On-Screen Keyboard
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Configuration settings of the application
* COPYRIGHT: Copyright 2018-2019 George Bișoc (george.bisoc@reactos.org)
* Baruch Rutman (peterooch at gmail dot com)
*/
/* INCLUDES *******************************************************************/
#include "precomp.h"
/* FUNCTIONS *******************************************************************/
LONG LoadDWORDFromRegistry(IN LPCWSTR lpValueDataName,
OUT PDWORD pdwValueData)
{
HKEY hKey;
LONG lResult;
DWORD dwValue;
DWORD cbData = sizeof(dwValue);
/* Initialize the pointer parameter to default */
*pdwValueData = 0;
/* Open our application's key in order to load its configuration data */
lResult = RegOpenKeyExW(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Osk",
0,
KEY_READ,
&hKey);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("LoadDWORDFromRegistry(): Failed to open the application's key! (Error - %li)\n", lResult);
return lResult;
}
/* Load the specific value based on the parameter caller, lpValueDataName */
lResult = RegQueryValueExW(hKey,
lpValueDataName,
0,
0,
(BYTE *)&dwValue,
&cbData);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("LoadDWORDFromRegistry(): Failed to load the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
RegCloseKey(hKey);
return lResult;
}
/* Is the buffer's size too small to query the required data? */
if (cbData != sizeof(dwValue))
{
/* It is therefore bail out */
DPRINT("LoadDWORDFromRegistry(): The buffer is too small to hold the data!\n");
RegCloseKey(hKey);
return ERROR_MORE_DATA;
}
*pdwValueData = dwValue;
RegCloseKey(hKey);
return lResult;
}
/* IN: cchCount is how many characters fit in lpValueData,
OUT: cchCount is how many characters were written into lpValueData */
LONG LoadStringFromRegistry(IN LPCWSTR lpValueDataName,
OUT LPWSTR lpValueData,
IN OUT LPUINT cchCount)
{
HKEY hKey;
LONG lResult;
UINT cbCount;
cbCount = (*cchCount) * sizeof(WCHAR);
/* Open our application's key in order to load its configuration data */
lResult = RegOpenKeyExW(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Osk",
0,
KEY_READ,
&hKey);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("LoadStringFromRegistry(): Failed to open the application's key! (Error - %li)\n", lResult);
return lResult;
}
/* Load the specific value based on the parameter caller, lpValueDataName */
lResult = RegQueryValueExW(hKey,
lpValueDataName,
0,
0,
(BYTE *)lpValueData,
(LPDWORD)&cbCount);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("LoadStringFromRegistry(): Failed to load the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
RegCloseKey(hKey);
return lResult;
}
*cchCount = cbCount / sizeof(WCHAR);
RegCloseKey(hKey);
return lResult;
}
LONG SaveDWORDToRegistry(IN LPCWSTR lpValueDataName,
IN DWORD dwValueData)
{
HKEY hKey;
LONG lResult;
/* Set up the application's key in case it has not been made yet */
lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Osk",
0,
NULL,
0,
KEY_WRITE,
NULL,
&hKey,
NULL);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("SaveDWORDToRegistry(): Failed to create the application's key! (Error - %li)\n", lResult);
return lResult;
}
/* Save the data into the registry value */
lResult = RegSetValueExW(hKey,
lpValueDataName,
0,
REG_DWORD,
(BYTE *)&dwValueData,
sizeof(dwValueData));
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("SaveDWORDToRegistry(): Failed to save the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
RegCloseKey(hKey);
return lResult;
}
RegCloseKey(hKey);
return lResult;
}
LONG SaveStringToRegistry(IN LPCWSTR lpValueDataName,
IN LPCWSTR lpValueData,
IN UINT cchCount)
{
HKEY hKey;
LONG lResult;
/* Set up the application's key in case it has not been made yet */
lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Osk",
0,
NULL,
0,
KEY_WRITE,
NULL,
&hKey,
NULL);
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("SaveStringToRegistry(): Failed to create the application's key! (Error - %li)\n", lResult);
return lResult;
}
/* Save the data into the registry value */
lResult = RegSetValueExW(hKey,
lpValueDataName,
0,
REG_SZ,
(BYTE *)lpValueData,
cchCount * sizeof(WCHAR));
if (lResult != ERROR_SUCCESS)
{
/* Bail out */
DPRINT("SaveStringToRegistry(): Failed to save the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
RegCloseKey(hKey);
return lResult;
}
RegCloseKey(hKey);
return lResult;
}
VOID LoadSettings(VOID)
{
DWORD dwValue;
LONG lResult;
/* Initialize the registry application settings */
Globals.bShowWarning = TRUE;
Globals.bIsEnhancedKeyboard = TRUE;
Globals.bAlwaysOnTop = TRUE;
Globals.bSoundClick = FALSE;
/* Set the coordinate values to default */
Globals.PosX = CW_USEDEFAULT;
Globals.PosY = CW_USEDEFAULT;
/* Set font value defaults */
Globals.FontHeight = DEFAULT_FONTSIZE;
/* Warning dialog registry setting */
lResult = LoadDWORDFromRegistry(L"ShowWarning", &dwValue);
if (lResult == NO_ERROR)
Globals.bShowWarning = (dwValue != 0);
/* Enhanced keyboard switch dialog registry setting */
lResult = LoadDWORDFromRegistry(L"IsEnhancedKeyboard", &dwValue);
if (lResult == NO_ERROR)
Globals.bIsEnhancedKeyboard = (dwValue != 0);
/* Sound on click event registry setting */
lResult = LoadDWORDFromRegistry(L"ClickSound", &dwValue);
if (lResult == NO_ERROR)
Globals.bSoundClick = (dwValue != 0);
/* X coordinate dialog placement registry setting */
lResult = LoadDWORDFromRegistry(L"WindowLeft", &dwValue);
if (lResult == NO_ERROR)
Globals.PosX = dwValue;
/* Y coordinate dialog placement registry setting */
lResult = LoadDWORDFromRegistry(L"WindowTop", &dwValue);
if (lResult == NO_ERROR)
Globals.PosY = dwValue;
/* Top window state registry setting */
lResult = LoadDWORDFromRegistry(L"AlwaysOnTop", &dwValue);
if (lResult == NO_ERROR)
Globals.bAlwaysOnTop = (dwValue != 0);
/* Font information */
UINT cchCount = _countof(Globals.FontFaceName);
lResult = LoadStringFromRegistry(L"FontFaceName", Globals.FontFaceName, &cchCount);
if (lResult != NO_ERROR) /* Copy default on failure */
StringCchCopyW(Globals.FontFaceName, _countof(Globals.FontFaceName), L"MS Shell Dlg");
lResult = LoadDWORDFromRegistry(L"FontHeight", &dwValue);
if (lResult == NO_ERROR)
Globals.FontHeight = dwValue;
}
VOID SaveSettings(VOID)
{
WINDOWPLACEMENT wp;
/* Initialize the window placement structure */
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(Globals.hMainWnd, &wp);
/* Warning dialog registry setting */
SaveDWORDToRegistry(L"ShowWarning", Globals.bShowWarning);
/* Enhanced keyboard switch dialog registry setting */
SaveDWORDToRegistry(L"IsEnhancedKeyboard", Globals.bIsEnhancedKeyboard);
/* Sound on click event registry setting */
SaveDWORDToRegistry(L"ClickSound", Globals.bSoundClick);
/* X coordinate dialog placement registry setting */
SaveDWORDToRegistry(L"WindowLeft", wp.rcNormalPosition.left);
/* Y coordinate dialog placement registry setting */
SaveDWORDToRegistry(L"WindowTop", wp.rcNormalPosition.top);
/* Top window state registry setting */
SaveDWORDToRegistry(L"AlwaysOnTop", Globals.bAlwaysOnTop);
/* Font information */
SaveStringToRegistry(L"FontFaceName", Globals.FontFaceName, _countof(Globals.FontFaceName));
SaveDWORDToRegistry(L"FontHeight", Globals.FontHeight);
}