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