From e3a477e25621bc42995ff8fc87bfddbc773ad4c3 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sun, 18 May 2008 09:06:48 +0000 Subject: [PATCH] - Implement "Advanced Key Settings" and "Change Key Sequence" dialogs svn path=/trunk/; revision=33567 --- reactos/dll/cpl/input/changekeyseq.c | 68 ++++++++++++++++++++++++++-- reactos/dll/cpl/input/input.h | 2 + reactos/dll/cpl/input/keysettings.c | 37 ++++++++++++++- 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/reactos/dll/cpl/input/changekeyseq.c b/reactos/dll/cpl/input/changekeyseq.c index b6bfff8b7d3..ac06de7e8d7 100644 --- a/reactos/dll/cpl/input/changekeyseq.c +++ b/reactos/dll/cpl/input/changekeyseq.c @@ -20,7 +20,7 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey) if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Toggle"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwSize = sizeof(szHotkey); + dwSize = (1 + 1) * sizeof(TCHAR); if (RegQueryValueEx(hKey, _T("Hotkey"), NULL, NULL, (LPBYTE)szHotkey, &dwSize) != ERROR_SUCCESS) { @@ -28,7 +28,7 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey) return FALSE; } - dwSize = sizeof(szLangHotkey); + dwSize = (1 + 1) * sizeof(TCHAR); if (RegQueryValueEx(hKey, _T("Language Hotkey"), NULL, NULL, (LPBYTE)szLangHotkey, &dwSize) != ERROR_SUCCESS) { @@ -36,7 +36,7 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey) return FALSE; } - dwSize = sizeof(szLayoutHotkey); + dwSize = (1 + 1) * sizeof(TCHAR); if (RegQueryValueEx(hKey, _T("Layout Hotkey"), NULL, NULL, (LPBYTE)szLayoutHotkey, &dwSize) != ERROR_SUCCESS) { @@ -51,6 +51,66 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey) return TRUE; } +static VOID +SaveKeySeq(HWND hDlg) +{ + TCHAR szLang[1 + 1], szLayout[1 + 1]; + HKEY hKey; + + if (SendDlgItemMessage(hDlg, IDC_SWITCH_INPUT_LANG_CB, BM_GETCHECK, 0, 0) == BST_CHECKED) + { + if (SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_GETCHECK, 0, 0) == BST_CHECKED) + _tcscpy(szLang, _T("2")); + else + _tcscpy(szLang, _T("1")); + } + else + { + _tcscpy(szLang, _T("3")); + } + + if (SendDlgItemMessage(hDlg, IDC_SWITCH_KBLAYOUTS_CB, BM_GETCHECK, 0, 0) == BST_CHECKED) + { + if (SendDlgItemMessage(hDlg, IDC_CTRL_LAYOUT, BM_GETCHECK, 0, 0) == BST_CHECKED) + _tcscpy(szLayout, _T("2")); + else + _tcscpy(szLayout, _T("1")); + } + else + { + _tcscpy(szLayout, _T("3")); + } + + if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Toggle"), 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, + NULL, &hKey, NULL) == ERROR_SUCCESS) + { + if (RegSetValueEx(hKey, _T("Hotkey"), 0, REG_SZ, (LPBYTE)szLang, + (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return; + } + + if (RegSetValueEx(hKey, _T("Language Hotkey"), 0, REG_SZ, (LPBYTE)szLang, + (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return; + } + + if (RegSetValueEx(hKey, _T("Layout Hotkey"), 0, REG_SZ, (LPBYTE)szLayout, + (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return; + } + + RegCloseKey(hKey); + UpdateKeySettingsList(); + } +} + static VOID InitChangeKeySeqDlg(HWND hDlg) { @@ -174,6 +234,8 @@ ChangeKeySeqDlgProc(HWND hDlg, break; case IDOK: + SaveKeySeq(hDlg); + EndDialog(hDlg, LOWORD(wParam)); break; case IDCANCEL: diff --git a/reactos/dll/cpl/input/input.h b/reactos/dll/cpl/input/input.h index f87bccbb37e..3e2ca9fe3e4 100644 --- a/reactos/dll/cpl/input/input.h +++ b/reactos/dll/cpl/input/input.h @@ -47,6 +47,8 @@ IsLayoutExists(LPTSTR szLayoutID, LPTSTR szLangID); /* keysettings.c */ INT_PTR CALLBACK KeySettingsDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +VOID +UpdateKeySettingsList(); /* add.c */ INT_PTR CALLBACK diff --git a/reactos/dll/cpl/input/keysettings.c b/reactos/dll/cpl/input/keysettings.c index 3bf12fe793d..d66676c181b 100644 --- a/reactos/dll/cpl/input/keysettings.c +++ b/reactos/dll/cpl/input/keysettings.c @@ -12,6 +12,8 @@ #include "resource.h" #include "input.h" +static HWND hKeySettingsWnd; + static VOID AddListColumn(HWND hDlg) { @@ -56,6 +58,27 @@ GetAttributes() return dwValue; } +static VOID +SaveKeySettings(HWND hDlg) +{ + HKEY hKey; + DWORD dwValue; + + if (SendDlgItemMessage(hDlg, IDC_PRESS_CL_KEY_RB, BM_GETCHECK, 0, 0) == BST_CHECKED) + dwValue = 0x0; + else + dwValue = 0x10000; + + if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout"), 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, + NULL, &hKey, NULL) == ERROR_SUCCESS) + { + RegSetValueEx(hKey, _T("Attributes"), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); + + RegCloseKey(hKey); + } +} + static VOID InitKeySettingsDlg(HWND hDlg) { @@ -78,8 +101,10 @@ InitKeySettingsDlg(HWND hDlg) if (_tcscmp(szLangHotkey, _T("2")) == 0) LoadString(hApplet, IDS_CTRL_SHIFT, szText, sizeof(szText) / sizeof(TCHAR)); - else + else if (_tcscmp(szLangHotkey, _T("1")) == 0) LoadString(hApplet, IDS_LEFT_ALT_SHIFT, szText, sizeof(szText) / sizeof(TCHAR)); + else + LoadString(hApplet, IDS_NONE, szText, sizeof(szText) / sizeof(TCHAR)); item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; item.pszText = szTitle; @@ -92,6 +117,13 @@ InitKeySettingsDlg(HWND hDlg) ListView_SetItemState(hHotkeyList, i, LVIS_SELECTED, LVIS_OVERLAYMASK); } +VOID +UpdateKeySettingsList() +{ + (VOID) ListView_DeleteAllItems(GetDlgItem(hKeySettingsWnd, IDC_KEY_LISTVIEW)); + InitKeySettingsDlg(hKeySettingsWnd); +} + INT_PTR CALLBACK KeySettingsDlgProc(HWND hDlg, UINT message, @@ -103,6 +135,7 @@ KeySettingsDlgProc(HWND hDlg, switch (message) { case WM_INITDIALOG: + hKeySettingsWnd = hDlg; AddListColumn(hDlg); (VOID) ListView_SetExtendedListViewStyle(GetDlgItem(hDlg, IDC_KEY_LISTVIEW), LVS_EX_FULLROWSELECT); @@ -120,6 +153,8 @@ KeySettingsDlgProc(HWND hDlg, break; case IDOK: + SaveKeySettings(hDlg); + EndDialog(hDlg, LOWORD(wParam)); break; case IDCANCEL: