Create this branch to work on loading of different Kernel-Debugger DLL providers...
[reactos.git] / dll / cpl / access / general.c
1 /*
2 * PROJECT: ReactOS Accessibility Control Panel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/access/general.c
5 * PURPOSE: General accessibility settings
6 * COPYRIGHT: Copyright 2004 Johannes Anderwald (j_anderw@sbox.tugraz.at)
7 * Copyright 2007 Eric Kohl
8 */
9
10 #include "access.h"
11
12
13 #define BAUDTICKS 6
14 static UINT nBaudArray[BAUDTICKS] = {300, 1200, 2400, 4800, 9600, 19200};
15
16
17 INT_PTR CALLBACK
18 SerialKeysDlgProc(HWND hwndDlg,
19 UINT uMsg,
20 WPARAM wParam,
21 LPARAM lParam)
22 {
23 PGLOBAL_DATA pGlobalData;
24 INT i, n;
25
26 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
27
28 switch (uMsg)
29 {
30 case WM_INITDIALOG:
31 pGlobalData = (PGLOBAL_DATA)lParam;
32 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
33
34 /* Add the COM-Ports 1 - 4 to the list */
35 for (i = 0; i < 4; i++)
36 {
37 TCHAR szBuffer[256];
38
39 _stprintf(szBuffer, _T("COM%d"), i + 1);
40 SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_ADDSTRING, 0, (LPARAM)szBuffer);
41 }
42
43 /* Determine the current port */
44 if (pGlobalData->serialKeys.lpszActivePort && pGlobalData->serialKeys.lpszActivePort[0])
45 {
46 i = pGlobalData->serialKeys.lpszActivePort[3] - '1';
47 if (i < 0 || i > 3)
48 i = 0;
49 }
50 else
51 {
52 /* Make COM1 the default port */
53 i = 0;
54 _tcscpy(pGlobalData->serialKeys.lpszActivePort, _T("COM1"));
55 }
56
57 /* Set the current port */
58 SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_SETCURSEL, i, 0);
59
60 /* Determine the current baud rate */
61 n = 0;
62 for (i = 0; i < BAUDTICKS; i++)
63 {
64 TCHAR szBuffer[256];
65
66 _stprintf(szBuffer, _T("%d Baud"), nBaudArray[i]);
67 SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_ADDSTRING, 0, (LPARAM)szBuffer);
68
69 if (pGlobalData->serialKeys.iBaudRate == nBaudArray[i])
70 n = i;
71 }
72
73 /* Set the current baud rate */
74 SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_SETCURSEL, n, 0);
75 break;
76
77 case WM_COMMAND:
78 switch (LOWORD(wParam))
79 {
80 case IDOK:
81 i = SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_GETCURSEL, 0, 0) + 1;
82 _stprintf(pGlobalData->serialKeys.lpszActivePort, _T("COM%d"), i);
83
84 i = SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_GETCURSEL, 0, 0);
85 pGlobalData->serialKeys.iBaudRate = nBaudArray[i];
86
87 EndDialog(hwndDlg, TRUE);
88 break;
89
90 case IDCANCEL:
91 EndDialog(hwndDlg, FALSE);
92 break;
93
94 default:
95 break;
96 }
97 break;
98 }
99
100 return FALSE;
101 }
102
103
104 static VOID
105 FillResetComboBox(HWND hwnd)
106 {
107 TCHAR szBuffer[32];
108 TCHAR szMinutes[20];
109 INT i;
110
111 if (LoadString(hApplet, IDS_MINUTES, szMinutes, 20) == 0)
112 lstrcpy(szMinutes, L"Minutes");
113
114 for (i = 0; i < 6; i++)
115 {
116 _stprintf(szBuffer, _T("%u %s"), (i + 1) * 5, szMinutes);
117 SendMessage(hwnd,
118 CB_ADDSTRING,
119 0,
120 (LPARAM)szBuffer);
121 }
122 }
123
124
125 static VOID
126 WriteGlobalData(PGLOBAL_DATA pGlobalData)
127 {
128 DWORD dwDisposition;
129 HKEY hKey;
130 LONG lError;
131
132 SystemParametersInfo(SPI_SETACCESSTIMEOUT,
133 sizeof(ACCESSTIMEOUT),
134 &pGlobalData->accessTimeout,
135 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
136
137 SystemParametersInfo(SPI_SETSERIALKEYS,
138 sizeof(SERIALKEYS),
139 &pGlobalData->serialKeys,
140 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
141
142 lError = RegCreateKeyEx(HKEY_CURRENT_USER,
143 _T("Control Panel\\Accessibility"),
144 0,
145 NULL,
146 REG_OPTION_NON_VOLATILE,
147 KEY_SET_VALUE,
148 NULL,
149 &hKey,
150 &dwDisposition);
151 if (lError != ERROR_SUCCESS)
152 return;
153
154 RegSetValueEx(hKey,
155 _T("Warning Sounds"),
156 0,
157 REG_DWORD,
158 (LPBYTE)&pGlobalData->bWarningSounds,
159 sizeof(BOOL));
160
161 RegSetValueEx(hKey,
162 _T("Sound On Activation"),
163 0,
164 REG_DWORD,
165 (LPBYTE)&pGlobalData->bSoundOnActivation,
166 sizeof(BOOL));
167
168 RegCloseKey(hKey);
169 }
170
171
172 /* Property page dialog callback */
173 INT_PTR CALLBACK
174 GeneralPageProc(HWND hwndDlg,
175 UINT uMsg,
176 WPARAM wParam,
177 LPARAM lParam)
178 {
179 PGLOBAL_DATA pGlobalData;
180 LPPSHNOTIFY lppsn;
181
182 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
183
184 switch (uMsg)
185 {
186 case WM_INITDIALOG:
187 pGlobalData = (PGLOBAL_DATA)((LPPROPSHEETPAGE)lParam)->lParam;
188 if (pGlobalData == NULL)
189 return FALSE;
190
191 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
192
193 /* Set access timeout info */
194 CheckDlgButton(hwndDlg,
195 IDC_RESET_BOX,
196 pGlobalData->accessTimeout.dwFlags & ATF_TIMEOUTON ? BST_CHECKED : BST_UNCHECKED);
197 FillResetComboBox(GetDlgItem(hwndDlg, IDC_RESET_COMBO));
198 SendDlgItemMessage(hwndDlg, IDC_RESET_COMBO, CB_SETCURSEL,
199 (pGlobalData->accessTimeout.iTimeOutMSec / 300000) - 1, 0);
200 EnableWindow(GetDlgItem(hwndDlg, IDC_RESET_COMBO),
201 pGlobalData->accessTimeout.dwFlags & ATF_TIMEOUTON ? TRUE : FALSE);
202
203 CheckDlgButton(hwndDlg,
204 IDC_NOTIFICATION_MESSAGE,
205 pGlobalData->bWarningSounds ? BST_CHECKED : BST_UNCHECKED);
206
207 CheckDlgButton(hwndDlg,
208 IDC_NOTIFICATION_SOUND,
209 pGlobalData->bSoundOnActivation ? BST_CHECKED : BST_UNCHECKED);
210
211 /* Set serial keys info */
212 CheckDlgButton(hwndDlg,
213 IDC_SERIAL_BOX,
214 pGlobalData->serialKeys.dwFlags & SERKF_SERIALKEYSON ? BST_CHECKED : BST_UNCHECKED);
215 EnableWindow(GetDlgItem(hwndDlg, IDC_SERIAL_BOX),
216 pGlobalData->serialKeys.dwFlags & SERKF_AVAILABLE ? TRUE : FALSE);
217 EnableWindow(GetDlgItem(hwndDlg, IDC_SERIAL_BUTTON),
218 pGlobalData->serialKeys.dwFlags & SERKF_AVAILABLE ? TRUE : FALSE);
219
220 return TRUE;
221
222 case WM_COMMAND:
223 switch (LOWORD(wParam))
224 {
225 case IDC_RESET_BOX:
226 pGlobalData->accessTimeout.dwFlags ^= ATF_TIMEOUTON;
227 EnableWindow(GetDlgItem(hwndDlg, IDC_RESET_COMBO),
228 pGlobalData->accessTimeout.dwFlags & ATF_TIMEOUTON ? TRUE : FALSE);
229 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
230 break;
231
232 case IDC_RESET_COMBO:
233 if (HIWORD(wParam) == CBN_CLOSEUP)
234 {
235 INT nSel;
236 nSel = SendDlgItemMessage(hwndDlg, IDC_RESET_COMBO, CB_GETCURSEL, 0, 0);
237 pGlobalData->accessTimeout.iTimeOutMSec = (ULONG)((nSel + 1) * 300000);
238 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
239 }
240 break;
241
242 case IDC_NOTIFICATION_MESSAGE:
243 pGlobalData->bWarningSounds = !pGlobalData->bWarningSounds;
244 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
245 break;
246
247 case IDC_NOTIFICATION_SOUND:
248 pGlobalData->bSoundOnActivation = !pGlobalData->bSoundOnActivation;
249 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
250 break;
251
252 case IDC_SERIAL_BOX:
253 pGlobalData->serialKeys.dwFlags ^= SERKF_SERIALKEYSON;
254 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
255 break;
256
257 case IDC_SERIAL_BUTTON:
258 if (DialogBoxParam(hApplet,
259 MAKEINTRESOURCE(IDD_SERIALKEYSOPTIONS),
260 hwndDlg,
261 (DLGPROC)SerialKeysDlgProc,
262 (LPARAM)pGlobalData))
263 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
264 break;
265
266 case IDC_ADMIN_LOGON_BOX:
267 break;
268
269 case IDC_ADMIN_USERS_BOX:
270 break;
271
272 default:
273 break;
274 }
275 break;
276
277 case WM_NOTIFY:
278 lppsn = (LPPSHNOTIFY)lParam;
279 if (lppsn->hdr.code == PSN_APPLY)
280 {
281 WriteGlobalData(pGlobalData);
282 return TRUE;
283 }
284 break;
285 }
286
287 return FALSE;
288 }