sync with trunk r46493
[reactos.git] / dll / cpl / input / changekeyseq.c
1 /*
2 *
3 * PROJECT: input.dll
4 * FILE: dll/win32/input/changekeyseq.c
5 * PURPOSE: input.dll
6 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
7 * UPDATE HISTORY:
8 * 06-09-2007 Created
9 */
10
11 #include "resource.h"
12 #include "input.h"
13
14 BOOL
15 GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey)
16 {
17 HKEY hKey;
18 DWORD dwSize;
19
20 if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Toggle"),
21 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
22 {
23 dwSize = (1 + 1) * sizeof(TCHAR);
24 if (RegQueryValueEx(hKey, _T("Hotkey"), NULL, NULL,
25 (LPBYTE)szHotkey, &dwSize) != ERROR_SUCCESS)
26 {
27 RegCloseKey(hKey);
28 return FALSE;
29 }
30
31 dwSize = (1 + 1) * sizeof(TCHAR);
32 if (RegQueryValueEx(hKey, _T("Language Hotkey"), NULL, NULL,
33 (LPBYTE)szLangHotkey, &dwSize) != ERROR_SUCCESS)
34 {
35 RegCloseKey(hKey);
36 return FALSE;
37 }
38
39 dwSize = (1 + 1) * sizeof(TCHAR);
40 if (RegQueryValueEx(hKey, _T("Layout Hotkey"), NULL, NULL,
41 (LPBYTE)szLayoutHotkey, &dwSize) != ERROR_SUCCESS)
42 {
43 RegCloseKey(hKey);
44 return FALSE;
45 }
46
47 RegCloseKey(hKey);
48 }
49 else return FALSE;
50
51 return TRUE;
52 }
53
54 static VOID
55 SaveKeySeq(HWND hDlg)
56 {
57 TCHAR szLang[1 + 1], szLayout[1 + 1];
58 HKEY hKey;
59
60 if (SendDlgItemMessage(hDlg, IDC_SWITCH_INPUT_LANG_CB, BM_GETCHECK, 0, 0) == BST_CHECKED)
61 {
62 if (SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_GETCHECK, 0, 0) == BST_CHECKED)
63 _tcscpy(szLang, _T("2"));
64 else
65 _tcscpy(szLang, _T("1"));
66 }
67 else
68 {
69 _tcscpy(szLang, _T("3"));
70 }
71
72 if (SendDlgItemMessage(hDlg, IDC_SWITCH_KBLAYOUTS_CB, BM_GETCHECK, 0, 0) == BST_CHECKED)
73 {
74 if (SendDlgItemMessage(hDlg, IDC_CTRL_LAYOUT, BM_GETCHECK, 0, 0) == BST_CHECKED)
75 _tcscpy(szLayout, _T("2"));
76 else
77 _tcscpy(szLayout, _T("1"));
78 }
79 else
80 {
81 _tcscpy(szLayout, _T("3"));
82 }
83
84 if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Toggle"), 0, NULL,
85 REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
86 NULL, &hKey, NULL) == ERROR_SUCCESS)
87 {
88 if (RegSetValueEx(hKey, _T("Hotkey"), 0, REG_SZ, (LPBYTE)szLang,
89 (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS)
90 {
91 RegCloseKey(hKey);
92 return;
93 }
94
95 if (RegSetValueEx(hKey, _T("Language Hotkey"), 0, REG_SZ, (LPBYTE)szLang,
96 (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS)
97 {
98 RegCloseKey(hKey);
99 return;
100 }
101
102 if (RegSetValueEx(hKey, _T("Layout Hotkey"), 0, REG_SZ, (LPBYTE)szLayout,
103 (DWORD)((1 + 1) * sizeof(TCHAR))) != ERROR_SUCCESS)
104 {
105 RegCloseKey(hKey);
106 return;
107 }
108
109 RegCloseKey(hKey);
110 UpdateKeySettingsList();
111 }
112 }
113
114 static VOID
115 InitChangeKeySeqDlg(HWND hDlg)
116 {
117 TCHAR szHotkey[1 + 1], szLangHotkey[1 + 1], szLayoutHotkey[1 + 1];
118
119 if (!GetHotkeys(szHotkey, szLangHotkey, szLayoutHotkey))
120 return;
121
122 if (_tcscmp(szLangHotkey, _T("3")) == 0)
123 {
124 SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_SETCHECK, 1, 1);
125 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LANG), FALSE);
126 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LANG), FALSE);
127 }
128 else
129 {
130 SendDlgItemMessage(hDlg, IDC_SWITCH_INPUT_LANG_CB, BM_SETCHECK, 1, 1);
131
132 if (_tcscmp(szLangHotkey, _T("1")) == 0)
133 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LANG, BM_SETCHECK, 1, 1);
134 else
135 SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_SETCHECK, 1, 1);
136 }
137
138 if (_tcscmp(szLayoutHotkey, _T("3")) == 0)
139 {
140 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LAYOUT, BM_SETCHECK, 1, 1);
141 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LAYOUT), FALSE);
142 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LAYOUT), FALSE);
143 }
144 else
145 {
146 SendDlgItemMessage(hDlg, IDC_SWITCH_KBLAYOUTS_CB, BM_SETCHECK, 1, 1);
147
148 if (_tcscmp(szLayoutHotkey, _T("1")) == 0)
149 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LAYOUT, BM_SETCHECK, 1, 1);
150 else
151 SendDlgItemMessage(hDlg, IDC_CTRL_LAYOUT, BM_SETCHECK, 1, 1);
152 }
153 }
154
155 INT_PTR CALLBACK
156 ChangeKeySeqDlgProc(HWND hDlg,
157 UINT message,
158 WPARAM wParam,
159 LPARAM lParam)
160 {
161 UNREFERENCED_PARAMETER(lParam);
162
163 switch (message)
164 {
165 case WM_INITDIALOG:
166 InitChangeKeySeqDlg(hDlg);
167 break;
168
169 case WM_COMMAND:
170 switch (LOWORD(wParam))
171 {
172 case IDC_SWITCH_INPUT_LANG_CB:
173 if (HIWORD(wParam) == BN_CLICKED)
174 {
175 if (SendDlgItemMessage(hDlg, IDC_SWITCH_INPUT_LANG_CB, BM_GETCHECK, 0, 0) == BST_CHECKED)
176 {
177 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LANG), TRUE);
178 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LANG), TRUE);
179 }
180 else
181 {
182 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LANG), FALSE);
183 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LANG), FALSE);
184 }
185 }
186 break;
187
188 case IDC_SWITCH_KBLAYOUTS_CB:
189 if (HIWORD(wParam) == BN_CLICKED)
190 {
191 if (SendDlgItemMessage(hDlg, IDC_SWITCH_KBLAYOUTS_CB, BM_GETCHECK, 0, 0) == BST_CHECKED)
192 {
193 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LAYOUT), TRUE);
194 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LAYOUT), TRUE);
195 }
196 else
197 {
198 EnableWindow(GetDlgItem(hDlg, IDC_CTRL_LAYOUT), FALSE);
199 EnableWindow(GetDlgItem(hDlg, IDC_LEFT_ALT_LAYOUT), FALSE);
200 }
201 }
202 break;
203
204 case IDC_CTRL_LANG:
205 if (HIWORD(wParam) == BN_CLICKED)
206 {
207 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LAYOUT, BM_SETCHECK, 1, 1);
208 SendDlgItemMessage(hDlg, IDC_CTRL_LAYOUT, BM_SETCHECK, 0, 0);
209 }
210 break;
211
212 case IDC_LEFT_ALT_LANG:
213 if (HIWORD(wParam) == BN_CLICKED)
214 {
215 SendDlgItemMessage(hDlg, IDC_CTRL_LAYOUT, BM_SETCHECK, 1, 1);
216 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LAYOUT, BM_SETCHECK, 0, 0);
217 }
218 break;
219
220 case IDC_CTRL_LAYOUT:
221 if (HIWORD(wParam) == BN_CLICKED)
222 {
223 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LANG, BM_SETCHECK, 1, 1);
224 SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_SETCHECK, 0, 0);
225 }
226 break;
227
228 case IDC_LEFT_ALT_LAYOUT:
229 if (HIWORD(wParam) == BN_CLICKED)
230 {
231 SendDlgItemMessage(hDlg, IDC_CTRL_LANG, BM_SETCHECK, 1, 1);
232 SendDlgItemMessage(hDlg, IDC_LEFT_ALT_LANG, BM_SETCHECK, 0, 0);
233 }
234 break;
235
236 case IDOK:
237 SaveKeySeq(hDlg);
238 EndDialog(hDlg, LOWORD(wParam));
239 break;
240
241 case IDCANCEL:
242 EndDialog(hDlg, LOWORD(wParam));
243 break;
244 }
245 break;
246 }
247
248 return FALSE;
249 }
250
251 /* EOF */