windows-nt/Source/XPSP1/NT/shell/osshell/control/console/console.c
2020-09-26 16:20:57 +08:00

1620 lines
46 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
menu.c
Abstract:
This file implements the system menu management.
Author:
Therese Stowell (thereses) Jan-24-1992 (swiped from Win3.1)
--*/
#include "precomp.h"
#pragma hdrstop
BOOL InEM_UNDO=FALSE;
BYTE ColorArray[4];
int Index;
BOOL gbSaveToRegistry;
BOOL gbWriteToConsole;
BOOL gbStartedFromLink;
LONG gcxScreen;
LONG gcyScreen;
UINT gnCurrentPage;
PCONSOLE_STATE_INFO gpStateInfo;
BOOL g_fAutoComplete;
BOOL g_fSaveAutoCompleteState;
/*
* Context Help Ids.
*/
CONST DWORD gaConsoleHelpIds[] =
{
IDD_WINDOWED, IDH_DOS_SCREEN_USAGE_WINDOW,
IDD_FULLSCREEN, IDH_DOS_SCREEN_USAGE_FULL,
IDD_DISPLAY_GROUPBOX, -1,
IDD_QUICKEDIT, IDH_CONSOLE_OPTIONS_QUICK_EDIT,
IDD_INSERT, IDH_CONSOLE_OPTIONS_INSERT,
IDD_CURSOR_SMALL, IDH_CONSOLE_OPTIONS_CURSOR,
IDD_CURSOR_MEDIUM, IDH_CONSOLE_OPTIONS_CURSOR,
IDD_CURSOR_LARGE, IDH_CONSOLE_OPTIONS_CURSOR,
IDD_HISTORY_SIZE, IDH_CONSOLE_OPTIONS_BUFF_SIZE,
IDD_HISTORY_SIZESCROLL, IDH_CONSOLE_OPTIONS_BUFF_SIZE,
IDD_HISTORY_NUM, IDH_CONSOLE_OPTIONS_BUFF_NUM,
IDD_HISTORY_NUMSCROLL, IDH_CONSOLE_OPTIONS_BUFF_NUM,
IDD_HISTORY_NODUP, IDH_CONSOLE_OPTIONS_DISCARD_DUPS,
#if defined(FE_SB)
IDD_LANGUAGELIST, IDH_CONSOLE_OPTIONS_LANGUAGE,
IDD_LANGUAGE, IDH_CONSOLE_OPTIONS_LANGUAGE,
#endif
IDD_STATIC, IDH_CONSOLE_FONT_FONT,
IDD_FACENAME, IDH_CONSOLE_FONT_FONT,
IDD_BOLDFONT, IDH_CONSOLE_FONT_BOLD_FONTS,
IDD_PREVIEWLABEL, IDH_DOS_FONT_WINDOW_PREVIEW,
IDD_PREVIEWWINDOW, IDH_DOS_FONT_WINDOW_PREVIEW,
IDD_GROUP, IDH_DOS_FONT_FONT_PREVIEW,
IDD_STATIC2, IDH_DOS_FONT_FONT_PREVIEW,
IDD_STATIC3, IDH_DOS_FONT_FONT_PREVIEW,
IDD_STATIC4, IDH_DOS_FONT_FONT_PREVIEW,
IDD_FONTWIDTH, IDH_DOS_FONT_FONT_PREVIEW,
IDD_FONTHEIGHT, IDH_DOS_FONT_FONT_PREVIEW,
IDD_FONTWINDOW, IDH_DOS_FONT_FONT_PREVIEW,
IDD_FONTSIZE, IDH_DOS_FONT_SIZE,
IDD_POINTSLIST, IDH_DOS_FONT_SIZE,
IDD_PIXELSLIST, IDH_DOS_FONT_SIZE,
IDD_SCRBUF_WIDTH, IDH_CONSOLE_SIZE_BUFF_WIDTH,
IDD_SCRBUF_WIDTHSCROLL, IDH_CONSOLE_SIZE_BUFF_WIDTH,
IDD_SCRBUF_HEIGHT, IDH_CONSOLE_SIZE_BUFF_HEIGHT,
IDD_SCRBUF_HEIGHTSCROLL, IDH_CONSOLE_SIZE_BUFF_HEIGHT,
IDD_WINDOW_WIDTH, IDH_CONSOLE_SIZE_WIN_WIDTH,
IDD_WINDOW_WIDTHSCROLL, IDH_CONSOLE_SIZE_WIN_WIDTH,
IDD_WINDOW_HEIGHT, IDH_CONSOLE_SIZE_WIN_HEIGHT,
IDD_WINDOW_HEIGHTSCROLL, IDH_CONSOLE_SIZE_WIN_HEIGHT,
IDD_WINDOW_POSX, IDH_CONSOLE_SIZE_POS_LEFT,
IDD_WINDOW_POSXSCROLL, IDH_CONSOLE_SIZE_POS_LEFT,
IDD_WINDOW_POSY, IDH_CONSOLE_SIZE_POS_TOP,
IDD_WINDOW_POSYSCROLL, IDH_CONSOLE_SIZE_POS_TOP,
IDD_AUTO_POSITION, IDH_CONSOLE_SIZE_LET_SYS,
IDD_COLOR_SCREEN_TEXT, IDH_CONSOLE_COLOR_SCR_TEXT,
IDD_COLOR_SCREEN_BKGND, IDH_CONSOLE_COLOR_SCR_BACK,
IDD_COLOR_POPUP_TEXT, IDH_CONSOLE_COLOR_POPUP_TEXT,
IDD_COLOR_POPUP_BKGND, IDH_CONSOLE_COLOR_POPUP_BACK,
IDD_COLOR_1, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_2, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_3, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_4, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_5, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_6, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_7, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_8, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_9, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_10, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_11, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_12, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_13, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_14, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_15, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_16, IDH_CONSOLE_COLOR_COLOR_BAR,
IDD_COLOR_SCREEN_COLORS, IDH_CONSOLE_COLOR_SCR_COLORS,
IDD_COLOR_POPUP_COLORS, IDH_CONSOLE_COLOR_WIN_COLORS,
IDD_COLOR_RED, IDH_CONSOLE_COLOR_RED,
IDD_COLOR_REDSCROLL, IDH_CONSOLE_COLOR_RED,
IDD_COLOR_GREEN, IDH_CONSOLE_COLOR_RED,
IDD_COLOR_GREENSCROLL, IDH_CONSOLE_COLOR_RED,
IDD_COLOR_BLUE, IDH_CONSOLE_COLOR_RED,
IDD_COLOR_BLUESCROLL, IDH_CONSOLE_COLOR_RED,
IDD_AUTOCOMPLETE, IDH_CONSOLE_OPTIONS_AUTOCOMPLETE,
0, 0
};
VOID
UpdateItem(
HWND hDlg,
UINT item,
UINT nNum
)
{
SetDlgItemInt(hDlg, item, nNum, TRUE);
SendDlgItemMessage(hDlg, item, EM_SETSEL, 0, (DWORD)-1);
}
BOOL
CheckNum(
HWND hDlg,
UINT Item)
{
int i;
TCHAR szNum[5];
BOOL fSigned;
if (Item == IDD_WINDOW_POSX || Item == IDD_WINDOW_POSY) {
fSigned = TRUE;
} else {
fSigned = FALSE;
}
GetDlgItemText(hDlg, Item, szNum, NELEM(szNum));
for (i = 0; szNum[i]; i++) {
if (!iswdigit(szNum[i]) && (!fSigned || i > 0 || szNum[i] != TEXT('-')))
return FALSE;
}
return TRUE;
}
INT_PTR
CommonDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (wMsg) {
case WM_HELP:
WinHelp(((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP, (ULONG_PTR)gaConsoleHelpIds);
break;
case WM_CONTEXTMENU:
WinHelp((HWND)wParam, NULL, HELP_CONTEXTMENU, (ULONG_PTR)gaConsoleHelpIds);
break;
default:
break;
}
return FALSE;
}
INT_PTR
WINAPI
SaveQueryDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HFONT hFont;
HWND hChild;
HWND hCreator;
switch (wMsg) {
case WM_INITDIALOG:
/*
* Save the handle of the window that created us
*/
hCreator = (HWND)lParam;
SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
/*
* Get the font used in other controls
*/
hChild = GetWindow(hCreator, GW_CHILD);
hFont = GetWindowFont(hChild);
/*
* Now apply it to our controls
*/
hChild = GetWindow(hDlg, GW_CHILD);
while (hChild != NULL) {
SetWindowFont(hChild, hFont, TRUE);
hChild = GetWindow(hChild, GW_HWNDNEXT);
}
CheckRadioButton(hDlg, IDD_APPLY, IDD_SAVE, IDD_APPLY);
gbSaveToRegistry = FALSE;
gbWriteToConsole = FALSE;
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
if (IsDlgButtonChecked(hDlg, IDD_SAVE)) {
gbSaveToRegistry = TRUE;
}
gbWriteToConsole = TRUE;
EndDialog(hDlg, PSNRET_NOERROR);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
break;
case WM_CTLCOLORMSGBOX:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
/*
* Let the window who created us decide what colors to use
*/
hCreator = (HWND)GetWindowLongPtr(hDlg, GWLP_USERDATA);
return SendMessage(hCreator, wMsg, wParam, lParam);
}
return FALSE;
}
UINT
ConsolePropSheetProc(
HWND hDlg,
UINT wMsg,
LPARAM lParam
)
{
DWORD dwExStyle;
switch (wMsg) {
case PSCB_INITIALIZED:
/*
* If we're connected to the server, tell him we're starting
*/
if (gpStateInfo->hWnd != NULL) {
SendMessage(gpStateInfo->hWnd, CM_PROPERTIES_START, (WPARAM)hDlg, 0);
}
break;
default:
break;
}
return 0;
}
VOID
EndDlgPage(
HWND hDlg
)
{
HWND hParent;
HWND hTabCtrl;
INT_PTR Result;
/*
* If we've already made a decision, we're done
*/
if (gbWriteToConsole || gbSaveToRegistry) {
SetDlgMsgResult(hDlg, PSN_APPLY, PSNRET_NOERROR);
return;
}
/*
* Get the current page number
*/
hParent = GetParent(hDlg);
hTabCtrl = PropSheet_GetTabControl(hParent);
gnCurrentPage = TabCtrl_GetCurSel(hTabCtrl);
/*
* If we're not connected to the server, we're done
*/
if (gpStateInfo->hWnd == NULL) {
gbSaveToRegistry = TRUE;
SetDlgMsgResult(hDlg, PSN_APPLY, PSNRET_NOERROR);
return;
}
/*
* Check to show the Apply/Save dialog box
*/
if (gbStartedFromLink)
{
Result = DialogBoxParam(ghInstance, MAKEINTRESOURCE(DID_SAVE_QUERY_LINK),
GetParent(hDlg), SaveQueryDlgProc, (LPARAM)hDlg);
SetDlgMsgResult(hDlg, PSN_APPLY, Result);
}
else
{
Result = DialogBoxParam(ghInstance, MAKEINTRESOURCE(DID_SAVE_QUERY),
GetParent(hDlg), SaveQueryDlgProc, (LPARAM)hDlg);
SetDlgMsgResult(hDlg, PSN_APPLY, Result);
}
return;
}
LRESULT
ColorControlProc(
HWND hColor,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Window proc for the color buttons
--*/
{
PAINTSTRUCT ps;
int ColorId;
RECT rColor;
RECT rTemp;
HBRUSH hbr;
HDC hdc;
HWND hWnd;
HWND hDlg;
COLORREF rgbBrush;
ColorId = GetWindowLong(hColor, GWL_ID);
hDlg = GetParent(hColor);
switch (wMsg) {
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTTAB;
break;
case WM_SETFOCUS:
if (ColorArray[Index] != (BYTE)(ColorId - IDD_COLOR_1)) {
hWnd = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
SetFocus(hWnd);
}
// Fall through
case WM_KILLFOCUS:
hdc = GetDC(hDlg);
hWnd = GetDlgItem(hDlg, IDD_COLOR_1);
GetWindowRect(hWnd, &rColor);
hWnd = GetDlgItem(hDlg, IDD_COLOR_16);
GetWindowRect(hWnd, &rTemp);
rColor.right = rTemp.right;
ScreenToClient(hDlg, (LPPOINT)&rColor.left);
ScreenToClient(hDlg, (LPPOINT)&rColor.right);
InflateRect(&rColor, 2, 2);
DrawFocusRect(hdc, &rColor);
ReleaseDC(hDlg, hdc);
break;
case WM_KEYDOWN:
switch (wParam) {
case VK_UP:
case VK_LEFT:
if (ColorId > IDD_COLOR_1) {
SendMessage(hDlg, CM_SETCOLOR,
ColorId - 1 - IDD_COLOR_1, (LPARAM)hColor);
}
break;
case VK_DOWN:
case VK_RIGHT:
if (ColorId < IDD_COLOR_16) {
SendMessage(hDlg, CM_SETCOLOR,
ColorId + 1 - IDD_COLOR_1, (LPARAM)hColor);
}
break;
case VK_TAB:
hWnd = GetDlgItem(hDlg, IDD_COLOR_1);
hWnd = GetNextDlgTabItem(hDlg, hWnd, GetKeyState(VK_SHIFT) < 0);
SetFocus(hWnd);
break;
default:
return DefWindowProc(hColor, wMsg, wParam, lParam);
}
break;
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
SendMessage(hDlg, CM_SETCOLOR,
ColorId - IDD_COLOR_1, (LPARAM)hColor);
break;
case WM_PAINT:
BeginPaint(hColor, &ps);
GetClientRect(hColor, &rColor);
rgbBrush = GetNearestColor(ps.hdc, AttrToRGB(ColorId-IDD_COLOR_1));
if ((hbr = CreateSolidBrush(rgbBrush)) != NULL) {
//
// are we the selected color for the current object?
//
if (ColorArray[Index] == (BYTE)(ColorId - IDD_COLOR_1)) {
//
// put current values in dialog box
//
UpdateItem(hDlg, IDD_COLOR_RED,
GetRValue(AttrToRGB(ColorArray[Index])));
UpdateItem(hDlg, IDD_COLOR_GREEN,
GetGValue(AttrToRGB(ColorArray[Index])));
UpdateItem(hDlg, IDD_COLOR_BLUE,
GetBValue(AttrToRGB(ColorArray[Index])));
//
// highlight the selected color
//
FrameRect(ps.hdc, &rColor, GetStockObject(BLACK_BRUSH));
InflateRect(&rColor, -1, -1);
FrameRect(ps.hdc, &rColor, GetStockObject(BLACK_BRUSH));
}
InflateRect(&rColor, -1, -1);
FillRect(ps.hdc, &rColor, hbr);
DeleteObject(hbr);
}
EndPaint(hColor, &ps);
break;
default:
return DefWindowProc(hColor, wMsg, wParam, lParam);
break;
}
return TRUE;
}
INT_PTR
WINAPI
ColorDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the color selection dialog box.
--*/
{
UINT Value;
UINT Red;
UINT Green;
UINT Blue;
UINT Item;
HWND hWnd;
HWND hWndOld;
BOOL bOK;
switch (wMsg) {
case WM_INITDIALOG:
ColorArray[IDD_COLOR_SCREEN_TEXT - IDD_COLOR_SCREEN_TEXT] =
LOBYTE(gpStateInfo->ScreenAttributes) & 0x0F;
ColorArray[IDD_COLOR_SCREEN_BKGND - IDD_COLOR_SCREEN_TEXT] =
LOBYTE(gpStateInfo->ScreenAttributes >> 4);
ColorArray[IDD_COLOR_POPUP_TEXT - IDD_COLOR_SCREEN_TEXT] =
LOBYTE(gpStateInfo->PopupAttributes) & 0x0F;
ColorArray[IDD_COLOR_POPUP_BKGND - IDD_COLOR_SCREEN_TEXT] =
LOBYTE(gpStateInfo->PopupAttributes >> 4);
CheckRadioButton(hDlg,IDD_COLOR_SCREEN_TEXT,IDD_COLOR_POPUP_BKGND,IDD_COLOR_SCREEN_BKGND);
Index = IDD_COLOR_SCREEN_BKGND - IDD_COLOR_SCREEN_TEXT;
// initialize size of edit controls
SendDlgItemMessage(hDlg, IDD_COLOR_RED, EM_LIMITTEXT, 3, 0L);
SendDlgItemMessage(hDlg, IDD_COLOR_GREEN, EM_LIMITTEXT, 3, 0L);
SendDlgItemMessage(hDlg, IDD_COLOR_BLUE, EM_LIMITTEXT, 3, 0L);
// initialize arrow controls
SendDlgItemMessage(hDlg, IDD_COLOR_REDSCROLL, UDM_SETRANGE, 0,
MAKELONG(255, 0));
SendDlgItemMessage(hDlg, IDD_COLOR_REDSCROLL, UDM_SETPOS, 0,
MAKELONG(GetRValue(AttrToRGB(ColorArray[Index])), 0));
SendDlgItemMessage(hDlg, IDD_COLOR_GREENSCROLL, UDM_SETRANGE, 0,
MAKELONG(255, 0));
SendDlgItemMessage(hDlg, IDD_COLOR_GREENSCROLL, UDM_SETPOS, 0,
MAKELONG(GetGValue(AttrToRGB(ColorArray[Index])), 0));
SendDlgItemMessage(hDlg, IDD_COLOR_BLUESCROLL, UDM_SETRANGE, 0,
MAKELONG(255, 0));
SendDlgItemMessage(hDlg, IDD_COLOR_BLUESCROLL, UDM_SETPOS, 0,
MAKELONG(GetBValue(AttrToRGB(ColorArray[Index])), 0));
return TRUE;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item) {
case IDD_COLOR_SCREEN_TEXT:
case IDD_COLOR_SCREEN_BKGND:
case IDD_COLOR_POPUP_TEXT:
case IDD_COLOR_POPUP_BKGND:
hWndOld = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
Index = Item - IDD_COLOR_SCREEN_TEXT;
// repaint new color
hWnd = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
InvalidateRect(hWnd, NULL, TRUE);
// repaint old color
if (hWndOld != hWnd) {
InvalidateRect(hWndOld, NULL, TRUE);
}
return TRUE;
case IDD_COLOR_RED:
case IDD_COLOR_GREEN:
case IDD_COLOR_BLUE:
switch (HIWORD(wParam)) {
case EN_UPDATE:
if (!CheckNum (hDlg, Item)) {
if (!InEM_UNDO) {
InEM_UNDO = TRUE;
SendMessage((HWND)lParam, EM_UNDO, 0, 0L);
InEM_UNDO = FALSE;
}
}
break;
case EN_KILLFOCUS:
/*
* Update the state info structure
*/
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
if (bOK) {
if (Value > 255) {
UpdateItem(hDlg, Item, 255);
Value = 255;
}
if (Item == IDD_COLOR_RED) {
Red = Value;
} else {
Red = GetRValue(AttrToRGB(ColorArray[Index]));
}
if (Item == IDD_COLOR_GREEN) {
Green = Value;
} else {
Green = GetGValue(AttrToRGB(ColorArray[Index]));
}
if (Item == IDD_COLOR_BLUE) {
Blue = Value;
} else {
Blue = GetBValue(AttrToRGB(ColorArray[Index]));
}
UpdateStateInfo(hDlg, ColorArray[Index] + IDD_COLOR_1,
RGB(Red, Green, Blue));
}
/*
* Update the preview windows with the new value
*/
hWnd = GetDlgItem(hDlg, IDD_COLOR_SCREEN_COLORS);
InvalidateRect(hWnd, NULL, FALSE);
hWnd = GetDlgItem(hDlg, IDD_COLOR_POPUP_COLORS);
InvalidateRect(hWnd, NULL, FALSE);
hWnd = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
InvalidateRect(hWnd, NULL, FALSE);
break;
}
return TRUE;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
EndDlgPage(hDlg);
return TRUE;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
if (Item = GetDlgCtrlID(GetFocus())) {
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
case WM_VSCROLL:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
Item = GetDlgCtrlID((HWND)lParam) - 1;
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
return TRUE;
case CM_SETCOLOR:
UpdateStateInfo(hDlg, Index + IDD_COLOR_SCREEN_TEXT, (UINT)wParam);
hWndOld = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
ColorArray[Index] = (BYTE)wParam;
/* Force the preview window to repaint */
if (Index < (IDD_COLOR_POPUP_TEXT - IDD_COLOR_SCREEN_TEXT)) {
hWnd = GetDlgItem(hDlg, IDD_COLOR_SCREEN_COLORS);
} else {
hWnd = GetDlgItem(hDlg, IDD_COLOR_POPUP_COLORS);
}
InvalidateRect(hWnd, NULL, TRUE);
// repaint new color
hWnd = GetDlgItem(hDlg, ColorArray[Index]+IDD_COLOR_1);
InvalidateRect(hWnd, NULL, TRUE);
SetFocus(hWnd);
// repaint old color
if (hWndOld != hWnd) {
InvalidateRect(hWndOld, NULL, TRUE);
}
return TRUE;
default:
break;
}
return CommonDlgProc(hDlg, wMsg, wParam, lParam);
}
int
GetStateInfo(
HWND hDlg,
UINT Item,
BOOL *bOK
)
{
int Value = 0;
*bOK = TRUE;
switch (Item) {
case IDD_SCRBUF_WIDTH:
Value = gpStateInfo->ScreenBufferSize.X;
break;
case IDD_SCRBUF_HEIGHT:
Value = gpStateInfo->ScreenBufferSize.Y;
break;
case IDD_WINDOW_WIDTH:
Value = gpStateInfo->WindowSize.X;
break;
case IDD_WINDOW_HEIGHT:
Value = gpStateInfo->WindowSize.Y;
break;
case IDD_WINDOW_POSX:
Value = gpStateInfo->WindowPosX;
break;
case IDD_WINDOW_POSY:
Value = gpStateInfo->WindowPosY;
break;
default:
*bOK = FALSE;
break;
}
return Value;
}
BOOL
UpdateStateInfo(
HWND hDlg,
UINT Item,
int Value
)
{
switch (Item) {
case IDD_SCRBUF_WIDTH:
gpStateInfo->ScreenBufferSize.X = (SHORT)Value;
if (gpStateInfo->WindowSize.X > Value) {
gpStateInfo->WindowSize.X = (SHORT)Value;
UpdateItem(hDlg, IDD_WINDOW_WIDTH, Value);
}
break;
case IDD_SCRBUF_HEIGHT:
gpStateInfo->ScreenBufferSize.Y = (SHORT)Value;
if (gpStateInfo->WindowSize.Y > Value) {
gpStateInfo->WindowSize.Y = (SHORT)Value;
UpdateItem(hDlg, IDD_WINDOW_HEIGHT, Value);
}
break;
case IDD_WINDOW_WIDTH:
gpStateInfo->WindowSize.X = (SHORT)Value;
if (gpStateInfo->ScreenBufferSize.X < Value) {
gpStateInfo->ScreenBufferSize.X = (SHORT)Value;
UpdateItem(hDlg, IDD_SCRBUF_WIDTH, Value);
}
break;
case IDD_WINDOW_HEIGHT:
gpStateInfo->WindowSize.Y = (SHORT)Value;
if (gpStateInfo->ScreenBufferSize.Y < Value) {
gpStateInfo->ScreenBufferSize.Y = (SHORT)Value;
UpdateItem(hDlg, IDD_SCRBUF_HEIGHT, Value);
}
break;
case IDD_WINDOW_POSX:
gpStateInfo->WindowPosX = Value;
break;
case IDD_WINDOW_POSY:
gpStateInfo->WindowPosY = Value;
break;
case IDD_AUTO_POSITION:
gpStateInfo->AutoPosition = Value;
break;
case IDD_COLOR_SCREEN_TEXT:
gpStateInfo->ScreenAttributes =
(gpStateInfo->ScreenAttributes & 0xF0) |
(Value & 0x0F);
break;
case IDD_COLOR_SCREEN_BKGND:
gpStateInfo->ScreenAttributes =
(gpStateInfo->ScreenAttributes & 0x0F) |
(Value << 4);
break;
case IDD_COLOR_POPUP_TEXT:
gpStateInfo->PopupAttributes =
(gpStateInfo->PopupAttributes & 0xF0) |
(Value & 0x0F);
break;
case IDD_COLOR_POPUP_BKGND:
gpStateInfo->PopupAttributes =
(gpStateInfo->PopupAttributes & 0x0F) |
(Value << 4);
break;
case IDD_COLOR_1:
case IDD_COLOR_2:
case IDD_COLOR_3:
case IDD_COLOR_4:
case IDD_COLOR_5:
case IDD_COLOR_6:
case IDD_COLOR_7:
case IDD_COLOR_8:
case IDD_COLOR_9:
case IDD_COLOR_10:
case IDD_COLOR_11:
case IDD_COLOR_12:
case IDD_COLOR_13:
case IDD_COLOR_14:
case IDD_COLOR_15:
case IDD_COLOR_16:
gpStateInfo->ColorTable[Item - IDD_COLOR_1] = Value;
break;
#ifdef i386
case IDD_FULLSCREEN:
gpStateInfo->FullScreen = TRUE;
break;
case IDD_WINDOWED:
gpStateInfo->FullScreen = FALSE;
break;
#endif
#if defined(FE_SB)
case IDD_LANGUAGELIST:
/*
* Value is a code page
*/
gpStateInfo->CodePage = Value;
break;
#endif
case IDD_QUICKEDIT:
gpStateInfo->QuickEdit = Value;
break;
case IDD_AUTOCOMPLETE:
g_fAutoComplete = Value;
g_fSaveAutoCompleteState = TRUE;
break;
case IDD_INSERT:
gpStateInfo->InsertMode = Value;
break;
case IDD_HISTORY_SIZE:
gpStateInfo->HistoryBufferSize = max(Value, 1);
break;
case IDD_HISTORY_NUM:
gpStateInfo->NumberOfHistoryBuffers = max(Value, 1);
break;
case IDD_HISTORY_NODUP:
gpStateInfo->HistoryNoDup = Value;
break;
case IDD_CURSOR_SMALL:
gpStateInfo->CursorSize = 25;
break;
case IDD_CURSOR_MEDIUM:
gpStateInfo->CursorSize = 50;
break;
case IDD_CURSOR_LARGE:
gpStateInfo->CursorSize = 100;
break;
default:
return FALSE;
}
return TRUE;
}
VOID
UpdateWarningMessage(
HWND hDlg,
BOOL fLoadString
)
{
static WCHAR achFormat[256];
WCHAR achText[NELEM(achFormat)+4];
HWND hWnd;
UINT Value;
/*
* Load the format string, if requested.
*/
if (fLoadString) {
LoadString(ghInstance, IDS_WARNING, achFormat, NELEM(achFormat));
}
/*
* Put up the warning message if we're using more than 1 Meg
* of memory per console window, otherwise hide it.
*/
hWnd = GetDlgItem(hDlg, IDD_WARNING);
Value = (gpStateInfo->ScreenBufferSize.X *
gpStateInfo->ScreenBufferSize.Y) / 0x080000;
if (Value) {
wsprintf(achText, achFormat, Value);
SetWindowText(hWnd, achText);
ShowWindow(hWnd, SW_SHOW);
} else {
ShowWindow(hWnd, SW_HIDE);
}
}
INT_PTR
WINAPI
ScreenSizeDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the screen size dialog box.
--*/
{
UINT Value;
UINT Item;
HWND hWnd;
BOOL bOK;
LONG xScreen;
LONG yScreen;
LONG cxScreen;
LONG cyScreen;
LONG cxFrame;
LONG cyFrame;
switch (wMsg) {
case WM_INITDIALOG:
// initialize size of edit controls
SendDlgItemMessage(hDlg, IDD_SCRBUF_WIDTH, EM_LIMITTEXT, 4, 0L);
SendDlgItemMessage(hDlg, IDD_SCRBUF_HEIGHT, EM_LIMITTEXT, 4, 0L);
SendDlgItemMessage(hDlg, IDD_WINDOW_WIDTH, EM_LIMITTEXT, 4, 0L);
SendDlgItemMessage(hDlg, IDD_WINDOW_HEIGHT, EM_LIMITTEXT, 4, 0L);
SendDlgItemMessage(hDlg, IDD_WINDOW_POSX, EM_LIMITTEXT, 4, 0L);
SendDlgItemMessage(hDlg, IDD_WINDOW_POSY, EM_LIMITTEXT, 4, 0L);
// Get some system parameters
xScreen = GetSystemMetrics(SM_XVIRTUALSCREEN);
yScreen = GetSystemMetrics(SM_YVIRTUALSCREEN);
cxScreen = GetSystemMetrics(SM_CXVIRTUALSCREEN);
cyScreen = GetSystemMetrics(SM_CYVIRTUALSCREEN);
cxFrame = GetSystemMetrics(SM_CXFRAME);
cyFrame = GetSystemMetrics(SM_CYFRAME);
// initialize arrow controls
SendDlgItemMessage(hDlg, IDD_SCRBUF_WIDTHSCROLL, UDM_SETRANGE, 0,
MAKELONG(9999, 1));
SendDlgItemMessage(hDlg, IDD_SCRBUF_WIDTHSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->ScreenBufferSize.X, 0));
SendDlgItemMessage(hDlg, IDD_SCRBUF_HEIGHTSCROLL, UDM_SETRANGE, 0,
MAKELONG(9999, 1));
SendDlgItemMessage(hDlg, IDD_SCRBUF_HEIGHTSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->ScreenBufferSize.Y, 0));
SendDlgItemMessage(hDlg, IDD_WINDOW_WIDTHSCROLL, UDM_SETRANGE, 0,
MAKELONG(9999, 1));
SendDlgItemMessage(hDlg, IDD_WINDOW_WIDTHSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->WindowSize.X, 0));
SendDlgItemMessage(hDlg, IDD_WINDOW_HEIGHTSCROLL, UDM_SETRANGE, 0,
MAKELONG(9999, 1));
SendDlgItemMessage(hDlg, IDD_WINDOW_HEIGHTSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->WindowSize.Y, 0));
SendDlgItemMessage(hDlg, IDD_WINDOW_POSXSCROLL, UDM_SETRANGE, 0,
MAKELONG(xScreen + cxScreen - cxFrame, xScreen - cxFrame));
SendDlgItemMessage(hDlg, IDD_WINDOW_POSXSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->WindowPosX, 0));
SendDlgItemMessage(hDlg, IDD_WINDOW_POSYSCROLL, UDM_SETRANGE, 0,
MAKELONG(yScreen + cyScreen - cyFrame, yScreen - cyFrame));
SendDlgItemMessage(hDlg, IDD_WINDOW_POSYSCROLL, UDM_SETPOS, 0,
MAKELONG(gpStateInfo->WindowPosY, 0));
//
// put current values in dialog box
//
CheckDlgButton(hDlg, IDD_AUTO_POSITION, gpStateInfo->AutoPosition);
SendMessage(hDlg, WM_COMMAND, IDD_AUTO_POSITION, 0);
// update the warning message
UpdateWarningMessage(hDlg, TRUE);
return TRUE;
case WM_VSCROLL:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
Item = GetDlgCtrlID((HWND)lParam) - 1;
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
return TRUE;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item) {
case IDD_SCRBUF_WIDTH:
case IDD_SCRBUF_HEIGHT:
case IDD_WINDOW_WIDTH:
case IDD_WINDOW_HEIGHT:
case IDD_WINDOW_POSX:
case IDD_WINDOW_POSY:
switch (HIWORD(wParam)) {
case EN_UPDATE:
if (!CheckNum (hDlg, Item)) {
if (!InEM_UNDO) {
InEM_UNDO = TRUE;
SendMessage((HWND)lParam, EM_UNDO, 0, 0L);
InEM_UNDO = FALSE;
}
}
break;
case EN_KILLFOCUS:
/*
* Update the state info structure
*/
Value = (UINT)SendDlgItemMessage(hDlg, Item + 1, UDM_GETPOS, 0, 0);
if (HIWORD(Value) == 0) {
UpdateStateInfo(hDlg, Item, (SHORT)LOWORD(Value));
} else {
Value = GetStateInfo(hDlg, Item, &bOK);
if (bOK) {
UpdateItem(hDlg, Item, Value);
}
}
/*
* Update the warning message
*/
UpdateWarningMessage(hDlg, FALSE);
/*
* Update the preview window with the new value
*/
hWnd = GetDlgItem(hDlg, IDD_PREVIEWWINDOW);
SendMessage(hWnd, CM_PREVIEW_UPDATE, 0, 0);
break;
}
return TRUE;
case IDD_AUTO_POSITION:
Value = IsDlgButtonChecked(hDlg, IDD_AUTO_POSITION);
UpdateStateInfo(hDlg, IDD_AUTO_POSITION, Value);
for (Item = IDD_WINDOW_POSX; Item < IDD_AUTO_POSITION; Item++) {
hWnd = GetDlgItem(hDlg, Item);
EnableWindow(hWnd, (Value == FALSE));
}
break;
default:
break;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
EndDlgPage(hDlg);
return TRUE;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
if (Item = GetDlgCtrlID(GetFocus())) {
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
default:
break;
}
return CommonDlgProc(hDlg, wMsg, wParam, lParam);
}
INT_PTR
WINAPI
SettingsDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the settings dialog box.
--*/
{
UINT Value;
UINT Item;
BOOL bOK;
SYSTEM_INFO SystemInfo;
switch (wMsg) {
case WM_INITDIALOG:
GetSystemInfo(&SystemInfo);
if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
if (gpStateInfo->FullScreen) {
CheckRadioButton(hDlg,IDD_WINDOWED,IDD_FULLSCREEN,IDD_FULLSCREEN);
} else {
CheckRadioButton(hDlg,IDD_WINDOWED,IDD_FULLSCREEN,IDD_WINDOWED);
}
} else {
ShowWindow(GetDlgItem(hDlg, IDD_WINDOWED), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDD_FULLSCREEN), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDD_DISPLAY_GROUPBOX), SW_HIDE);
}
CheckDlgButton(hDlg, IDD_HISTORY_NODUP, gpStateInfo->HistoryNoDup);
CheckDlgButton(hDlg, IDD_QUICKEDIT, gpStateInfo->QuickEdit);
CheckDlgButton(hDlg, IDD_INSERT, gpStateInfo->InsertMode);
g_fSaveAutoCompleteState = FALSE;
if (IsWindow(GetDlgItem(hDlg, IDD_AUTOCOMPLETE)))
{
CheckDlgButton(hDlg, IDD_AUTOCOMPLETE, g_fAutoComplete);
}
// initialize cursor radio buttons
if (gpStateInfo->CursorSize <= 25) {
Item = IDD_CURSOR_SMALL;
} else if (gpStateInfo->CursorSize <= 50) {
Item = IDD_CURSOR_MEDIUM;
} else {
Item = IDD_CURSOR_LARGE;
}
CheckRadioButton(hDlg, IDD_CURSOR_SMALL, IDD_CURSOR_LARGE, Item);
SetDlgItemInt(hDlg, IDD_HISTORY_SIZE, gpStateInfo->HistoryBufferSize,
FALSE);
SendDlgItemMessage(hDlg, IDD_HISTORY_SIZE, EM_LIMITTEXT, 3, 0L);
SendDlgItemMessage(hDlg, IDD_HISTORY_SIZESCROLL, UDM_SETRANGE, 0,
MAKELONG(999, 1));
SetDlgItemInt(hDlg, IDD_HISTORY_NUM, gpStateInfo->NumberOfHistoryBuffers,
FALSE);
SendDlgItemMessage(hDlg, IDD_HISTORY_NUM, EM_LIMITTEXT, 3, 0L);
SendDlgItemMessage(hDlg, IDD_HISTORY_NUM, EM_SETSEL, 0, (DWORD)-1);
SendDlgItemMessage(hDlg, IDD_HISTORY_NUMSCROLL, UDM_SETRANGE, 0,
MAKELONG(999, 1));
// FE_SB
// Let users select Default CodePage.
// Per request from PMs, this feature should be activated only for FE enabled NT.
if (gfFESystem) {
if (gpStateInfo->hWnd != NULL) {
LanguageDisplay(hDlg, gpStateInfo->CodePage);
}
else{
LanguageListCreate(hDlg, gpStateInfo->CodePage);
}
}
else {
// If the system is not FE enabled, just disable and hide them.
EnableWindow(GetDlgItem(hDlg,IDD_LANGUAGELIST), FALSE);
ShowWindow(GetDlgItem(hDlg, IDD_LANGUAGELIST), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDD_LANGUAGE_GROUPBOX), SW_HIDE);
}
// end FE_SB
return TRUE;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item) {
#ifdef i386
case IDD_WINDOWED:
case IDD_FULLSCREEN:
UpdateStateInfo(hDlg, Item, 0);
return TRUE;
#endif
// FE_SB
case IDD_LANGUAGELIST:
switch (HIWORD(wParam)) {
case CBN_KILLFOCUS: {
HWND hWndLanguageCombo;
LONG lListIndex;
hWndLanguageCombo = GetDlgItem(hDlg, IDD_LANGUAGELIST);
lListIndex = (LONG)SendMessage(hWndLanguageCombo, CB_GETCURSEL, 0, 0L);
Value = (UINT)SendMessage(hWndLanguageCombo, CB_GETITEMDATA, lListIndex, 0L);
if (Value != -1) {
fChangeCodePage = (Value != gpStateInfo->CodePage);
UpdateStateInfo(hDlg, Item, Value);
}
break;
}
default:
DBGFONTS(("unhandled CBN_%x from POINTSLIST\n",HIWORD(wParam)));
break;
}
return TRUE;
// end FE_SB
case IDD_CURSOR_SMALL:
case IDD_CURSOR_MEDIUM:
case IDD_CURSOR_LARGE:
UpdateStateInfo(hDlg, Item, 0);
return TRUE;
case IDD_HISTORY_NODUP:
case IDD_AUTOCOMPLETE:
case IDD_QUICKEDIT:
case IDD_INSERT:
Value = IsDlgButtonChecked(hDlg, Item);
UpdateStateInfo(hDlg, Item, Value);
return TRUE;
case IDD_HISTORY_SIZE:
case IDD_HISTORY_NUM:
switch (HIWORD(wParam)) {
case EN_UPDATE:
if (!CheckNum(hDlg, Item)) {
if (!InEM_UNDO) {
InEM_UNDO = TRUE;
SendMessage((HWND)lParam, EM_UNDO, 0, 0L);
InEM_UNDO = FALSE;
}
}
break;
case EN_KILLFOCUS:
/*
* Update the state info structure
*/
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
if (bOK) {
UpdateStateInfo(hDlg, Item, Value);
}
break;
}
return TRUE;
default:
break;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
EndDlgPage(hDlg);
return TRUE;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
if (Item = GetDlgCtrlID(GetFocus())) {
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
case WM_VSCROLL:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
Item = GetDlgCtrlID((HWND)lParam) - 1;
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
return TRUE;
default:
break;
}
return CommonDlgProc(hDlg, wMsg, wParam, lParam);
}
INT_PTR
ConsolePropertySheet(
IN HWND hWnd
)
/*++
Creates the property sheet to change console settings.
--*/
{
PROPSHEETPAGE psp[4];
PROPSHEETHEADER psh;
INT_PTR Result = IDCANCEL;
WCHAR awchBuffer[MAX_PATH];
//
// Initialize the state information
//
gpStateInfo = InitStateValues((HANDLE)hWnd);
if (gpStateInfo == NULL) {
KdPrint(("CONSOLE: can't get state information\n"));
return IDCANCEL;
}
//
// Initialize the font cache and current font index
//
InitializeFonts();
CurrentFontIndex = FindCreateFont(gpStateInfo->FontFamily,
gpStateInfo->FaceName,
gpStateInfo->FontSize,
gpStateInfo->FontWeight,
gpStateInfo->CodePage);
//
// Get the current page number
//
gnCurrentPage = GetRegistryValues(NULL);
//
// Initialize the property sheet structures
//
RtlZeroMemory(psp, sizeof(psp));
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].hInstance = ghInstance;
#if defined(FE_SB) // v-HirShi Nov.20.1996
if (gpStateInfo->hWnd != NULL) {
psp[0].pszTemplate = MAKEINTRESOURCE(DID_SETTINGS2);
}
else{
psp[0].pszTemplate = MAKEINTRESOURCE(DID_SETTINGS);
}
#else
psp[0].pszTemplate = MAKEINTRESOURCE(DID_SETTINGS);
#endif
psp[0].pfnDlgProc = SettingsDlgProc;
psp[0].lParam = 0;
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].hInstance = ghInstance;
psp[1].pszTemplate = MAKEINTRESOURCE(DID_FONTDLG);
psp[1].pfnDlgProc = FontDlgProc;
psp[1].lParam = 1;
psp[2].dwSize = sizeof(PROPSHEETPAGE);
psp[2].hInstance = ghInstance;
psp[2].pszTemplate = MAKEINTRESOURCE(DID_SCRBUFSIZE);
psp[2].pfnDlgProc = ScreenSizeDlgProc;
psp[2].lParam = 2;
psp[3].dwSize = sizeof(PROPSHEETPAGE);
psp[3].hInstance = ghInstance;
psp[3].pszTemplate = MAKEINTRESOURCE(DID_COLOR);
psp[3].pfnDlgProc = ColorDlgProc;
psp[3].lParam = 3;
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_PROPSHEETPAGE |
PSH_NOAPPLYNOW | PSH_USECALLBACK;
if (gpStateInfo->hWnd) {
psh.hwndParent = gpStateInfo->hWnd;
} else {
psh.hwndParent = hWnd;
}
psh.hInstance = ghInstance;
psh.pszIcon = MAKEINTRESOURCE(IDI_CONSOLE);
if (gpStateInfo->ConsoleTitle[0] != TEXT('\0')) {
wcscpy(awchBuffer, TEXT("\""));
ExpandEnvironmentStrings(gpStateInfo->ConsoleTitle, &awchBuffer[1], NELEM(awchBuffer) - 2);
wcscat(awchBuffer, TEXT("\""));
gbStartedFromLink = WereWeStartedFromALnk();
} else {
LoadString(ghInstance, IDS_TITLE, awchBuffer, NELEM(awchBuffer));
gbStartedFromLink = FALSE;
}
psh.pszCaption = awchBuffer;
psh.nPages = NELEM(psp);
psh.nStartPage = min(gnCurrentPage, NELEM(psp));
psh.ppsp = psp;
psh.pfnCallback = ConsolePropSheetProc;
//
// Create the property sheet
//
Result = PropertySheet(&psh);
//
// Send the state values to the console server
//
if (gbWriteToConsole) {
WriteStateValues(gpStateInfo);
}
//
// Save our changes to the registry
//
if (gbSaveToRegistry) {
//
// If we're looking at the default font, clear the values
// before we save them
//
if ((gpStateInfo->FontFamily == DefaultFontFamily) &&
(gpStateInfo->FontSize.X == DefaultFontSize.X) &&
(gpStateInfo->FontSize.Y == DefaultFontSize.Y) &&
(gpStateInfo->FontWeight == FW_NORMAL) &&
(wcscmp(gpStateInfo->FaceName, DefaultFaceName) == 0)) {
gpStateInfo->FontFamily = 0;
gpStateInfo->FontSize.X = 0;
gpStateInfo->FontSize.Y = 0;
gpStateInfo->FontWeight = 0;
gpStateInfo->FaceName[0] = TEXT('\0');
}
if (gbStartedFromLink) {
if (!SetLinkValues( gpStateInfo )) {
WCHAR szMessage[ MAX_PATH + 100 ];
STARTUPINFOW si;
HWND hwndTemp;
// An error occured try to save the link file,
// display a message box to that effect...
GetStartupInfoW( &si );
LoadStringW(ghInstance, IDS_LINKERROR, awchBuffer, NELEM(awchBuffer));
wsprintfW( szMessage,
awchBuffer,
si.lpTitle
);
LoadStringW(ghInstance, IDS_LINKERRCAP, awchBuffer, NELEM(awchBuffer));
if (gpStateInfo->hWnd) {
hwndTemp = gpStateInfo->hWnd;
} else {
hwndTemp = hWnd;
}
MessageBoxW( hwndTemp,
szMessage,
awchBuffer,
MB_APPLMODAL | MB_OK | MB_ICONSTOP | MB_SETFOREGROUND
);
}
} else {
SetRegistryValues(gpStateInfo, gnCurrentPage);
}
} else {
SetRegistryValues(NULL, gnCurrentPage);
}
//
// Tell the console server that we're done
//
if (gpStateInfo->hWnd) {
SendMessage(gpStateInfo->hWnd, CM_PROPERTIES_END, 0, 0);
}
//
// Free the state information
//
HeapFree(RtlProcessHeap(), 0, gpStateInfo);
//
// Destroy the font cache
//
DestroyFonts();
return Result;
}
BOOL
RegisterClasses(HANDLE hModule)
{
WNDCLASS wc;
wc.lpszClassName = TEXT("cpColor");
wc.hInstance = hModule;
wc.lpfnWndProc = ColorControlProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (!RegisterClass(&wc)) {
return FALSE;
}
wc.lpszClassName = TEXT("WOAWinPreview");
wc.lpfnWndProc = PreviewWndProc;
wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1);
wc.style = 0L;
if (!RegisterClass(&wc)) {
return FALSE;
}
wc.lpszClassName = TEXT("WOAFontPreview");
wc.lpfnWndProc = FontPreviewWndProc;
wc.hbrBackground = GetStockObject(BLACK_BRUSH);
wc.style = 0L;
if (!RegisterClass(&wc)) {
return FALSE;
}
return TRUE;
}
void
UnregisterClasses(HANDLE hModule)
{
UnregisterClass(TEXT("cpColor"), hModule);
UnregisterClass(TEXT("WOAWinPreview"), hModule);
UnregisterClass(TEXT("WOAFontPreview"), hModule);
}
PCONSOLE_STATE_INFO
ReadStateValues(HANDLE hMap)
{
PCONSOLE_STATE_INFO pConsoleInfo;
PCONSOLE_STATE_INFO pStateInfo;
/*
* Map the shared memory block into our address space.
*/
pConsoleInfo = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
if (pConsoleInfo == NULL) {
return NULL;
}
/*
* Copy the data into a locally allocated buffer.
*/
pStateInfo = HeapAlloc(RtlProcessHeap(), 0, pConsoleInfo->Length);
if (pStateInfo) {
RtlCopyMemory(pStateInfo, pConsoleInfo, pConsoleInfo->Length);
}
/*
* Close any open handles.
*/
UnmapViewOfFile(pConsoleInfo);
CloseHandle(hMap);
return pStateInfo;
}
BOOL
WriteStateValues(PCONSOLE_STATE_INFO pStateInfo)
{
HANDLE hMap;
PCONSOLE_STATE_INFO pConsoleInfo;
/*
* Make sure we have a console window to notify.
*/
if (pStateInfo->hWnd == NULL) {
return FALSE;
}
/*
* Create the shared memory block which will contain the state info.
*/
hMap = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0,
pStateInfo->Length, NULL);
if (!hMap) {
KdPrint(("CONSOLE: error %d creating file mapping\n", GetLastError()));
return FALSE;
}
/*
* Map the shared memory block into our address space and copy the
* data into it.
*/
pConsoleInfo = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (!pConsoleInfo) {
KdPrint(("CONSOLE: error %d mapping view of file\n", GetLastError()));
CloseHandle(hMap);
return FALSE;
}
RtlCopyMemory(pConsoleInfo, pStateInfo, pStateInfo->Length);
UnmapViewOfFile(pConsoleInfo);
/*
* Send a message to the server window telling him to read the data
* and then close any open handles.
*/
SendMessage(pStateInfo->hWnd, CM_PROPERTIES_UPDATE, (WPARAM)hMap, 0);
CloseHandle(hMap);
return TRUE;
}
PCONSOLE_STATE_INFO
InitStateValues(HANDLE hMap)
{
PCONSOLE_STATE_INFO pStateInfo;
/*
* Try to open the shared memory block and read the state info
* into our address space.
*/
pStateInfo = ReadStateValues(hMap);
if (pStateInfo != NULL) {
return pStateInfo;
}
/*
* Couldn't read the shared memory block so allocate and fill
* in default values in structure.
*/
pStateInfo = InitRegistryValues();
if (pStateInfo == NULL) {
return NULL;
}
/*
* Now overwrite default values with values from registry
*/
GetRegistryValues(pStateInfo);
return pStateInfo;
}