Move the settings read code into a single function which is called before creating...
[reactos.git] / reactos / dll / cpl / access / keyboard.c
1 /* $Id$
2 *
3 * PROJECT: ReactOS Accessibility Control Panel
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: dll/cpl/access/keyboard.c
6 * PURPOSE: Keyboard-related accessibility settings
7 * COPYRIGHT: Copyright 2004 Johannes Anderwald (j_anderw@sbox.tugraz.at)
8 * Copyright 2007 Eric Kohl
9 */
10
11 #include <windows.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <commctrl.h>
15 #include <prsht.h>
16 #include <tchar.h>
17 #include "resource.h"
18 #include "access.h"
19
20
21 #define BOUNCETICKS 5
22 static INT nBounceArray[BOUNCETICKS] = {500, 700, 1000, 1500, 2000};
23
24 #define DELAYTICKS 5
25 static INT nDelayArray[DELAYTICKS] = {300, 700, 1000, 1500, 2000};
26
27 #define REPEATTICKS 6
28 static INT nRepeatArray[REPEATTICKS] = {300, 500, 700, 1000, 1500, 2000};
29
30 #define WAITTICKS 10
31 static INT nWaitArray[WAITTICKS] = {0, 300, 500, 700, 1000, 1500, 2000, 5000, 10000, 20000};
32
33
34 static VOID
35 EnableFilterKeysTest(PGLOBAL_DATA pGlobalData)
36 {
37 pGlobalData->filterKeys.dwFlags |= FKF_FILTERKEYSON;
38 pGlobalData->filterKeys.dwFlags &= ~FKF_INDICATOR;
39
40 SystemParametersInfo(SPI_SETFILTERKEYS,
41 sizeof(FILTERKEYS),
42 &pGlobalData->filterKeys,
43 0);
44 }
45
46
47 static VOID
48 DisableFilterKeysTest(PGLOBAL_DATA pGlobalData)
49 {
50 if (pGlobalData->oldFilterKeys.dwFlags & FKF_FILTERKEYSON)
51 {
52 pGlobalData->filterKeys.dwFlags |= FKF_FILTERKEYSON;
53 }
54 else
55 {
56 pGlobalData->filterKeys.dwFlags &= ~FKF_FILTERKEYSON;
57 }
58
59 if (pGlobalData->oldFilterKeys.dwFlags & FKF_INDICATOR)
60 {
61 pGlobalData->filterKeys.dwFlags |= FKF_INDICATOR;
62 }
63 else
64 {
65 pGlobalData->filterKeys.dwFlags &= ~FKF_INDICATOR;
66 }
67
68 SystemParametersInfo(SPI_SETFILTERKEYS,
69 sizeof(FILTERKEYS),
70 &pGlobalData->filterKeys,
71 0);
72 }
73
74
75 /* Property page dialog callback */
76 INT_PTR CALLBACK
77 StickyKeysDlgProc(HWND hwndDlg,
78 UINT uMsg,
79 WPARAM wParam,
80 LPARAM lParam)
81 {
82 PGLOBAL_DATA pGlobalData;
83
84 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
85
86 switch (uMsg)
87 {
88 case WM_INITDIALOG:
89 pGlobalData = (PGLOBAL_DATA)lParam;
90 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
91
92 memcpy(&pGlobalData->oldStickyKeys,
93 &pGlobalData->stickyKeys,
94 sizeof(STICKYKEYS));
95
96 CheckDlgButton(hwndDlg,
97 IDC_STICKY_ACTIVATE_CHECK,
98 pGlobalData->stickyKeys.dwFlags & SKF_HOTKEYACTIVE ? BST_CHECKED : BST_UNCHECKED);
99
100 CheckDlgButton(hwndDlg,
101 IDC_STICKY_LOCK_CHECK,
102 pGlobalData->stickyKeys.dwFlags & SKF_TRISTATE ? BST_CHECKED : BST_UNCHECKED);
103
104 CheckDlgButton(hwndDlg,
105 IDC_STICKY_UNLOCK_CHECK,
106 pGlobalData->stickyKeys.dwFlags & SKF_TWOKEYSOFF ? BST_CHECKED : BST_UNCHECKED);
107
108 CheckDlgButton(hwndDlg,
109 IDC_STICKY_SOUND_CHECK,
110 pGlobalData->stickyKeys.dwFlags & SKF_AUDIBLEFEEDBACK ? BST_CHECKED : BST_UNCHECKED);
111
112 CheckDlgButton(hwndDlg,
113 IDC_STICKY_STATUS_CHECK,
114 pGlobalData->stickyKeys.dwFlags & SKF_INDICATOR ? BST_CHECKED : BST_UNCHECKED);
115 break;
116
117 case WM_COMMAND:
118 switch (LOWORD(wParam))
119 {
120 case IDC_STICKY_ACTIVATE_CHECK:
121 pGlobalData->stickyKeys.dwFlags ^= SKF_HOTKEYACTIVE;
122 break;
123
124 case IDC_STICKY_LOCK_CHECK:
125 pGlobalData->stickyKeys.dwFlags ^= SKF_TRISTATE;
126 break;
127
128 case IDC_STICKY_UNLOCK_CHECK:
129 pGlobalData->stickyKeys.dwFlags ^= SKF_TWOKEYSOFF;
130 break;
131
132 case IDC_STICKY_SOUND_CHECK:
133 pGlobalData->stickyKeys.dwFlags ^= SKF_AUDIBLEFEEDBACK;
134 break;
135
136 case IDC_STICKY_STATUS_CHECK:
137 pGlobalData->stickyKeys.dwFlags ^= SKF_INDICATOR;
138 break;
139
140 case IDOK:
141 EndDialog(hwndDlg,
142 (pGlobalData->stickyKeys.dwFlags != pGlobalData->oldStickyKeys.dwFlags));
143 break;
144
145 case IDCANCEL:
146 EndDialog(hwndDlg, FALSE);
147 break;
148
149 default:
150 break;
151 }
152 break;
153 }
154
155 return FALSE;
156 }
157
158
159 static VOID
160 AddComboBoxTime(HWND hwnd, INT nId, INT nTimeMs)
161 {
162 TCHAR szBuffer[32];
163 TCHAR szSeconds[20];
164
165 if (LoadString(hApplet, IDS_SECONDS, szSeconds, 20) == 0)
166 lstrcpy(szSeconds, L"Seconds");
167
168 _stprintf(szBuffer, _T("%d.%d %s"),
169 nTimeMs / 1000, (nTimeMs % 1000) / 100,
170 szSeconds);
171
172 SendDlgItemMessage(hwnd, nId, CB_ADDSTRING, 0, (LPARAM)szBuffer);
173 }
174
175
176 INT_PTR CALLBACK
177 BounceKeysDlgProc(HWND hwndDlg,
178 UINT uMsg,
179 WPARAM wParam,
180 LPARAM lParam)
181 {
182 PGLOBAL_DATA pGlobalData;
183 INT i, n;
184
185 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
186
187 switch (uMsg)
188 {
189 case WM_INITDIALOG:
190 pGlobalData = (PGLOBAL_DATA)lParam;
191 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
192
193 /* Determine the current bounce time */
194 if (pGlobalData->filterKeys.iBounceMSec == 0)
195 pGlobalData->filterKeys.iBounceMSec = nBounceArray[0];
196
197 for (n = 0; n < BOUNCETICKS; n++)
198 {
199 if (pGlobalData->filterKeys.iBounceMSec < nBounceArray[n])
200 break;
201 }
202 n--;
203
204 for (i = 0; i < BOUNCETICKS; i++)
205 {
206 AddComboBoxTime(hwndDlg, IDC_BOUNCE_TIME_COMBO, nBounceArray[i]);
207 }
208
209 SendDlgItemMessage(hwndDlg, IDC_BOUNCE_TIME_COMBO, CB_SETCURSEL, n, 0);
210 break;
211
212 case WM_COMMAND:
213 switch (LOWORD(wParam))
214 {
215 case IDC_BOUNCE_TIME_COMBO:
216 if (HIWORD(wParam) == CBN_SELCHANGE)
217 {
218 i = SendDlgItemMessage(hwndDlg, IDC_BOUNCE_TIME_COMBO, CB_GETCURSEL, 0, 0);
219 if (i != CB_ERR)
220 {
221 pGlobalData->filterKeys.iBounceMSec = nBounceArray[i];
222 }
223 }
224 break;
225
226 case IDC_BOUNCE_TEST_EDIT:
227 switch (HIWORD(wParam))
228 {
229 case EN_SETFOCUS:
230 EnableFilterKeysTest(pGlobalData);
231 break;
232
233 case EN_KILLFOCUS:
234 DisableFilterKeysTest(pGlobalData);
235 break;
236 }
237 break;
238
239 case IDOK:
240 EndDialog(hwndDlg, TRUE);
241 break;
242
243 case IDCANCEL:
244 EndDialog(hwndDlg, FALSE);
245 break;
246
247 default:
248 break;
249 }
250 break;
251 }
252
253 return FALSE;
254 }
255
256
257 INT_PTR CALLBACK
258 RepeatKeysDlgProc(HWND hwndDlg,
259 UINT uMsg,
260 WPARAM wParam,
261 LPARAM lParam)
262 {
263 PGLOBAL_DATA pGlobalData;
264 INT i, n;
265
266 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
267
268 switch (uMsg)
269 {
270 case WM_INITDIALOG:
271 pGlobalData = (PGLOBAL_DATA)lParam;
272 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
273
274 CheckRadioButton(hwndDlg,
275 IDC_REPEAT_NOREPEAT_RADIO,
276 IDC_REPEAT_REPEAT_RADIO,
277 (pGlobalData->filterKeys.iDelayMSec == 0) ? IDC_REPEAT_NOREPEAT_RADIO : IDC_REPEAT_REPEAT_RADIO);
278
279 /* Initialize the delay combobox */
280 for (n = 0; n < DELAYTICKS; n++)
281 {
282 if (pGlobalData->filterKeys.iDelayMSec < nDelayArray[n])
283 break;
284 }
285 n--;
286
287 for (i = 0; i < DELAYTICKS; i++)
288 {
289 AddComboBoxTime(hwndDlg, IDC_REPEAT_DELAY_COMBO, nDelayArray[i]);
290 }
291
292 SendDlgItemMessage(hwndDlg, IDC_REPEAT_DELAY_COMBO, CB_SETCURSEL, n, 0);
293
294 /* Initialize the repeat combobox */
295 for (n = 0; n < REPEATTICKS; n++)
296 {
297 if (pGlobalData->filterKeys.iRepeatMSec < nRepeatArray[n])
298 break;
299 }
300 n--;
301
302 for (i = 0; i < REPEATTICKS; i++)
303 {
304 AddComboBoxTime(hwndDlg, IDC_REPEAT_REPEAT_COMBO, nRepeatArray[i]);
305 }
306
307 SendDlgItemMessage(hwndDlg, IDC_REPEAT_REPEAT_COMBO, CB_SETCURSEL, n, 0);
308
309 /* Disable the delay and repeat comboboxes if needed */
310 if (pGlobalData->filterKeys.iDelayMSec == 0)
311 {
312 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_DELAY_COMBO), FALSE);
313 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_REPEAT_COMBO), FALSE);
314 }
315
316 /* Initialize the wait combobox */
317 for (n = 0; n < WAITTICKS; n++)
318 {
319 if (pGlobalData->filterKeys.iWaitMSec < nWaitArray[n])
320 break;
321 }
322 n--;
323
324 for (i = 0; i < WAITTICKS; i++)
325 {
326 AddComboBoxTime(hwndDlg, IDC_REPEAT_WAIT_COMBO, nWaitArray[i]);
327 }
328
329 SendDlgItemMessage(hwndDlg, IDC_REPEAT_WAIT_COMBO, CB_SETCURSEL, n, 0);
330 break;
331
332 case WM_COMMAND:
333 switch (LOWORD(wParam))
334 {
335 case IDC_REPEAT_NOREPEAT_RADIO:
336 pGlobalData->filterKeys.iDelayMSec = 0;
337 pGlobalData->filterKeys.iRepeatMSec = 0;
338 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_DELAY_COMBO), FALSE);
339 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_REPEAT_COMBO), FALSE);
340 break;
341
342 case IDC_REPEAT_REPEAT_RADIO:
343 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_DELAY_COMBO), TRUE);
344 EnableWindow(GetDlgItem(hwndDlg, IDC_REPEAT_REPEAT_COMBO), TRUE);
345 break;
346
347 case IDC_REPEAT_DELAY_COMBO:
348 if (HIWORD(wParam) == CBN_SELCHANGE)
349 {
350 i = SendDlgItemMessage(hwndDlg, IDC_REPEAT_DELAY_COMBO, CB_GETCURSEL, 0, 0);
351 if (i != CB_ERR)
352 {
353 pGlobalData->filterKeys.iDelayMSec = nDelayArray[i];
354 }
355 }
356 break;
357
358 case IDC_REPEAT_REPEAT_COMBO:
359 if (HIWORD(wParam) == CBN_SELCHANGE)
360 {
361 i = SendDlgItemMessage(hwndDlg, IDC_REPEAT_REPEAT_COMBO, CB_GETCURSEL, 0, 0);
362 if (i != CB_ERR)
363 {
364 pGlobalData->filterKeys.iRepeatMSec = nRepeatArray[i];
365 }
366 }
367 break;
368
369 case IDC_REPEAT_WAIT_COMBO:
370 if (HIWORD(wParam) == CBN_SELCHANGE)
371 {
372 i = SendDlgItemMessage(hwndDlg, IDC_REPEAT_WAIT_COMBO, CB_GETCURSEL, 0, 0);
373 if (i != CB_ERR)
374 {
375 pGlobalData->filterKeys.iWaitMSec = nWaitArray[i];
376 }
377 }
378 break;
379
380 case IDC_REPEAT_TEST_EDIT:
381 switch (HIWORD(wParam))
382 {
383 case EN_SETFOCUS:
384 EnableFilterKeysTest(pGlobalData);
385 break;
386
387 case EN_KILLFOCUS:
388 DisableFilterKeysTest(pGlobalData);
389 break;
390 }
391 break;
392
393 case IDOK:
394 EndDialog(hwndDlg, TRUE);
395 break;
396
397 case IDCANCEL:
398 EndDialog(hwndDlg, FALSE);
399 break;
400
401 default:
402 break;
403 }
404 break;
405 }
406
407 return FALSE;
408 }
409
410
411 /* Property page dialog callback */
412 INT_PTR CALLBACK
413 FilterKeysDlgProc(HWND hwndDlg,
414 UINT uMsg,
415 WPARAM wParam,
416 LPARAM lParam)
417 {
418 PGLOBAL_DATA pGlobalData;
419
420 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
421
422 switch (uMsg)
423 {
424 case WM_INITDIALOG:
425 pGlobalData = (PGLOBAL_DATA)lParam;
426 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
427
428 memcpy(&pGlobalData->oldFilterKeys,
429 &pGlobalData->filterKeys,
430 sizeof(FILTERKEYS));
431
432 CheckDlgButton(hwndDlg,
433 IDC_FILTER_ACTIVATE_CHECK,
434 pGlobalData->filterKeys.dwFlags & FKF_HOTKEYACTIVE ? BST_CHECKED : BST_UNCHECKED);
435
436 if (pGlobalData->filterKeys.iBounceMSec != 0)
437 {
438 CheckRadioButton(hwndDlg, IDC_FILTER_BOUNCE_RADIO, IDC_FILTER_REPEAT_RADIO, IDC_FILTER_BOUNCE_RADIO);
439 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_BOUNCE_BUTTON), TRUE);
440 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_REPEAT_BUTTON), FALSE);
441 }
442 else
443 {
444 CheckRadioButton(hwndDlg, IDC_FILTER_BOUNCE_RADIO, IDC_FILTER_REPEAT_RADIO, IDC_FILTER_REPEAT_RADIO);
445 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_BOUNCE_BUTTON), FALSE);
446 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_REPEAT_BUTTON), TRUE);
447 }
448
449 CheckDlgButton(hwndDlg,
450 IDC_FILTER_SOUND_CHECK,
451 pGlobalData->filterKeys.dwFlags & FKF_CLICKON ? BST_CHECKED : BST_UNCHECKED);
452
453 CheckDlgButton(hwndDlg,
454 IDC_FILTER_STATUS_CHECK,
455 pGlobalData->filterKeys.dwFlags & FKF_INDICATOR ? BST_CHECKED : BST_UNCHECKED);
456 break;
457
458 case WM_COMMAND:
459 switch (LOWORD(wParam))
460 {
461 case IDC_FILTER_ACTIVATE_CHECK:
462 pGlobalData->filterKeys.dwFlags ^= FKF_HOTKEYACTIVE;
463 break;
464
465 case IDC_FILTER_BOUNCE_RADIO:
466 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_BOUNCE_BUTTON), TRUE);
467 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_REPEAT_BUTTON), FALSE);
468 break;
469
470 case IDC_FILTER_REPEAT_RADIO:
471 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_BOUNCE_BUTTON), FALSE);
472 EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER_REPEAT_BUTTON), TRUE);
473 break;
474
475 case IDC_FILTER_BOUNCE_BUTTON:
476 DialogBoxParam(hApplet,
477 MAKEINTRESOURCE(IDD_BOUNCEKEYSOPTIONS),
478 hwndDlg,
479 (DLGPROC)BounceKeysDlgProc,
480 (LPARAM)pGlobalData);
481 break;
482
483 case IDC_FILTER_TEST_EDIT:
484 switch (HIWORD(wParam))
485 {
486 case EN_SETFOCUS:
487 EnableFilterKeysTest(pGlobalData);
488 break;
489
490 case EN_KILLFOCUS:
491 DisableFilterKeysTest(pGlobalData);
492 break;
493 }
494 break;
495
496 case IDC_FILTER_SOUND_CHECK:
497 pGlobalData->filterKeys.dwFlags ^= FKF_CLICKON;
498 break;
499
500 case IDC_FILTER_REPEAT_BUTTON:
501 DialogBoxParam(hApplet,
502 MAKEINTRESOURCE(IDD_REPEATKEYSOPTIONS),
503 hwndDlg,
504 (DLGPROC)RepeatKeysDlgProc,
505 (LPARAM)pGlobalData);
506 break;
507
508 case IDC_FILTER_STATUS_CHECK:
509 pGlobalData->filterKeys.dwFlags ^= FKF_INDICATOR;
510 break;
511
512 case IDOK:
513 EndDialog(hwndDlg,
514 (pGlobalData->filterKeys.dwFlags != pGlobalData->oldFilterKeys.dwFlags));
515 break;
516
517 case IDCANCEL:
518 EndDialog(hwndDlg, FALSE);
519 break;
520
521 default:
522 break;
523 }
524 break;
525 }
526
527 return FALSE;
528 }
529
530
531 /* Property page dialog callback */
532 INT_PTR CALLBACK
533 ToggleKeysDlgProc(HWND hwndDlg,
534 UINT uMsg,
535 WPARAM wParam,
536 LPARAM lParam)
537 {
538 PGLOBAL_DATA pGlobalData;
539
540 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
541
542 switch (uMsg)
543 {
544 case WM_INITDIALOG:
545 pGlobalData = (PGLOBAL_DATA)lParam;
546 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
547
548 memcpy(&pGlobalData->oldToggleKeys,
549 &pGlobalData->toggleKeys,
550 sizeof(STICKYKEYS));
551
552 CheckDlgButton(hwndDlg,
553 IDC_TOGGLE_ACTIVATE_CHECK,
554 pGlobalData->toggleKeys.dwFlags & TKF_HOTKEYACTIVE ? BST_CHECKED : BST_UNCHECKED);
555 break;
556
557 case WM_COMMAND:
558 switch (LOWORD(wParam))
559 {
560 case IDC_TOGGLE_ACTIVATE_CHECK:
561 pGlobalData->toggleKeys.dwFlags ^= TKF_HOTKEYACTIVE;
562 break;
563
564 case IDOK:
565 EndDialog(hwndDlg,
566 (pGlobalData->toggleKeys.dwFlags != pGlobalData->oldToggleKeys.dwFlags));
567 break;
568
569 case IDCANCEL:
570 EndDialog(hwndDlg, FALSE);
571 break;
572
573 default:
574 break;
575 }
576 break;
577 }
578
579 return FALSE;
580 }
581
582
583 /* Property page dialog callback */
584 INT_PTR CALLBACK
585 KeyboardPageProc(HWND hwndDlg,
586 UINT uMsg,
587 WPARAM wParam,
588 LPARAM lParam)
589 {
590 PGLOBAL_DATA pGlobalData;
591 LPPSHNOTIFY lppsn;
592
593 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
594
595 switch (uMsg)
596 {
597 case WM_INITDIALOG:
598 pGlobalData = (PGLOBAL_DATA)((LPPROPSHEETPAGE)lParam)->lParam;
599 if (pGlobalData == NULL)
600 return FALSE;
601
602 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
603
604 CheckDlgButton(hwndDlg,
605 IDC_STICKY_BOX,
606 pGlobalData->stickyKeys.dwFlags & SKF_STICKYKEYSON ? BST_CHECKED : BST_UNCHECKED);
607
608 CheckDlgButton(hwndDlg,
609 IDC_FILTER_BOX,
610 pGlobalData->filterKeys.dwFlags & FKF_FILTERKEYSON ? BST_CHECKED : BST_UNCHECKED);
611
612 CheckDlgButton(hwndDlg,
613 IDC_TOGGLE_BOX,
614 pGlobalData->toggleKeys.dwFlags & TKF_TOGGLEKEYSON ? BST_CHECKED : BST_UNCHECKED);
615
616 CheckDlgButton(hwndDlg,
617 IDC_KEYBOARD_EXTRA,
618 pGlobalData->bKeyboardPref ? BST_CHECKED : BST_UNCHECKED);
619 return TRUE;
620
621 case WM_COMMAND:
622 switch (LOWORD(wParam))
623 {
624 case IDC_STICKY_BOX:
625 pGlobalData->stickyKeys.dwFlags ^= SKF_STICKYKEYSON;
626 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
627 break;
628
629 case IDC_STICKY_BUTTON:
630 if (DialogBoxParam(hApplet,
631 MAKEINTRESOURCE(IDD_STICKYKEYSOPTIONS),
632 hwndDlg,
633 (DLGPROC)StickyKeysDlgProc,
634 (LPARAM)pGlobalData))
635 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
636 break;
637
638 case IDC_FILTER_BOX:
639 pGlobalData->filterKeys.dwFlags ^= FKF_FILTERKEYSON;
640 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
641 break;
642
643 case IDC_FILTER_BUTTON:
644 if (DialogBoxParam(hApplet,
645 MAKEINTRESOURCE(IDD_FILTERKEYSOPTIONS),
646 hwndDlg,
647 (DLGPROC)FilterKeysDlgProc,
648 (LPARAM)pGlobalData))
649 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
650 break;
651
652 case IDC_TOGGLE_BOX:
653 pGlobalData->toggleKeys.dwFlags ^= TKF_TOGGLEKEYSON;
654 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
655 break;
656
657 case IDC_TOGGLE_BUTTON:
658 if (DialogBoxParam(hApplet,
659 MAKEINTRESOURCE(IDD_TOGGLEKEYSOPTIONS),
660 hwndDlg,
661 (DLGPROC)ToggleKeysDlgProc,
662 (LPARAM)pGlobalData))
663 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
664 break;
665
666 case IDC_KEYBOARD_EXTRA:
667 pGlobalData->bKeyboardPref = !pGlobalData->bKeyboardPref;
668 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
669 break;
670
671 default:
672 break;
673 }
674 break;
675
676 case WM_NOTIFY:
677 lppsn = (LPPSHNOTIFY)lParam;
678 if (lppsn->hdr.code == PSN_APPLY)
679 {
680 SystemParametersInfo(SPI_SETSTICKYKEYS,
681 sizeof(STICKYKEYS),
682 &pGlobalData->stickyKeys,
683 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
684
685 SystemParametersInfo(SPI_SETFILTERKEYS,
686 sizeof(FILTERKEYS),
687 &pGlobalData->filterKeys,
688 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
689
690 SystemParametersInfo(SPI_SETTOGGLEKEYS,
691 sizeof(TOGGLEKEYS),
692 &pGlobalData->toggleKeys,
693 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
694
695 SystemParametersInfo(SPI_SETKEYBOARDPREF,
696 pGlobalData->bKeyboardPref,
697 NULL,
698 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
699
700 return TRUE;
701 }
702 break;
703 }
704
705 return FALSE;
706 }