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