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