Sync with trunk r58033.
[reactos.git] / dll / cpl / access / display.c
1 /* $Id: display.c 29112 2007-09-19 21:31:49Z ekohl $
2 *
3 * PROJECT: ReactOS Accessibility Control Panel
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: dll/cpl/access/display.c
6 * PURPOSE: Display-related accessibility settings
7 * COPYRIGHT: Copyright 2004 Johannes Anderwald (j_anderw@sbox.tugraz.at)
8 * Copyright 2007 Eric Kohl
9 */
10
11 #include "access.h"
12
13
14 #define ID_BLINK_TIMER 346
15
16
17 static VOID
18 FillColorSchemeComboBox(HWND hwnd)
19 {
20 TCHAR szValue[128];
21 DWORD dwDisposition;
22 DWORD dwLength;
23 HKEY hKey;
24 LONG lError;
25 INT i;
26
27 lError = RegCreateKeyEx(HKEY_CURRENT_USER,
28 _T("Control Panel\\Appearance\\Schemes"),
29 0,
30 NULL,
31 REG_OPTION_NON_VOLATILE,
32 KEY_ENUMERATE_SUB_KEYS | KEY_EXECUTE | KEY_QUERY_VALUE,
33 NULL,
34 &hKey,
35 &dwDisposition);
36 if (lError != ERROR_SUCCESS)
37 return;
38
39 for (i = 0; ; i++)
40 {
41 dwLength = 128;
42 lError = RegEnumValue(hKey,
43 i,
44 szValue,
45 &dwLength, NULL, NULL, NULL, NULL);
46 if (lError == ERROR_NO_MORE_ITEMS)
47 break;
48
49 SendMessage(hwnd,
50 CB_ADDSTRING,
51 0,
52 (LPARAM)szValue);
53 }
54
55 RegCloseKey(hKey);
56 }
57
58
59 INT_PTR CALLBACK
60 HighContrastDlgProc(HWND hwndDlg,
61 UINT uMsg,
62 WPARAM wParam,
63 LPARAM lParam)
64 {
65 PGLOBAL_DATA pGlobalData;
66
67 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
68
69 switch (uMsg)
70 {
71 case WM_INITDIALOG:
72 pGlobalData = (PGLOBAL_DATA)lParam;
73 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
74
75 CheckDlgButton(hwndDlg,
76 IDC_CONTRAST_ACTIVATE_CHECK,
77 pGlobalData->highContrast.dwFlags & HCF_HOTKEYACTIVE ? BST_CHECKED : BST_UNCHECKED);
78
79 FillColorSchemeComboBox(GetDlgItem(hwndDlg, IDC_CONTRAST_COMBO));
80
81 SendDlgItemMessage(hwndDlg,
82 IDC_CONTRAST_COMBO,
83 CB_SELECTSTRING,
84 (WPARAM)-1,
85 (LPARAM)pGlobalData->highContrast.lpszDefaultScheme);
86 break;
87
88 case WM_COMMAND:
89 switch (LOWORD(wParam))
90 {
91 case IDC_CONTRAST_ACTIVATE_CHECK:
92 pGlobalData->highContrast.dwFlags ^= HCF_HOTKEYACTIVE;
93 break;
94
95 case IDC_CONTRAST_COMBO:
96 if (HIWORD(wParam) == CBN_SELCHANGE)
97 {
98 INT nSel;
99
100 nSel = SendDlgItemMessage(hwndDlg, IDC_CONTRAST_COMBO,
101 CB_GETCURSEL, 0, 0);
102 SendDlgItemMessage(hwndDlg, IDC_CONTRAST_COMBO,
103 CB_GETLBTEXT, nSel,
104 (LPARAM)pGlobalData->highContrast.lpszDefaultScheme);
105 }
106 break;
107
108 case IDOK:
109 EndDialog(hwndDlg, TRUE);
110 break;
111
112 case IDCANCEL:
113 EndDialog(hwndDlg, FALSE);
114 break;
115
116 default:
117 break;
118 }
119 break;
120 }
121
122 return FALSE;
123 }
124
125
126 /* Property page dialog callback */
127 INT_PTR CALLBACK
128 DisplayPageProc(HWND hwndDlg,
129 UINT uMsg,
130 WPARAM wParam,
131 LPARAM lParam)
132 {
133 PGLOBAL_DATA pGlobalData;
134 LPPSHNOTIFY lppsn;
135 INT i;
136
137 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
138
139 switch (uMsg)
140 {
141 case WM_INITDIALOG:
142 pGlobalData = (PGLOBAL_DATA)((LPPROPSHEETPAGE)lParam)->lParam;
143 if (pGlobalData == NULL)
144 return FALSE;
145
146 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
147
148 pGlobalData->fShowCaret = TRUE;
149 GetWindowRect(GetDlgItem(hwndDlg, IDC_CURSOR_WIDTH_TEXT), &pGlobalData->rcCaret);
150 ScreenToClient(hwndDlg, (LPPOINT)&pGlobalData->rcCaret.left);
151 ScreenToClient(hwndDlg, (LPPOINT)&pGlobalData->rcCaret.right);
152 CopyRect(&pGlobalData->rcOldCaret, &pGlobalData->rcCaret);
153
154 pGlobalData->rcCaret.right = pGlobalData->rcCaret.left + pGlobalData->uCaretWidth;
155
156 /* Set the checkbox */
157 CheckDlgButton(hwndDlg,
158 IDC_CONTRAST_BOX,
159 pGlobalData->highContrast.dwFlags & HCF_HIGHCONTRASTON ? BST_CHECKED : BST_UNCHECKED);
160
161 SendDlgItemMessage(hwndDlg, IDC_CURSOR_BLINK_TRACK, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, 10));
162 SendDlgItemMessage(hwndDlg, IDC_CURSOR_BLINK_TRACK, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(12 - (pGlobalData->uCaretBlinkTime / 100)));
163
164 SendDlgItemMessage(hwndDlg, IDC_CURSOR_WIDTH_TRACK, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, 19));
165 SendDlgItemMessage(hwndDlg, IDC_CURSOR_WIDTH_TRACK, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(pGlobalData->uCaretWidth - 1));
166
167 /* Start the blink timer */
168 SetTimer(hwndDlg, ID_BLINK_TIMER, pGlobalData->uCaretBlinkTime, NULL);
169 return TRUE;
170
171 case WM_COMMAND:
172 switch (LOWORD(wParam))
173 {
174 case IDC_CONTRAST_BOX:
175 pGlobalData->highContrast.dwFlags ^= HCF_HIGHCONTRASTON;
176 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
177 break;
178
179 case IDC_CONTRAST_BUTTON:
180 if (DialogBoxParam(hApplet,
181 MAKEINTRESOURCE(IDD_CONTRASTOPTIONS),
182 hwndDlg,
183 (DLGPROC)HighContrastDlgProc,
184 (LPARAM)pGlobalData))
185 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
186 break;
187
188 default:
189 break;
190 }
191 break;
192
193 case WM_HSCROLL:
194 switch (GetWindowLongPtr((HWND) lParam, GWL_ID))
195 {
196 case IDC_CURSOR_BLINK_TRACK:
197 i = SendDlgItemMessage(hwndDlg, IDC_CURSOR_BLINK_TRACK, TBM_GETPOS, 0, 0);
198 pGlobalData->uCaretBlinkTime = (12 - (UINT)i) * 100;
199 KillTimer(hwndDlg, ID_BLINK_TIMER);
200 SetTimer(hwndDlg, ID_BLINK_TIMER, pGlobalData->uCaretBlinkTime, NULL);
201 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
202 break;
203
204 case IDC_CURSOR_WIDTH_TRACK:
205 i = SendDlgItemMessage(hwndDlg, IDC_CURSOR_WIDTH_TRACK, TBM_GETPOS, 0, 0);
206 pGlobalData->uCaretWidth = (UINT)i + 1;
207 pGlobalData->rcCaret.right = pGlobalData->rcCaret.left + pGlobalData->uCaretWidth;
208 if (pGlobalData->fShowCaret)
209 {
210 HDC hDC = GetDC(hwndDlg);
211 HBRUSH hBrush = GetSysColorBrush(COLOR_BTNTEXT);
212 FillRect(hDC, &pGlobalData->rcCaret, hBrush);
213 DeleteObject(hBrush);
214 ReleaseDC(hwndDlg, hDC);
215 }
216 else
217 {
218 InvalidateRect(hwndDlg, &pGlobalData->rcOldCaret, TRUE);
219 }
220 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
221 break;
222 }
223 break;
224
225 case WM_TIMER:
226 if (wParam == ID_BLINK_TIMER)
227 {
228 if (pGlobalData->fShowCaret)
229 {
230 HDC hDC = GetDC(hwndDlg);
231 HBRUSH hBrush = GetSysColorBrush(COLOR_BTNTEXT);
232 FillRect(hDC, &pGlobalData->rcCaret, hBrush);
233 DeleteObject(hBrush);
234 ReleaseDC(hwndDlg, hDC);
235 }
236 else
237 {
238 InvalidateRect(hwndDlg, &pGlobalData->rcOldCaret, TRUE);
239 }
240
241 pGlobalData->fShowCaret = !pGlobalData->fShowCaret;
242 }
243 break;
244
245 case WM_NOTIFY:
246 lppsn = (LPPSHNOTIFY)lParam;
247 if (lppsn->hdr.code == PSN_APPLY)
248 {
249 SetCaretBlinkTime(pGlobalData->uCaretBlinkTime);
250 SystemParametersInfo(SPI_SETCARETWIDTH,
251 0,
252 IntToPtr(pGlobalData->uCaretWidth),
253 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
254 SystemParametersInfo(SPI_SETHIGHCONTRAST,
255 sizeof(HIGHCONTRAST),
256 &pGlobalData->highContrast,
257 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
258 return TRUE;
259 }
260 break;
261
262 case WM_DESTROY:
263 KillTimer(hwndDlg, ID_BLINK_TIMER);
264 break;
265 }
266
267 return FALSE;
268 }