reactos/base/applications/osk/settings.c
Baruch Rutman a1faa1cc6d [OSK] On Screen Keyboard overhaul
Primary changes:
Convert from dialog to an ordinary window, placing buttons according to data in keyboard.c
Character button text is now according to selected keyboard layout instead of system language.
Buttons will update* automatically when there is a layout switch (and when shift/capslock are pressed).
(Updating is most reliable when the keyboard is focused)
Removed keyboard dialog templates from resource files, they live on in keyboard.c

Secondary changes:
Support for font change, currently saved in registry is facename and height.
Additional registry load/save functions for strings to facilitate above change.
2021-10-23 09:45:46 +02:00

300 lines
9.5 KiB
C

/*
* 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);
}