mirror of
https://github.com/reactos/reactos.git
synced 2024-11-18 13:01:40 +00:00
270 lines
7.8 KiB
C
270 lines
7.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)
|
|
|
|
LONG CALLBACK SystemApplet(VOID);
|
|
HINSTANCE hApplet = 0;
|
|
HWND hCPLWindow;
|
|
|
|
/* 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;
|
|
}
|
|
|
|
|
|
/* First Applet */
|
|
|
|
LONG CALLBACK
|
|
SystemApplet(VOID)
|
|
{
|
|
PGLOBAL_DATA pGlobalData;
|
|
PROPSHEETPAGE psp[5];
|
|
PROPSHEETHEADER psh;
|
|
TCHAR Caption[1024];
|
|
INT ret;
|
|
|
|
LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
|
|
|
|
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.hwndParent = hCPLWindow;
|
|
psh.hInstance = hApplet;
|
|
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLACCESS));
|
|
psh.pszCaption = Caption;
|
|
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
|
psh.nStartPage = 0;
|
|
psh.ppsp = psp;
|
|
|
|
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);
|
|
|
|
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)
|
|
{
|
|
INT i = (INT)lParam1;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case CPL_INIT:
|
|
return TRUE;
|
|
|
|
case CPL_GETCOUNT:
|
|
return NUM_APPLETS;
|
|
|
|
case CPL_INQUIRE:
|
|
{
|
|
CPLINFO *CPlInfo = (CPLINFO*)lParam2;
|
|
CPlInfo->lData = 0;
|
|
CPlInfo->idIcon = Applets[i].idIcon;
|
|
CPlInfo->idName = Applets[i].idName;
|
|
CPlInfo->idInfo = Applets[i].idDescription;
|
|
}
|
|
break;
|
|
|
|
case CPL_DBLCLK:
|
|
hCPLWindow = hwndCPl;
|
|
Applets[i].AppletProc();
|
|
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;
|
|
}
|
|
|