... And the last things I forgot....
[reactos.git] / reactos / dll / cpl / access / access.c
1 /* $Id: access.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/access.c
6 * PURPOSE: Main control panel code
7 * COPYRIGHT: Copyright 2004 Johannes Anderwald (j_anderw@sbox.tugraz.at)
8 * Copyright 2007 Eric Kohl
9 */
10
11 #include <windows.h>
12 #include <commctrl.h>
13 #include <cpl.h>
14 #include <stdlib.h>
15 #include <tchar.h>
16 #include "resource.h"
17 #include "access.h"
18
19 #define NUM_APPLETS (1)
20
21 LONG CALLBACK SystemApplet(VOID);
22 HINSTANCE hApplet = 0;
23
24 /* Applets */
25 APPLET Applets[NUM_APPLETS] =
26 {
27 {IDI_CPLACCESS, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
28 };
29
30
31 static BOOL
32 ReadSettings(PGLOBAL_DATA pGlobalData)
33 {
34 DWORD dwDisposition;
35 DWORD dwLength;
36 HKEY hKey;
37 LONG lError;
38
39 /* Get sticky keys information */
40 pGlobalData->stickyKeys.cbSize = sizeof(STICKYKEYS);
41 if (!SystemParametersInfo(SPI_GETSTICKYKEYS,
42 sizeof(STICKYKEYS),
43 &pGlobalData->stickyKeys,
44 0))
45 return FALSE;
46
47 /* Get filter keys information */
48 pGlobalData->filterKeys.cbSize = sizeof(FILTERKEYS);
49 if (!SystemParametersInfo(SPI_GETFILTERKEYS,
50 sizeof(FILTERKEYS),
51 &pGlobalData->filterKeys,
52 0))
53 return FALSE;
54
55 /* Get toggle keys information */
56 pGlobalData->toggleKeys.cbSize = sizeof(TOGGLEKEYS);
57 if (!SystemParametersInfo(SPI_GETTOGGLEKEYS,
58 sizeof(TOGGLEKEYS),
59 &pGlobalData->toggleKeys,
60 0))
61 return FALSE;
62
63 /* Get keyboard preference information */
64 if (!SystemParametersInfo(SPI_GETKEYBOARDPREF,
65 0,
66 &pGlobalData->bKeyboardPref,
67 0))
68 return FALSE;
69
70 /* Get high contrast information */
71 pGlobalData->highContrast.cbSize = sizeof(HIGHCONTRAST);
72 SystemParametersInfo(SPI_GETHIGHCONTRAST,
73 sizeof(HIGHCONTRAST),
74 &pGlobalData->highContrast,
75 0);
76
77 SystemParametersInfo(SPI_GETCARETWIDTH,
78 0,
79 &pGlobalData->uCaretWidth,
80 0);
81
82 pGlobalData->uCaretBlinkTime = GetCaretBlinkTime();
83
84 /* get sound settings */
85 pGlobalData->ssSoundSentry.cbSize = sizeof(SOUNDSENTRY);
86 SystemParametersInfo(SPI_GETSOUNDSENTRY,
87 sizeof(SOUNDSENTRY),
88 &pGlobalData->ssSoundSentry,
89 0);
90
91 SystemParametersInfo(SPI_GETSHOWSOUNDS,
92 0,
93 &pGlobalData->bShowSounds,
94 0);
95
96 /* Get mouse keys information */
97 pGlobalData->mouseKeys.cbSize = sizeof(MOUSEKEYS);
98 SystemParametersInfo(SPI_GETMOUSEKEYS,
99 sizeof(MOUSEKEYS),
100 &pGlobalData->mouseKeys,
101 0);
102
103 /* Get access timeout information */
104 pGlobalData->accessTimeout.cbSize = sizeof(ACCESSTIMEOUT);
105 SystemParametersInfo(SPI_GETACCESSTIMEOUT,
106 sizeof(ACCESSTIMEOUT),
107 &pGlobalData->accessTimeout,
108 0);
109
110 /* Get serial keys information */
111 pGlobalData->serialKeys.cbSize = sizeof(SERIALKEYS);
112 pGlobalData->serialKeys.lpszActivePort = pGlobalData->szActivePort;
113 pGlobalData->serialKeys.lpszPort = pGlobalData->szPort;
114 SystemParametersInfo(SPI_GETSERIALKEYS,
115 sizeof(SERIALKEYS),
116 &pGlobalData->serialKeys,
117 0);
118
119 pGlobalData->bWarningSounds = TRUE;
120 pGlobalData->bSoundOnActivation = TRUE;
121
122 lError = RegCreateKeyEx(HKEY_CURRENT_USER,
123 _T("Control Panel\\Accessibility"),
124 0,
125 NULL,
126 REG_OPTION_NON_VOLATILE,
127 KEY_EXECUTE | KEY_QUERY_VALUE,
128 NULL,
129 &hKey,
130 &dwDisposition);
131 if (lError != ERROR_SUCCESS)
132 return TRUE;
133
134 dwLength = sizeof(BOOL);
135 lError = RegQueryValueEx(hKey,
136 _T("Warning Sounds"),
137 NULL,
138 NULL,
139 (LPBYTE)&pGlobalData->bWarningSounds,
140 &dwLength);
141 if (lError != ERROR_SUCCESS)
142 pGlobalData->bWarningSounds = TRUE;
143
144 dwLength = sizeof(BOOL);
145 lError = RegQueryValueEx(hKey,
146 _T("Sound On Activation"),
147 NULL,
148 NULL,
149 (LPBYTE)&pGlobalData->bSoundOnActivation,
150 &dwLength);
151 if (lError != ERROR_SUCCESS)
152 pGlobalData->bSoundOnActivation = TRUE;
153
154 RegCloseKey(hKey);
155
156 return TRUE;
157 }
158
159
160 static VOID
161 InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, PGLOBAL_DATA pGlobalData)
162 {
163 ZeroMemory(psp, sizeof(PROPSHEETPAGE));
164 psp->dwSize = sizeof(PROPSHEETPAGE);
165 psp->dwFlags = PSP_DEFAULT;
166 psp->hInstance = hApplet;
167 psp->pszTemplate = MAKEINTRESOURCE(idDlg);
168 psp->pfnDlgProc = DlgProc;
169 psp->lParam = (LPARAM)pGlobalData;
170 }
171
172
173 /* First Applet */
174
175 LONG CALLBACK
176 SystemApplet(VOID)
177 {
178 PGLOBAL_DATA pGlobalData;
179 PROPSHEETPAGE psp[5];
180 PROPSHEETHEADER psh;
181 TCHAR Caption[1024];
182 INT ret;
183
184 LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
185
186 pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
187 if (pGlobalData == NULL)
188 return 0;
189
190 if (!ReadSettings(pGlobalData))
191 return 0;
192
193 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
194 psh.dwSize = sizeof(PROPSHEETHEADER);
195 psh.dwFlags = PSH_PROPSHEETPAGE;
196 psh.hwndParent = NULL;
197 psh.hInstance = hApplet;
198 psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLACCESS));
199 psh.pszCaption = Caption;
200 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
201 psh.nStartPage = 0;
202 psh.ppsp = psp;
203
204 InitPropSheetPage(&psp[0], IDD_PROPPAGEKEYBOARD, (DLGPROC)KeyboardPageProc, pGlobalData);
205 InitPropSheetPage(&psp[1], IDD_PROPPAGESOUND, (DLGPROC)SoundPageProc, pGlobalData);
206 InitPropSheetPage(&psp[2], IDD_PROPPAGEDISPLAY, (DLGPROC)DisplayPageProc, pGlobalData);
207 InitPropSheetPage(&psp[3], IDD_PROPPAGEMOUSE, (DLGPROC)MousePageProc, pGlobalData);
208 InitPropSheetPage(&psp[4], IDD_PROPPAGEGENERAL, (DLGPROC)GeneralPageProc, pGlobalData);
209
210 ret = PropertySheet(&psh);
211
212 HeapFree(GetProcessHeap(), 0, pGlobalData);
213
214 return (LONG)(ret != -1);
215 }
216
217 /* Control Panel Callback */
218 LONG CALLBACK
219 CPlApplet(HWND hwndCPl,
220 UINT uMsg,
221 LPARAM lParam1,
222 LPARAM lParam2)
223 {
224 INT i = (INT)lParam1;
225
226 UNREFERENCED_PARAMETER(hwndCPl);
227
228 switch (uMsg)
229 {
230 case CPL_INIT:
231 return TRUE;
232
233 case CPL_GETCOUNT:
234 return NUM_APPLETS;
235
236 case CPL_INQUIRE:
237 {
238 CPLINFO *CPlInfo = (CPLINFO*)lParam2;
239 CPlInfo->lData = 0;
240 CPlInfo->idIcon = Applets[i].idIcon;
241 CPlInfo->idName = Applets[i].idName;
242 CPlInfo->idInfo = Applets[i].idDescription;
243 }
244 break;
245
246 case CPL_DBLCLK:
247 Applets[i].AppletProc();
248 break;
249 }
250
251 return FALSE;
252 }
253
254
255 BOOL STDCALL
256 DllMain(HINSTANCE hinstDLL,
257 DWORD dwReason,
258 LPVOID lpvReserved)
259 {
260 UNREFERENCED_PARAMETER(lpvReserved);
261
262 switch (dwReason)
263 {
264 case DLL_PROCESS_ATTACH:
265 case DLL_THREAD_ATTACH:
266 hApplet = hinstDLL;
267 break;
268 }
269
270 return TRUE;
271 }
272