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