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