mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
e5ebbc8afa
- Check the boundary (i < NUM_APPLETS) of the variable i in CPlApplet functions. - Use UINT type for the variable i.
302 lines
8.8 KiB
C
302 lines
8.8 KiB
C
/*
|
|
* PROJECT: ReactOS Accessibility Control Panel
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: dll/cpl/access/access.c
|
|
* PURPOSE: Main control panel code
|
|
* COPYRIGHT: Copyright 2004 Johannes Anderwald (johannes.anderwald@reactos.org)
|
|
* Copyright 2007 Eric Kohl
|
|
*/
|
|
|
|
#include "access.h"
|
|
|
|
#include <cpl.h>
|
|
|
|
#define NUM_APPLETS (1)
|
|
|
|
static LONG CALLBACK SystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam);
|
|
HINSTANCE hApplet = 0;
|
|
|
|
/* Applets */
|
|
APPLET Applets[NUM_APPLETS] =
|
|
{
|
|
{IDI_CPLACCESS, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
|
|
};
|
|
|
|
|
|
static BOOL
|
|
ReadSettings(PGLOBAL_DATA pGlobalData)
|
|
{
|
|
DWORD dwDisposition;
|
|
DWORD dwLength;
|
|
HKEY hKey;
|
|
LONG lError;
|
|
|
|
/* Get sticky keys information */
|
|
pGlobalData->stickyKeys.cbSize = sizeof(STICKYKEYS);
|
|
if (!SystemParametersInfo(SPI_GETSTICKYKEYS,
|
|
sizeof(STICKYKEYS),
|
|
&pGlobalData->stickyKeys,
|
|
0))
|
|
return FALSE;
|
|
|
|
/* Get filter keys information */
|
|
pGlobalData->filterKeys.cbSize = sizeof(FILTERKEYS);
|
|
if (!SystemParametersInfo(SPI_GETFILTERKEYS,
|
|
sizeof(FILTERKEYS),
|
|
&pGlobalData->filterKeys,
|
|
0))
|
|
return FALSE;
|
|
|
|
/* Get toggle keys information */
|
|
pGlobalData->toggleKeys.cbSize = sizeof(TOGGLEKEYS);
|
|
if (!SystemParametersInfo(SPI_GETTOGGLEKEYS,
|
|
sizeof(TOGGLEKEYS),
|
|
&pGlobalData->toggleKeys,
|
|
0))
|
|
return FALSE;
|
|
|
|
/* Get keyboard preference information */
|
|
if (!SystemParametersInfo(SPI_GETKEYBOARDPREF,
|
|
0,
|
|
&pGlobalData->bKeyboardPref,
|
|
0))
|
|
return FALSE;
|
|
|
|
/* Get high contrast information */
|
|
pGlobalData->highContrast.cbSize = sizeof(HIGHCONTRAST);
|
|
SystemParametersInfo(SPI_GETHIGHCONTRAST,
|
|
sizeof(HIGHCONTRAST),
|
|
&pGlobalData->highContrast,
|
|
0);
|
|
|
|
SystemParametersInfo(SPI_GETCARETWIDTH,
|
|
0,
|
|
&pGlobalData->uCaretWidth,
|
|
0);
|
|
|
|
pGlobalData->uCaretBlinkTime = GetCaretBlinkTime();
|
|
|
|
/* Get sound settings */
|
|
pGlobalData->ssSoundSentry.cbSize = sizeof(SOUNDSENTRY);
|
|
SystemParametersInfo(SPI_GETSOUNDSENTRY,
|
|
sizeof(SOUNDSENTRY),
|
|
&pGlobalData->ssSoundSentry,
|
|
0);
|
|
|
|
SystemParametersInfo(SPI_GETSHOWSOUNDS,
|
|
0,
|
|
&pGlobalData->bShowSounds,
|
|
0);
|
|
|
|
/* Get mouse keys information */
|
|
pGlobalData->mouseKeys.cbSize = sizeof(MOUSEKEYS);
|
|
SystemParametersInfo(SPI_GETMOUSEKEYS,
|
|
sizeof(MOUSEKEYS),
|
|
&pGlobalData->mouseKeys,
|
|
0);
|
|
|
|
/* Get access timeout information */
|
|
pGlobalData->accessTimeout.cbSize = sizeof(ACCESSTIMEOUT);
|
|
SystemParametersInfo(SPI_GETACCESSTIMEOUT,
|
|
sizeof(ACCESSTIMEOUT),
|
|
&pGlobalData->accessTimeout,
|
|
0);
|
|
|
|
/* Get serial keys information */
|
|
pGlobalData->serialKeys.cbSize = sizeof(SERIALKEYS);
|
|
pGlobalData->serialKeys.lpszActivePort = pGlobalData->szActivePort;
|
|
pGlobalData->serialKeys.lpszPort = pGlobalData->szPort;
|
|
SystemParametersInfo(SPI_GETSERIALKEYS,
|
|
sizeof(SERIALKEYS),
|
|
&pGlobalData->serialKeys,
|
|
0);
|
|
|
|
pGlobalData->bWarningSounds = TRUE;
|
|
pGlobalData->bSoundOnActivation = TRUE;
|
|
|
|
lError = RegCreateKeyEx(HKEY_CURRENT_USER,
|
|
_T("Control Panel\\Accessibility"),
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_EXECUTE | KEY_QUERY_VALUE,
|
|
NULL,
|
|
&hKey,
|
|
&dwDisposition);
|
|
if (lError != ERROR_SUCCESS)
|
|
return TRUE;
|
|
|
|
dwLength = sizeof(BOOL);
|
|
lError = RegQueryValueEx(hKey,
|
|
_T("Warning Sounds"),
|
|
NULL,
|
|
NULL,
|
|
(LPBYTE)&pGlobalData->bWarningSounds,
|
|
&dwLength);
|
|
if (lError != ERROR_SUCCESS)
|
|
pGlobalData->bWarningSounds = TRUE;
|
|
|
|
dwLength = sizeof(BOOL);
|
|
lError = RegQueryValueEx(hKey,
|
|
_T("Sound On Activation"),
|
|
NULL,
|
|
NULL,
|
|
(LPBYTE)&pGlobalData->bSoundOnActivation,
|
|
&dwLength);
|
|
if (lError != ERROR_SUCCESS)
|
|
pGlobalData->bSoundOnActivation = TRUE;
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static VOID
|
|
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, PGLOBAL_DATA pGlobalData)
|
|
{
|
|
ZeroMemory(psp, sizeof(PROPSHEETPAGE));
|
|
psp->dwSize = sizeof(PROPSHEETPAGE);
|
|
psp->dwFlags = PSP_DEFAULT;
|
|
psp->hInstance = hApplet;
|
|
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
|
|
psp->pfnDlgProc = DlgProc;
|
|
psp->lParam = (LPARAM)pGlobalData;
|
|
}
|
|
|
|
static int CALLBACK
|
|
PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
|
|
{
|
|
// NOTE: This callback is needed to set large icon correctly.
|
|
HICON hIcon;
|
|
switch (uMsg)
|
|
{
|
|
case PSCB_INITIALIZED:
|
|
{
|
|
hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLACCESS));
|
|
SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* First Applet */
|
|
|
|
LONG CALLBACK
|
|
SystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
|
|
{
|
|
PGLOBAL_DATA pGlobalData;
|
|
PROPSHEETPAGE psp[5];
|
|
PROPSHEETHEADER psh;
|
|
INT nPage = 0;
|
|
INT ret;
|
|
|
|
if (uMsg == CPL_STARTWPARMSW && lParam != 0)
|
|
nPage = _wtoi((PWSTR)lParam);
|
|
|
|
pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
|
|
if (pGlobalData == NULL)
|
|
return 0;
|
|
|
|
if (!ReadSettings(pGlobalData))
|
|
{
|
|
HeapFree(GetProcessHeap(), 0, pGlobalData);
|
|
return 0;
|
|
}
|
|
|
|
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
|
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
|
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK;
|
|
psh.hwndParent = hwnd;
|
|
psh.hInstance = hApplet;
|
|
psh.pszIcon = MAKEINTRESOURCEW(IDI_CPLACCESS);
|
|
psh.pszCaption = MAKEINTRESOURCEW(IDS_CPLSYSTEMNAME);
|
|
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
|
psh.nStartPage = 0;
|
|
psh.ppsp = psp;
|
|
psh.pfnCallback = PropSheetProc;
|
|
|
|
InitPropSheetPage(&psp[0], IDD_PROPPAGEKEYBOARD, KeyboardPageProc, pGlobalData);
|
|
InitPropSheetPage(&psp[1], IDD_PROPPAGESOUND, SoundPageProc, pGlobalData);
|
|
InitPropSheetPage(&psp[2], IDD_PROPPAGEDISPLAY, DisplayPageProc, pGlobalData);
|
|
InitPropSheetPage(&psp[3], IDD_PROPPAGEMOUSE, MousePageProc, pGlobalData);
|
|
InitPropSheetPage(&psp[4], IDD_PROPPAGEGENERAL, GeneralPageProc, pGlobalData);
|
|
|
|
if (nPage != 0 && nPage <= psh.nPages)
|
|
psh.nStartPage = nPage;
|
|
|
|
ret = PropertySheet(&psh);
|
|
|
|
HeapFree(GetProcessHeap(), 0, pGlobalData);
|
|
|
|
return (LONG)(ret != -1);
|
|
}
|
|
|
|
/* Control Panel Callback */
|
|
LONG CALLBACK
|
|
CPlApplet(HWND hwndCPl,
|
|
UINT uMsg,
|
|
LPARAM lParam1,
|
|
LPARAM lParam2)
|
|
{
|
|
UINT i = (UINT)lParam1;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case CPL_INIT:
|
|
return TRUE;
|
|
|
|
case CPL_GETCOUNT:
|
|
return NUM_APPLETS;
|
|
|
|
case CPL_INQUIRE:
|
|
if (i < NUM_APPLETS)
|
|
{
|
|
CPLINFO *CPlInfo = (CPLINFO*)lParam2;
|
|
CPlInfo->lData = 0;
|
|
CPlInfo->idIcon = Applets[i].idIcon;
|
|
CPlInfo->idName = Applets[i].idName;
|
|
CPlInfo->idInfo = Applets[i].idDescription;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case CPL_DBLCLK:
|
|
if (i < NUM_APPLETS)
|
|
Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
|
|
else
|
|
return TRUE;
|
|
break;
|
|
|
|
case CPL_STARTWPARMSW:
|
|
if (i < NUM_APPLETS)
|
|
return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL WINAPI
|
|
DllMain(HINSTANCE hinstDLL,
|
|
DWORD dwReason,
|
|
LPVOID lpvReserved)
|
|
{
|
|
UNREFERENCED_PARAMETER(lpvReserved);
|
|
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
case DLL_THREAD_ATTACH:
|
|
hApplet = hinstDLL;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|