- Implement "Advanced Key Settings" and "Change Key Sequence" dialogs
authorDmitry Chapyshev <dmitry@reactos.org>
Sun, 18 May 2008 09:06:48 +0000 (09:06 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sun, 18 May 2008 09:06:48 +0000 (09:06 +0000)
svn path=/trunk/; revision=33567

reactos/dll/cpl/input/changekeyseq.c
reactos/dll/cpl/input/input.h
reactos/dll/cpl/input/keysettings.c

index b6bfff8..ac06de7 100644 (file)
@@ -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:
index f87bccb..3e2ca9f 100644 (file)
@@ -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
index 3bf12fe..d66676c 100644 (file)
@@ -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: