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