reactos/dll/cpl/input/key_settings_dialog.c

281 lines
7.2 KiB
C

/*
* PROJECT: input.dll
* FILE: dll/cpl/input/key_settings_dialog.c
* PURPOSE: input.dll
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
*/
#include "input.h"
static KEY_SETTINGS _KeySettings = { 0 };
DWORD
ReadAttributes(VOID)
{
DWORD dwAttributes = 0;
HKEY hKey;
if (RegOpenKeyExW(HKEY_CURRENT_USER,
L"Keyboard Layout",
0,
KEY_QUERY_VALUE,
&hKey) == ERROR_SUCCESS)
{
DWORD dwSize = sizeof(dwAttributes);
RegQueryValueExW(hKey,
L"Attributes",
NULL, NULL,
(LPBYTE)&dwAttributes,
&dwSize);
RegCloseKey(hKey);
}
return dwAttributes;
}
static VOID
ReadKeysSettings(VOID)
{
HKEY hKey;
_KeySettings.dwAttributes = ReadAttributes();
if (RegOpenKeyExW(HKEY_CURRENT_USER,
L"Keyboard Layout\\Toggle",
0,
KEY_QUERY_VALUE,
&hKey) == ERROR_SUCCESS)
{
WCHAR szBuffer[MAX_PATH];
DWORD dwSize;
dwSize = sizeof(szBuffer);
if (RegQueryValueExW(hKey,
L"Language Hotkey",
NULL, NULL,
(LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
_KeySettings.dwLanguage = _wtoi(szBuffer);
}
dwSize = sizeof(szBuffer);
if (RegQueryValueExW(hKey,
L"Layout Hotkey",
NULL, NULL,
(LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
_KeySettings.dwLayout = _wtoi(szBuffer);
}
RegCloseKey(hKey);
}
}
static VOID
WriteKeysSettings(VOID)
{
HKEY hKey;
if (RegOpenKeyExW(HKEY_CURRENT_USER,
L"Keyboard Layout",
0,
KEY_SET_VALUE,
&hKey) == ERROR_SUCCESS)
{
RegSetValueExW(hKey,
L"Attributes",
0,
REG_DWORD,
(LPBYTE)&_KeySettings.dwAttributes,
sizeof(DWORD));
RegCloseKey(hKey);
}
if (RegOpenKeyExW(HKEY_CURRENT_USER,
L"Keyboard Layout\\Toggle",
0,
KEY_SET_VALUE,
&hKey) == ERROR_SUCCESS)
{
WCHAR szBuffer[MAX_PATH];
StringCchPrintfW(szBuffer, ARRAYSIZE(szBuffer), L"%lu", _KeySettings.dwLanguage);
RegSetValueExW(hKey,
L"Hotkey",
0,
REG_SZ,
(LPBYTE)szBuffer,
(wcslen(szBuffer) + 1) * sizeof(WCHAR));
RegSetValueExW(hKey,
L"Language Hotkey",
0,
REG_SZ,
(LPBYTE)szBuffer,
(wcslen(szBuffer) + 1) * sizeof(WCHAR));
StringCchPrintfW(szBuffer, ARRAYSIZE(szBuffer), L"%lu", _KeySettings.dwLayout);
RegSetValueExW(hKey,
L"Layout Hotkey",
0,
REG_SZ,
(LPBYTE)szBuffer,
(wcslen(szBuffer) + 1) * sizeof(WCHAR));
RegCloseKey(hKey);
}
/* Notice system of change hotkeys parameters */
SystemParametersInfoW(SPI_SETLANGTOGGLE, 0, NULL, 0);
/* Notice system of change CapsLock mode parameters */
ActivateKeyboardLayout(GetKeyboardLayout(0), KLF_RESET | _KeySettings.dwAttributes);
}
static VOID
UpdateKeySettingsListView(HWND hwndList)
{
WCHAR szBuffer[MAX_STR_LEN];
LV_ITEM item;
INT iItemIndex;
ListView_DeleteAllItems(hwndList);
ZeroMemory(&item, sizeof(item));
LoadStringW(hApplet, IDS_SWITCH_BET_INLANG, szBuffer, ARRAYSIZE(szBuffer));
item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
item.pszText = szBuffer;
item.iItem = 0;
iItemIndex = ListView_InsertItem(hwndList, &item);
if (_KeySettings.dwLanguage == 1)
{
LoadStringW(hApplet, IDS_LEFT_ALT_SHIFT, szBuffer, ARRAYSIZE(szBuffer));
}
else if (_KeySettings.dwLanguage == 2)
{
LoadStringW(hApplet, IDS_CTRL_SHIFT, szBuffer, ARRAYSIZE(szBuffer));
}
else
{
LoadStringW(hApplet, IDS_NONE, szBuffer, ARRAYSIZE(szBuffer));
}
ListView_SetItemText(hwndList, iItemIndex, 1, szBuffer);
}
static VOID
OnInitKeySettingsDialog(HWND hwndDlg)
{
LV_COLUMN column;
HWND hwndList;
ReadKeysSettings();
if (_KeySettings.dwAttributes & KLF_SHIFTLOCK)
{
CheckDlgButton(hwndDlg, IDC_PRESS_SHIFT_KEY_RB, BST_CHECKED);
CheckDlgButton(hwndDlg, IDC_PRESS_CL_KEY_RB, BST_UNCHECKED);
}
else
{
CheckDlgButton(hwndDlg, IDC_PRESS_SHIFT_KEY_RB, BST_UNCHECKED);
CheckDlgButton(hwndDlg, IDC_PRESS_CL_KEY_RB, BST_CHECKED);
}
hwndList = GetDlgItem(hwndDlg, IDC_KEY_LISTVIEW);
ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT);
ZeroMemory(&column, sizeof(column));
column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
column.fmt = LVCFMT_LEFT;
column.iSubItem = 0;
column.pszText = L"";
column.cx = 210;
ListView_InsertColumn(hwndList, 0, &column);
column.fmt = LVCFMT_RIGHT;
column.cx = 145;
column.iSubItem = 1;
column.pszText = L"";
ListView_InsertColumn(hwndList, 1, &column);
UpdateKeySettingsListView(hwndList);
}
INT_PTR CALLBACK
KeySettingsDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (uMsg)
{
case WM_INITDIALOG:
{
OnInitKeySettingsDialog(hwndDlg);
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_CHANGE_KEY_SEQ_BTN:
{
if (DialogBoxParamW(hApplet,
MAKEINTRESOURCEW(IDD_CHANGE_KEY_SEQ),
hwndDlg,
ChangeKeySeqDialogProc,
(LPARAM)&_KeySettings) == IDOK)
{
UpdateKeySettingsListView(GetDlgItem(hwndDlg, IDC_KEY_LISTVIEW));
}
}
break;
case IDOK:
{
if (IsDlgButtonChecked(hwndDlg, IDC_PRESS_CL_KEY_RB) == BST_CHECKED)
{
_KeySettings.dwAttributes &= ~KLF_SHIFTLOCK;
}
else
{
_KeySettings.dwAttributes |= KLF_SHIFTLOCK;
}
WriteKeysSettings();
EndDialog(hwndDlg, LOWORD(wParam));
}
break;
case IDCANCEL:
{
EndDialog(hwndDlg, LOWORD(wParam));
}
break;
}
}
break;
}
return FALSE;
}