reactos/dll/cpl/console/console.c
Amine Khaldi c424146e2c Create a branch for cmake bringup.
svn path=/branches/cmake-bringup/; revision=48236
2010-07-24 18:52:44 +00:00

309 lines
7.4 KiB
C

/*
* PROJECT: ReactOS Console Configuration DLL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/win32/console/console.c
* PURPOSE: initialization of DLL
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald@student.tugraz.at)
*/
#include "console.h"
#define NUM_APPLETS (1)
#define WM_SETCONSOLE (WM_USER+10)
LONG APIENTRY InitApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK OptionsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK FontProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK LayoutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK ColorsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
HINSTANCE hApplet = 0;
/* Applets */
APPLET Applets[NUM_APPLETS] =
{
{IDC_CPLICON, IDS_CPLNAME, IDS_CPLDESCRIPTION, InitApplet}
};
static COLORREF s_Colors[] =
{
RGB(0, 0, 0),
RGB(0, 0, 128),
RGB(0, 128, 0),
RGB(0, 128, 128),
RGB(128, 0, 0),
RGB(128, 0, 128),
RGB(128, 128, 0),
RGB(192, 192, 192),
RGB(128, 128, 128),
RGB(0, 0, 255),
RGB(0, 255, 0),
RGB(0, 255, 255),
RGB(255, 0, 0),
RGB(255, 0, 255),
RGB(255, 255, 0),
RGB(255, 255, 255)
};
static void
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LPARAM lParam)
{
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;
}
PConsoleInfo
AllocConsoleInfo()
{
PConsoleInfo pConInfo;
pConInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ConsoleInfo));
return pConInfo;
}
void
InitConsoleDefaults(PConsoleInfo pConInfo)
{
/* initialize struct */
pConInfo->InsertMode = TRUE;
pConInfo->HistoryBufferSize = 50;
pConInfo->NumberOfHistoryBuffers = 5;
pConInfo->ScreenText = RGB(192, 192, 192);
pConInfo->ScreenBackground = RGB(0, 0, 0);
pConInfo->PopupText = RGB(128, 0, 128);
pConInfo->PopupBackground = RGB(255, 255, 255);
pConInfo->WindowSize = (DWORD)MAKELONG(80, 25);
pConInfo->WindowPosition = UINT_MAX;
pConInfo->ScreenBuffer = MAKELONG(80, 300);
pConInfo->UseRasterFonts = TRUE;
pConInfo->FontSize = (DWORD)MAKELONG(8, 12);
pConInfo->FontWeight = FW_NORMAL;
memcpy(pConInfo->Colors, s_Colors, sizeof(s_Colors));
}
INT_PTR
CALLBACK
ApplyProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hDlgCtrl;
UNREFERENCED_PARAMETER(lParam);
switch(uMsg)
{
case WM_INITDIALOG:
{
hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_APPLY_CURRENT);
SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0);
return TRUE;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK)
{
hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_APPLY_CURRENT);
if ( SendMessage(hDlgCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED )
EndDialog(hwndDlg, IDC_RADIO_APPLY_CURRENT);
else
EndDialog(hwndDlg, IDC_RADIO_APPLY_ALL);
}
else if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hwndDlg, IDCANCEL);
}
break;
}
default:
break;
}
return FALSE;
}
void
ApplyConsoleInfo(HWND hwndDlg, PConsoleInfo pConInfo)
{
INT_PTR res = 0;
res = DialogBox(hApplet, MAKEINTRESOURCE(IDD_APPLYOPTIONS), hwndDlg, ApplyProc);
if (res == IDCANCEL)
{
/* dont destroy when user presses cancel */
SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
}
else if ( res == IDC_RADIO_APPLY_ALL )
{
pConInfo->AppliedConfig = TRUE;
SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
SendMessage(pConInfo->hConsoleWindow, PM_APPLY_CONSOLE_INFO, (WPARAM)pConInfo, (LPARAM)TRUE);
}
else if ( res == IDC_RADIO_APPLY_CURRENT )
{
pConInfo->AppliedConfig = TRUE;
SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
SendMessage(pConInfo->hConsoleWindow, PM_APPLY_CONSOLE_INFO, (WPARAM)pConInfo, (LPARAM)TRUE);
}
}
/* First Applet */
LONG APIENTRY
InitApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
{
PROPSHEETPAGE psp[4];
PROPSHEETHEADER psh;
INT i=0;
PConsoleInfo pConInfo;
WCHAR szTitle[100];
PConsoleInfo pSharedInfo = (PConsoleInfo)wParam;
UNREFERENCED_PARAMETER(uMsg);
/*
* console.dll shares information with win32csr with wParam, lParam
*
* wParam is a pointer to an ConsoleInfo struct
* lParam is a boolean parameter which specifies wheter defaults should be shown
*/
pConInfo = AllocConsoleInfo();
if (!pConInfo)
{
return 0;
}
if (lParam)
{
/* use defaults */
InitConsoleDefaults(pConInfo);
}
else
{
if (IsBadReadPtr((const void *)pSharedInfo, sizeof(ConsoleInfo)))
{
/* use defaults */
InitConsoleDefaults(pConInfo);
}
else
{
pConInfo->InsertMode = pSharedInfo->InsertMode;
pConInfo->HistoryBufferSize = pSharedInfo->HistoryBufferSize;
pConInfo->NumberOfHistoryBuffers = pSharedInfo->NumberOfHistoryBuffers;
pConInfo->ScreenText = pSharedInfo->ScreenText;
pConInfo->ScreenBackground = pSharedInfo->ScreenBackground;
pConInfo->PopupText = pSharedInfo->PopupText;
pConInfo->PopupBackground = pSharedInfo->PopupBackground;
pConInfo->WindowSize = pSharedInfo->WindowSize;
pConInfo->WindowPosition = pSharedInfo->WindowPosition;
pConInfo->ScreenBuffer = pSharedInfo->ScreenBuffer;
pConInfo->UseRasterFonts = pSharedInfo->UseRasterFonts;
pConInfo->FontSize = pSharedInfo->FontSize;
pConInfo->FontWeight = pSharedInfo->FontWeight;
memcpy(pConInfo->Colors, pSharedInfo->Colors, sizeof(s_Colors));
}
}
/* console window -> is notified on a property change event */
pConInfo->hConsoleWindow = hwnd;
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
if(_tcslen(pConInfo->szProcessName))
{
psh.dwFlags |= PSH_PROPTITLE;
psh.pszCaption = pConInfo->szProcessName;
}
else
{
if (!GetConsoleTitleW(szTitle, sizeof(szTitle)/sizeof(WCHAR)))
{
_tcscpy(szTitle, _T("cmd.exe"));
}
szTitle[(sizeof(szTitle)/sizeof(WCHAR))-1] = _T('\0');
psh.pszCaption = szTitle;
}
psh.hwndParent = hwnd;
psh.hInstance = hApplet;
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
psh.nPages = 4;
psh.nStartPage = 0;
psh.ppsp = psp;
InitPropSheetPage(&psp[i++], IDD_PROPPAGEOPTIONS, (DLGPROC) OptionsProc, (LPARAM)pConInfo);
InitPropSheetPage(&psp[i++], IDD_PROPPAGEFONT, (DLGPROC) FontProc, (LPARAM)pConInfo);
InitPropSheetPage(&psp[i++], IDD_PROPPAGELAYOUT, (DLGPROC) LayoutProc, (LPARAM)pConInfo);
InitPropSheetPage(&psp[i++], IDD_PROPPAGECOLORS, (DLGPROC) ColorsProc, (LPARAM)pConInfo);
return (PropertySheet(&psh) != -1);
}
/* Control Panel Callback */
LONG CALLBACK
CPlApplet(
HWND hwndCPl,
UINT uMsg,
LPARAM lParam1,
LPARAM lParam2)
{
switch(uMsg)
{
case CPL_INIT:
{
return TRUE;
}
case CPL_GETCOUNT:
{
return NUM_APPLETS;
}
case CPL_INQUIRE:
{
CPLINFO *CPlInfo = (CPLINFO*)lParam2;
CPlInfo->idIcon = Applets[0].idIcon;
CPlInfo->idName = Applets[0].idName;
CPlInfo->idInfo = Applets[0].idDescription;
break;
}
case CPL_DBLCLK:
{
InitApplet(hwndCPl, uMsg, lParam1, lParam2);
break;
}
}
return FALSE;
}
INT
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;
}