/* * 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 #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; } 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(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_USEICONID | PSH_USECALLBACK; psh.hwndParent = hCPLWindow; psh.hInstance = hApplet; psh.pszIcon = MAKEINTRESOURCEW(IDI_CPLACCESS); psh.pszCaption = Caption; 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); 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; }