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

1821 lines
55 KiB
C

//
// lnkcon.c link console property pages implementation
//
//---------------------------------------------------------------------------
#include "shellprv.h"
#pragma hdrstop
#include "lnkcon.h"
LRESULT PreviewWndProc( HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam );
BOOL_PTR CALLBACK _FontDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam );
LRESULT _FontPreviewWndProc( HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam );
extern TCHAR g_szPreviewText[];
// Context-sensitive help ids
const static DWORD rgdwHelpColor[] = {
IDC_CNSL_COLOR_SCREEN_TEXT, IDH_CONSOLE_COLOR_SCR_TEXT,
IDC_CNSL_COLOR_SCREEN_BKGND, IDH_CONSOLE_COLOR_SCR_BACK,
IDC_CNSL_COLOR_POPUP_TEXT, IDH_CONSOLE_COLOR_POPUP_TEXT,
IDC_CNSL_COLOR_POPUP_BKGND, IDH_CONSOLE_COLOR_POPUP_BACK,
IDC_CNSL_COLOR_RED_LBL, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_RED, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_GREEN_LBL, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_GREEN, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_BLUE_LBL, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_BLUE, IDH_CONSOLE_COLOR_RED,
IDC_CNSL_COLOR_SCREEN_COLORS, IDH_CONSOLE_COLOR_SCR_COLORS,
IDC_CNSL_COLOR_SCREEN_COLORS_LBL, IDH_CONSOLE_COLOR_SCR_COLORS,
IDC_CNSL_COLOR_POPUP_COLORS, IDH_CONSOLE_COLOR_WIN_COLORS,
IDC_CNSL_COLOR_POPUP_COLORS_LBL, IDH_CONSOLE_COLOR_WIN_COLORS,
IDC_CNSL_COLOR_1, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_2, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_3, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_4, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_5, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_6, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_7, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_8, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_9, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_10, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_11, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_12, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_13, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_14, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_15, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_COLOR_16, IDH_CONSOLE_COLOR_COLOR_BAR,
IDC_CNSL_GROUP0, -1,
IDC_CNSL_GROUP1, -1,
IDC_CNSL_GROUP2, -1,
0, 0
};
const static DWORD rgdwHelpSettings[] = {
IDC_CNSL_HISTORY_NUM_LBL, IDH_CONSOLE_OPTIONS_BUFF_NUM,
IDC_CNSL_HISTORY_NUM, IDH_CONSOLE_OPTIONS_BUFF_NUM,
IDC_CNSL_HISTORY_SIZE_LBL, IDH_CONSOLE_OPTIONS_BUFF_SIZE,
IDC_CNSL_HISTORY_SIZE, IDH_CONSOLE_OPTIONS_BUFF_SIZE,
IDC_CNSL_CURSOR_SMALL, IDH_CONSOLE_OPTIONS_CURSOR,
IDC_CNSL_CURSOR_LARGE, IDH_CONSOLE_OPTIONS_CURSOR,
IDC_CNSL_CURSOR_MEDIUM, IDH_CONSOLE_OPTIONS_CURSOR,
IDC_CNSL_HISTORY_NODUP, IDH_CONSOLE_OPTIONS_DISCARD_DUPS,
IDC_CNSL_INSERT, IDH_CONSOLE_OPTIONS_INSERT,
IDC_CNSL_QUICKEDIT, IDH_CONSOLE_OPTIONS_QUICK_EDIT,
IDC_CNSL_LANGUAGELIST, IDH_CONSOLE_OPTIONS_LANGUAGE,
IDC_CNSL_FULLSCREEN, IDH_DOS_SCREEN_USAGE_FULL,
IDC_CNSL_WINDOWED, IDH_DOS_SCREEN_USAGE_WINDOW,
IDC_CNSL_GROUP0, -1,
IDC_CNSL_GROUP1, -1,
IDC_CNSL_GROUP2, -1,
0, 0
};
const static DWORD rgdwHelpSize[] = {
IDC_CNSL_SCRBUF_WIDTH_LBL, IDH_CONSOLE_SIZE_BUFF_WIDTH,
IDC_CNSL_SCRBUF_WIDTH, IDH_CONSOLE_SIZE_BUFF_WIDTH,
IDC_CNSL_SCRBUF_HEIGHT_LBL, IDH_CONSOLE_SIZE_BUFF_HEIGHT,
IDC_CNSL_SCRBUF_HEIGHT, IDH_CONSOLE_SIZE_BUFF_HEIGHT,
IDC_CNSL_WINDOW_WIDTH_LBL, IDH_CONSOLE_SIZE_WIN_WIDTH,
IDC_CNSL_WINDOW_WIDTH, IDH_CONSOLE_SIZE_WIN_WIDTH,
IDC_CNSL_WINDOW_HEIGHT_LBL, IDH_CONSOLE_SIZE_WIN_HEIGHT,
IDC_CNSL_WINDOW_HEIGHT, IDH_CONSOLE_SIZE_WIN_HEIGHT,
IDC_CNSL_WINDOW_POSX_LBL, IDH_CONSOLE_SIZE_POS_LEFT,
IDC_CNSL_WINDOW_POSX, IDH_CONSOLE_SIZE_POS_LEFT,
IDC_CNSL_WINDOW_POSY_LBL, IDH_CONSOLE_SIZE_POS_TOP,
IDC_CNSL_WINDOW_POSY, IDH_CONSOLE_SIZE_POS_TOP,
IDC_CNSL_AUTO_POSITION, IDH_CONSOLE_SIZE_LET_SYS,
IDC_CNSL_PREVIEWLABEL, IDH_DOS_FONT_WINDOW_PREVIEW,
IDC_CNSL_PREVIEWWINDOW, IDH_DOS_FONT_WINDOW_PREVIEW,
IDC_CNSL_GROUP0, -1,
IDC_CNSL_GROUP1, -1,
IDC_CNSL_GROUP2, -1,
0, 0
};
#ifdef ADVANCED_PAGE
VOID
_AddEnvVariable(
HWND hwndLV,
INT iItem,
LPTSTR pszVar
)
{
TCHAR szTemp[ 1024 ];
LV_ITEM lvi;
LPTSTR p;
for( p = szTemp; *pszVar!=TEXT('='); *p++ = *pszVar++ );
*p = TEXT('\0');
pszVar++;
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.pszText = szTemp;
SendMessage( hwndLV, LVM_SETITEM, 0, (LPARAM)&lvi );
for( p=szTemp; *pszVar!=TEXT('\0'); *p++ = *pszVar++ );
*p = TEXT('\0');
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 1;
lvi.pszText = szTemp;
SendMessage( hwndLV, LVM_SETITEM, 0, (LPARAM)&lvi );
}
BOOL_PTR
CALLBACK
_AdvancedDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the settings dialog box.
--*/
{
UINT Item;
HWND hWnd;
RECT r;
LV_COLUMN lvc;
HWND hwndLV;
LPTSTR pszEnv, pszSave;
LV_ITEM lvi;
INT i;
LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
switch (wMsg) {
case WM_INITDIALOG:
pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld);
// Initialize Columns in listview
hwndLV = GetDlgItem( hDlg, IDC_CNSL_ADVANCED_LISTVIEW );
GetClientRect( hwndLV, &r );
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = (((r.right - r.left) - GetSystemMetrics(SM_CXVSCROLL)) * 7) / 20;
lvc.pszText = TEXT("Variable Name");
ListView_InsertColumn( hwndLV, 0, &lvc );
lvc.cx = (((r.right - r.left) - GetSystemMetrics(SM_CXVSCROLL)) * 13) / 20;
lvc.pszText = TEXT("Value");
ListView_InsertColumn( hwndLV, 1, &lvc );
ZeroMemory( &lvi, sizeof(lvi) );
pszSave = pszEnv = GetEnvironmentStrings();
while (pszEnv && *pszEnv)
{
i = SendMessage( hwndLV, LVM_INSERTITEM, 0, (LPARAM)&lvi );
_AddEnvVariable( hwndLV, i, pszEnv );
for( ; *pszEnv; pszEnv++ )
{
// do nothing
}
pszEnv++;
}
FreeEnvironmentStrings( pszSave );
return TRUE;
case WM_DESTROY:
EndDialog( hDlg, TRUE );
break;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item)
{
default:
break;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
if (FAILED(SaveLink(pld)))
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
break;
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 FALSE;
}
#endif // ADVANCED_PAGE
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;
CONSOLEPROP_DATA * pcpd = (CONSOLEPROP_DATA *)GetWindowLongPtr( hColor, 0 );
ColorId = GetWindowLong(hColor, GWL_ID);
hDlg = GetParent(hColor);
switch (wMsg) {
case CM_COLOR_INIT:
SetWindowLongPtr( hColor, 0, lParam );
break;
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTTAB;
break;
case WM_SETFOCUS:
if (pcpd->ColorArray[pcpd->Index] != (BYTE)(ColorId - IDC_CNSL_COLOR_1)) {
hWnd = GetDlgItem(hDlg, pcpd->ColorArray[pcpd->Index]+IDC_CNSL_COLOR_1);
SetFocus(hWnd);
}
// Fall through
case WM_KILLFOCUS:
hdc = GetDC(hDlg);
hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_1);
GetWindowRect(hWnd, &rColor);
hWnd = GetDlgItem(hDlg, IDC_CNSL_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 > IDC_CNSL_COLOR_1) {
SendMessage(hDlg, CM_SETCOLOR,
ColorId - 1 - IDC_CNSL_COLOR_1, (LPARAM)hColor);
}
break;
case VK_DOWN:
case VK_RIGHT:
if (ColorId < IDC_CNSL_COLOR_16) {
SendMessage(hDlg, CM_SETCOLOR,
ColorId + 1 - IDC_CNSL_COLOR_1, (LPARAM)hColor);
}
break;
case VK_TAB:
hWnd = GetDlgItem(hDlg, IDC_CNSL_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 - IDC_CNSL_COLOR_1, (LPARAM)hColor);
break;
case WM_PAINT:
BeginPaint(hColor, &ps);
GetClientRect(hColor, &rColor);
rgbBrush = GetNearestColor(ps.hdc, pcpd->lpConsole->ColorTable[ColorId-IDC_CNSL_COLOR_1]);
if ((hbr = CreateSolidBrush(rgbBrush)) != NULL) {
//
// are we the selected color for the current object?
//
if (pcpd->ColorArray[pcpd->Index] == (BYTE)(ColorId - IDC_CNSL_COLOR_1)) {
//
// put current values in dialog box
//
SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETPOS, 0, MAKELONG( GetRValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0));
SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETPOS, 0, MAKELONG( GetGValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0));
SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETPOS, 0, MAKELONG( GetBValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0));
//
// 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;
}
LRESULT
ColorTextProc(
HWND hWnd,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Window proc for the color preview windows
--*/
{
PAINTSTRUCT ps;
int ColorId;
RECT rect;
HBRUSH hbr;
HFONT hfT;
CONSOLEPROP_DATA * pcpd = (CONSOLEPROP_DATA *)GetWindowLongPtr( hWnd, 0 );
ColorId = GetWindowLong(hWnd, GWL_ID);
switch (wMsg) {
case CM_COLOR_INIT:
SetWindowLongPtr( hWnd, 0, lParam );
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
InflateRect(&rect, -2, -2);
if (ColorId == IDC_CNSL_COLOR_SCREEN_COLORS) {
SetTextColor(ps.hdc, ScreenTextColor(pcpd));
SetBkColor(ps.hdc, ScreenBkColor(pcpd));
hbr = CreateSolidBrush( ScreenBkColor(pcpd) );
} else {
SetTextColor(ps.hdc, PopupTextColor(pcpd));
SetBkColor(ps.hdc, PopupBkColor(pcpd));
hbr = CreateSolidBrush( PopupBkColor(pcpd) );
}
/* Draw the text sample */
if (hbr)
{
FillRect(ps.hdc, &rect, hbr);
DeleteObject(hbr);
}
hfT = SelectObject(ps.hdc, pcpd->FontInfo[pcpd->CurrentFontIndex].hFont);
DrawText(ps.hdc, g_szPreviewText, -1, &rect, 0);
SelectObject(ps.hdc, hfT);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, wMsg, wParam, lParam);
break;
}
return TRUE;
}
BOOL_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;
LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
switch (wMsg) {
case WM_INITDIALOG:
pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld);
pld->cpd.bColorInit = FALSE;
pld->cpd.ColorArray[IDC_CNSL_COLOR_SCREEN_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT] =
LOBYTE(pld->cpd.lpConsole->wFillAttribute) & 0x0F;
pld->cpd.ColorArray[IDC_CNSL_COLOR_SCREEN_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT] =
LOBYTE(pld->cpd.lpConsole->wFillAttribute >> 4);
pld->cpd.ColorArray[IDC_CNSL_COLOR_POPUP_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT] =
LOBYTE(pld->cpd.lpConsole->wPopupFillAttribute) & 0x0F;
pld->cpd.ColorArray[IDC_CNSL_COLOR_POPUP_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT] =
LOBYTE(pld->cpd.lpConsole->wPopupFillAttribute >> 4);
CheckRadioButton(hDlg,IDC_CNSL_COLOR_SCREEN_TEXT,IDC_CNSL_COLOR_POPUP_BKGND,IDC_CNSL_COLOR_SCREEN_BKGND);
pld->cpd.Index = IDC_CNSL_COLOR_SCREEN_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT;
// initialize color controls
for (Item=IDC_CNSL_COLOR_1; Item<=IDC_CNSL_COLOR_16; Item++)
SendDlgItemMessage(hDlg, Item, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd );
// initialize text preview controls
SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd );
SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_POPUP_COLORS, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd );
// Set ranges & position for updown controls
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) );
#define pcpd (&pld->cpd)
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETPOS, 0,
(LPARAM)MAKELONG(GetRValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETPOS, 0,
(LPARAM)MAKELONG(GetGValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETPOS, 0,
(LPARAM)MAKELONG(GetBValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) );
#undef pcpd
pld->cpd.bColorInit = TRUE;
return TRUE;
//
// handle help messages
//
case WM_HELP: /* F1 or title-bar help button */
WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
NULL,
HELP_WM_HELP,
(ULONG_PTR) (LPVOID) &rgdwHelpColor[0]
);
break;
case WM_CONTEXTMENU: /* right mouse click */
WinHelp( (HWND) wParam,
NULL,
HELP_CONTEXTMENU,
(ULONG_PTR) (LPVOID) &rgdwHelpColor[0]
);
break;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item)
{
case IDC_CNSL_COLOR_SCREEN_TEXT:
case IDC_CNSL_COLOR_SCREEN_BKGND:
case IDC_CNSL_COLOR_POPUP_TEXT:
case IDC_CNSL_COLOR_POPUP_BKGND:
hWndOld = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1);
pld->cpd.Index = Item - IDC_CNSL_COLOR_SCREEN_TEXT;
CheckRadioButton(hDlg,IDC_CNSL_COLOR_SCREEN_TEXT,IDC_CNSL_COLOR_POPUP_BKGND,Item);
// repaint new color
hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1);
InvalidateRect(hWnd, NULL, TRUE);
// repaint old color
if (hWndOld != hWnd)
{
InvalidateRect(hWndOld, NULL, TRUE);
}
return TRUE;
case IDC_CNSL_COLOR_RED:
case IDC_CNSL_COLOR_GREEN:
case IDC_CNSL_COLOR_BLUE:
switch (HIWORD(wParam))
{
case EN_UPDATE:
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
if (bOK)
{
if (Value > 255) {
Value = 255;
SetDlgItemInt( hDlg, Item, Value, TRUE );
}
if ((int)Value < 0) {
Value = 0;
SetDlgItemInt( hDlg, Item, Value, TRUE );
}
}
if (pld)
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
break;
case EN_KILLFOCUS:
if (!pld)
return FALSE;
//
// Update the state info structure
//
#define pcpd (&pld->cpd)
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
if (bOK)
{
if (Value > 255) {
Value = 255;
SetDlgItemInt( hDlg, Item, Value, TRUE );
}
if ((int)Value < 0) {
Value = 0;
SetDlgItemInt( hDlg, Item, Value, TRUE );
}
if (Item == IDC_CNSL_COLOR_RED) {
Red = Value;
} else {
Red = GetRValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index]));
}
if (Item == IDC_CNSL_COLOR_GREEN) {
Green = Value;
} else {
Green = GetGValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index]));
}
if (Item == IDC_CNSL_COLOR_BLUE) {
Blue = Value;
} else {
Blue = GetBValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index]));
}
pld->cpd.lpConsole->ColorTable[pld->cpd.ColorArray[pld->cpd.Index]] =
RGB(Red, Green, Blue);
}
#undef pcpd
//
// Update the preview windows with the new value
//
hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS);
InvalidateRect(hWnd, NULL, FALSE);
hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_POPUP_COLORS);
InvalidateRect(hWnd, NULL, FALSE);
hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_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.
*/
if (FAILED(SaveLink(pld)))
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
break;
}
break;
case WM_VSCROLL:
// minus 1 because edit control precedes the updown control in the .rc file
Item = GetDlgCtrlID( (HWND)lParam ) - 1;
switch (LOWORD(wParam)) {
case SB_ENDSCROLL:
SendDlgItemMessage(hDlg, Item, EM_SETSEL, 0, (DWORD)-1);
break;
default:
/*
* Get the new value for the control
*/
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
SendDlgItemMessage(hDlg, Item, EM_SETSEL, 0, (DWORD)-1);
hWnd = GetDlgItem(hDlg, Item);
SetFocus(hWnd);
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
break;
}
return TRUE;
case CM_SETCOLOR:
switch( pld->cpd.Index + IDC_CNSL_COLOR_SCREEN_TEXT )
{
case IDC_CNSL_COLOR_SCREEN_TEXT:
pld->cpd.lpConsole->wFillAttribute = (WORD)
((pld->cpd.lpConsole->wFillAttribute & 0xF0) |
(wParam & 0x0F));
break;
case IDC_CNSL_COLOR_SCREEN_BKGND:
pld->cpd.lpConsole->wFillAttribute = (WORD)
((pld->cpd.lpConsole->wFillAttribute & 0x0F) |
(wParam << 4));
break;
case IDC_CNSL_COLOR_POPUP_TEXT:
pld->cpd.lpConsole->wPopupFillAttribute = (WORD)
((pld->cpd.lpConsole->wPopupFillAttribute & 0xF0) |
(wParam & 0x0F));
break;
case IDC_CNSL_COLOR_POPUP_BKGND:
pld->cpd.lpConsole->wPopupFillAttribute = (WORD)
((pld->cpd.lpConsole->wPopupFillAttribute & 0x0F) |
(wParam << 4));
break;
}
hWndOld = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1);
pld->cpd.ColorArray[pld->cpd.Index] = (BYTE)wParam;
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
// Force the preview window to repaint
if (pld->cpd.Index < (IDC_CNSL_COLOR_POPUP_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT)) {
hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS);
} else {
hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_POPUP_COLORS);
}
InvalidateRect(hWnd, NULL, TRUE);
// repaint new color
hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1);
InvalidateRect(hWnd, NULL, TRUE);
SetFocus(hWnd);
// repaint old color
if (hWndOld != hWnd) {
InvalidateRect(hWndOld, NULL, TRUE);
}
return TRUE;
default:
break;
}
return FALSE;
}
BOOL_PTR
CALLBACK
_ConsoleSettingsDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the settings dialog box.
--*/
{
UINT Item;
SYSTEM_INFO SystemInfo;
LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
switch (wMsg) {
case WM_INITDIALOG:
pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld);
GetSystemInfo(&SystemInfo);
if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
if (pld->cpd.lpConsole->bFullScreen)
CheckRadioButton(hDlg,IDC_CNSL_WINDOWED,IDC_CNSL_FULLSCREEN,IDC_CNSL_FULLSCREEN);
else
CheckRadioButton(hDlg,IDC_CNSL_WINDOWED,IDC_CNSL_FULLSCREEN,IDC_CNSL_WINDOWED);
} else {
ShowWindow(GetDlgItem(hDlg, IDC_CNSL_WINDOWED), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_CNSL_FULLSCREEN), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_CNSL_GROUP2), SW_HIDE);
}
CheckDlgButton(hDlg, IDC_CNSL_HISTORY_NODUP, pld->cpd.lpConsole->bHistoryNoDup);
CheckDlgButton(hDlg, IDC_CNSL_QUICKEDIT, pld->cpd.lpConsole->bQuickEdit);
CheckDlgButton(hDlg, IDC_CNSL_INSERT, pld->cpd.lpConsole->bInsertMode);
// initialize cursor radio buttons
if (pld->cpd.lpConsole->uCursorSize <= 25)
{
Item = IDC_CNSL_CURSOR_SMALL;
}
else if (pld->cpd.lpConsole->uCursorSize <= 50)
{
Item = IDC_CNSL_CURSOR_MEDIUM;
}
else
{
Item = IDC_CNSL_CURSOR_LARGE;
}
CheckRadioButton(hDlg, IDC_CNSL_CURSOR_SMALL, IDC_CNSL_CURSOR_LARGE, Item);
// initialize updown controls
SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_SIZESCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 999, 1 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_NUMSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 999, 1 ) );
//
// put current values in dialog box
//
SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_SIZESCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->uHistoryBufferSize, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_NUMSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->uNumberOfHistoryBuffers, 0 ) );
if (IsFarEastCP(pld->cpd.uOEMCP))
LanguageListCreate(hDlg, pld->cpd.lpFEConsole->uCodePage);
else
{
ShowWindow(GetDlgItem(hDlg, IDC_CNSL_GROUP3), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_CNSL_LANGUAGELIST), SW_HIDE);
}
return TRUE;
case WM_DESTROY:
EndDialog( hDlg, TRUE );
break;
//
// handle help messages
//
case WM_HELP: /* F1 or title-bar help button */
WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
NULL,
HELP_WM_HELP,
(ULONG_PTR) (LPVOID) &rgdwHelpSettings[0]
);
break;
case WM_CONTEXTMENU: /* right mouse click */
WinHelp( (HWND) wParam,
NULL,
HELP_CONTEXTMENU,
(ULONG_PTR) (LPVOID) &rgdwHelpSettings[0]
);
break;
case WM_COMMAND:
Item = LOWORD(wParam);
switch (Item)
{
case IDC_CNSL_HISTORY_SIZE:
if (pld && (HIWORD(wParam)==EN_UPDATE))
{
pld->cpd.lpConsole->uHistoryBufferSize =
GetDlgItemInt( hDlg, Item, NULL, FALSE );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
}
break;
case IDC_CNSL_HISTORY_NUM:
if (pld && (HIWORD(wParam)==EN_UPDATE))
{
pld->cpd.lpConsole->uNumberOfHistoryBuffers =
GetDlgItemInt( hDlg, Item, NULL, FALSE );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
}
break;
#ifdef i386
case IDC_CNSL_WINDOWED:
case IDC_CNSL_FULLSCREEN:
CheckRadioButton(hDlg, IDC_CNSL_WINDOWED, IDC_CNSL_FULLSCREEN, Item);
pld->cpd.lpConsole->bFullScreen = (Item == IDC_CNSL_FULLSCREEN);
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
return TRUE;
#endif
case IDC_CNSL_LANGUAGELIST:
switch (HIWORD(wParam)) {
case CBN_KILLFOCUS: {
HWND hWndLanguageCombo;
LONG lListIndex;
UINT Value;
hWndLanguageCombo = GetDlgItem(hDlg, IDC_CNSL_LANGUAGELIST);
lListIndex = (LONG) SendMessage(hWndLanguageCombo, CB_GETCURSEL, 0, 0L);
Value = (UINT) SendMessage(hWndLanguageCombo, CB_GETITEMDATA, lListIndex, 0L);
if (Value != (UINT)-1) {
pld->cpd.fChangeCodePage = (Value != pld->cpd.lpFEConsole->uCodePage);
pld->cpd.lpFEConsole->uCodePage = Value;
PropSheet_Changed( GetParent( hDlg ), hDlg );
}
break;
}
default:
break;
}
return TRUE;
case IDC_CNSL_CURSOR_SMALL:
pld->cpd.lpConsole->uCursorSize = 25;
goto SetCursorSize;
case IDC_CNSL_CURSOR_MEDIUM:
pld->cpd.lpConsole->uCursorSize = 50;
goto SetCursorSize;
case IDC_CNSL_CURSOR_LARGE:
pld->cpd.lpConsole->uCursorSize = 100;
SetCursorSize:
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
CheckRadioButton(hDlg, IDC_CNSL_CURSOR_SMALL, IDC_CNSL_CURSOR_LARGE, Item);
return TRUE;
case IDC_CNSL_HISTORY_NODUP:
pld->cpd.lpConsole->bHistoryNoDup = IsDlgButtonChecked( hDlg, Item );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
return TRUE;
case IDC_CNSL_QUICKEDIT:
pld->cpd.lpConsole->bQuickEdit = IsDlgButtonChecked( hDlg, Item );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
return TRUE;
case IDC_CNSL_INSERT:
pld->cpd.lpConsole->bInsertMode = IsDlgButtonChecked( hDlg, Item );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
return TRUE;
default:
break;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
if (FAILED(SaveLink(pld)))
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
break;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
if (0 != (Item = GetDlgCtrlID(GetFocus()))) {
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
BOOL
CheckBufferSize(
HWND hDlg,
UINT Item,
LINKDATA *pld,
INT i
)
/*++
Checks to make sure the buffer size is not smaller than the window size
Returns: TRUE if preview window should be updated
FALSE if not
--*/
{
BOOL fRet = FALSE;
if (!pld)
return fRet;
switch (Item)
{
case IDC_CNSL_SCRBUF_WIDTHSCROLL:
case IDC_CNSL_SCRBUF_WIDTH:
if (i >= 1)
{
pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i;
if (pld->cpd.lpConsole->dwWindowSize.X > i)
{
pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i;
SetDlgItemInt( hDlg,
IDC_CNSL_WINDOW_WIDTH,
pld->cpd.lpConsole->dwWindowSize.X,
TRUE
);
fRet = TRUE;
}
}
break;
case IDC_CNSL_SCRBUF_HEIGHTSCROLL:
case IDC_CNSL_SCRBUF_HEIGHT:
if (i >= 1)
{
pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i;
if (pld->cpd.lpConsole->dwWindowSize.Y > i)
{
pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i;
SetDlgItemInt( hDlg,
IDC_CNSL_WINDOW_HEIGHT,
pld->cpd.lpConsole->dwWindowSize.Y,
TRUE
);
fRet = TRUE;
}
}
break;
case IDC_CNSL_WINDOW_WIDTHSCROLL:
case IDC_CNSL_WINDOW_WIDTH:
if (i >= 1)
{
pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i;
if (pld->cpd.lpConsole->dwScreenBufferSize.X < i)
{
pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i;
SetDlgItemInt( hDlg,
IDC_CNSL_SCRBUF_WIDTH,
pld->cpd.lpConsole->dwScreenBufferSize.X,
TRUE
);
fRet = TRUE;
}
}
break;
case IDC_CNSL_WINDOW_HEIGHTSCROLL:
case IDC_CNSL_WINDOW_HEIGHT:
if (i >= 1)
{
pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i;
if (pld->cpd.lpConsole->dwScreenBufferSize.Y < i)
{
pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i;
SetDlgItemInt( hDlg,
IDC_CNSL_SCRBUF_HEIGHT,
pld->cpd.lpConsole->dwScreenBufferSize.Y,
TRUE
);
fRet = TRUE;
}
}
}
return fRet;
}
BOOL
IsValidSetting(
HWND hDlg,
UINT Item,
LINKDATA *pld,
INT i
)
/*++
Checks to make sure the proposed new value is valid for the console
Returns: TRUE if it is valid
FALSE if not
--*/
{
BOOL fRet = TRUE;
if (!pld)
return FALSE;
if (i>9999)
i = -1;
switch (Item)
{
case IDC_CNSL_WINDOW_HEIGHT:
if (i <= 0)
{
SetDlgItemInt( hDlg,
Item,
pld->cpd.lpConsole->dwWindowSize.Y,
TRUE
);
fRet = FALSE;
}
else
{
pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i;
}
break;
case IDC_CNSL_WINDOW_WIDTH:
if (i <= 0)
{
SetDlgItemInt( hDlg,
Item,
pld->cpd.lpConsole->dwWindowSize.X,
TRUE
);
fRet = FALSE;
}
else
{
pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i;
}
break;
case IDC_CNSL_SCRBUF_WIDTH:
if (i <= 0)
{
SetDlgItemInt( hDlg,
Item,
pld->cpd.lpConsole->dwScreenBufferSize.X,
TRUE
);
fRet = FALSE;
}
else
{
pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i;
}
break;
case IDC_CNSL_SCRBUF_HEIGHT:
if (i <= 0)
{
SetDlgItemInt( hDlg,
Item,
pld->cpd.lpConsole->dwScreenBufferSize.Y,
TRUE
);
fRet = FALSE;
}
else
{
pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i;
}
break;
}
if (i <= 0)
{
SendDlgItemMessage( hDlg,
Item,
EM_SETSEL,
(WPARAM)(INT)4,
(WPARAM)(INT)4
);
}
return fRet;
}
BOOL_PTR
CALLBACK
_ScreenSizeDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Dialog proc for the screen size dialog box.
--*/
{
UINT Value;
UINT Item;
HWND hWnd;
LONG xScreen;
LONG yScreen;
LONG cxScreen;
LONG cyScreen;
LONG cxFrame;
LONG cyFrame;
LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER);
switch (wMsg) {
case WM_INITDIALOG:
pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld);
SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_INIT, 0, (LPARAM)&pld->cpd );
SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 );
// 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 updown controls
SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_WIDTHSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( MAX_SCRBUF_WIDTH, 1 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_HEIGHTSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( MAX_SCRBUF_HEIGHT, 1 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_WIDTHSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 9999, 1 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_HEIGHTSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 9999, 1 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSXSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( xScreen + cxScreen - cxFrame, xScreen - cxFrame ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSYSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( yScreen + cyScreen - cyFrame, yScreen - cyFrame ) );
//
// put current values in dialog box
//
SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_WIDTHSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwScreenBufferSize.X, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_HEIGHTSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwScreenBufferSize.Y, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_WIDTHSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowSize.X, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_HEIGHTSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowSize.Y, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSXSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowOrigin.X, 0 ) );
SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSYSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowOrigin.Y, 0 ) );
CheckDlgButton(hDlg, IDC_CNSL_AUTO_POSITION, pld->cpd.lpConsole->bAutoPosition);
SendMessage(hDlg, WM_COMMAND, IDC_CNSL_AUTO_POSITION, 0);
return TRUE;
case WM_DESTROY:
EndDialog( hDlg, TRUE );
break;
//
// handle help messages
//
case WM_HELP: /* F1 or title-bar help button */
WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
NULL,
HELP_WM_HELP,
(ULONG_PTR) (LPVOID) &rgdwHelpSize[0]
);
break;
case WM_CONTEXTMENU: /* right mouse click */
WinHelp( (HWND) wParam,
NULL,
HELP_CONTEXTMENU,
(ULONG_PTR) (LPVOID) &rgdwHelpSize[0]
);
break;
case WM_COMMAND:
Item = LOWORD(wParam);
if (Item==IDC_CNSL_AUTO_POSITION)
{
pld->cpd.lpConsole->bAutoPosition = IsDlgButtonChecked( hDlg, Item );
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
Value = IsDlgButtonChecked(hDlg, IDC_CNSL_AUTO_POSITION);
for (Item = IDC_CNSL_WINDOW_POSX; Item < IDC_CNSL_AUTO_POSITION; Item++) {
hWnd = GetDlgItem(hDlg, Item);
EnableWindow(hWnd, (Value == FALSE));
}
}
//
// Make sure that we don't have a buffer size smaller than a window size
//
if (pld && (HIWORD(wParam)==EN_KILLFOCUS))
{
INT i;
i = GetDlgItemInt( hDlg, Item, NULL, FALSE );
if (CheckBufferSize( hDlg, Item, pld, i ))
goto UpdatePrevWindow;
}
//
// Verify that what is typed is a valid quantity...
//
if (pld && (HIWORD(wParam)==EN_UPDATE))
{
INT i;
i = GetDlgItemInt( hDlg, Item, NULL, FALSE );
IsValidSetting( hDlg, Item, pld, i );
switch( Item )
{
case IDC_CNSL_WINDOW_POSX:
pld->cpd.lpConsole->dwWindowOrigin.X = (SHORT)
GetDlgItemInt( hDlg, Item, NULL, TRUE );
break;
case IDC_CNSL_WINDOW_POSY:
pld->cpd.lpConsole->dwWindowOrigin.Y = (SHORT)
GetDlgItemInt( hDlg, Item, NULL, TRUE );
break;
}
UpdatePrevWindow:
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 );
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case UDN_DELTAPOS:
{
NM_UPDOWN * lpud = (NM_UPDOWN *)lParam;
INT i;
i = lpud->iPos + lpud->iDelta;
// Check for bad ranges
if ((i > 9999) || (i < 1))
return TRUE;
// check restrictions and alter values accordingly. (Buffer size
// can never be smaller than window size!)
CheckBufferSize( hDlg, (UINT)wParam, pld, i);
// highlight the changed entry
SendDlgItemMessage( hDlg,
(UINT)wParam,
EM_SETSEL,
(WPARAM)(INT)4,
(WPARAM)(INT)4
);
// Update the preview window
pld->cpd.bConDirty = TRUE;
PropSheet_Changed( GetParent( hDlg ), hDlg );
SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 );
}
break;
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
if (FAILED(SaveLink(pld)))
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
break;
// case PSN_HELP:
// //WinHelp(hDlg, szHelpFileName, HELP_CONTEXT, DID_SCRBUFSIZE);
// return TRUE;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
if (0 != (Item = GetDlgCtrlID(GetFocus()))) {
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
void *_CopyDataBlock(IShellLink *psl, DWORD dwSig)
{
void *pv = NULL;
IShellLinkDataList *psld;
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld)))
{
psld->lpVtbl->CopyDataBlock(psld, dwSig, &pv);
psld->lpVtbl->Release(psld);
}
return (void *)pv;
}
void _RemoveDataBlock(IShellLink *psl, DWORD dwSig)
{
IShellLinkDataList *psld;
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld)))
{
psld->lpVtbl->RemoveDataBlock(psld, dwSig);
psld->lpVtbl->Release(psld);
}
}
void _AddDataBlock(IShellLink *psl, void *pv)
{
IShellLinkDataList *psld;
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld)))
{
psld->lpVtbl->AddDataBlock(psld, pv);
psld->lpVtbl->Release(psld);
}
}
STDAPI_(void) LinkConsolePagesSave( LINKDATA *pld )
{
// First, remove the console settings section if it exists
_RemoveDataBlock(pld->cpd.psl, NT_CONSOLE_PROPS_SIG);
_RemoveDataBlock(pld->cpd.psl, NT_FE_CONSOLE_PROPS_SIG);
#ifndef UNICODE
// if we're the ANSI shell, we need to convert FACENAME
// over to UNICODE before saving...
{
WCHAR wszFaceName[LF_FACESIZE];
MultiByteToWideChar( CP_ACP, 0,
pld->cpd.lpFaceName, LF_FACESIZE,
wszFaceName, LF_FACESIZE
);
hmemcpy(pld->cpd.lpConsole->FaceName, wszFaceName, LF_FACESIZE*SIZEOF(WCHAR));
}
#endif
//
// Now, add back the new console settings
_AddDataBlock(pld->cpd.psl, pld->cpd.lpConsole);
//
// Now, update registry settings for this title...
SetRegistryValues( &pld->cpd );
if (IsFarEastCP(pld->cpd.uOEMCP))
{
// Same for FarEast console settings
//
_AddDataBlock(pld->cpd.psl, pld->cpd.lpFEConsole);
SetFERegistryValues( &pld->cpd );
}
// And, mark the console data as current
pld->cpd.bConDirty = FALSE;
}
#define PEMAGIC ((WORD)'P'+((WORD)'E'<<8))
STDAPI_(void) AddLinkConsolePages(LINKDATA *pld, IShellLink * psl, LPCTSTR pszFile, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
{
HPROPSHEETPAGE hpage;
PROPSHEETPAGE psp;
HRESULT hres;
TCHAR szTarget[ MAX_PATH ];
TCHAR szBuffer[ MAX_PATH ];
WNDCLASS wc;
IPersistFile *ppf;
// do this here so we don't slow down the loading
// of other pages
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, &ppf)))
{
WCHAR wszPath[ MAX_PATH ];
SHTCharToUnicode(pszFile, wszPath, ARRAYSIZE(wszPath));
hres = ppf->lpVtbl->Load(ppf, wszPath, 0);
ppf->lpVtbl->Release(ppf);
}
// Get the target of the link
hres = psl->lpVtbl->GetPath(psl, szBuffer, ARRAYSIZE(szBuffer), NULL, 0);
pld->cpd.psl = psl;
if (FAILED(hres) || hres == S_FALSE)
goto Exit;
// Remove args first, to:
// (1) shorten our string, avoiding ExpandEnvironmentStrings overflowing the buffer
// (2) increase liklihood that PathRemoveArgs won't get confused by spaces in "Program Files" etc
PathRemoveArgs(szTarget);
// expand the target
if (!SHExpandEnvironmentStrings(szBuffer, szTarget, ARRAYSIZE(szTarget)))
goto Exit;
// Check what kind of app target is LOWORD==PEMAGIC, HIWORD==0
if (GetExeType( szTarget )!=PEMAGIC)
goto Exit;
// It's a WIN32 console mode app, let's put up our property sheet
wc.lpszClassName = TEXT("WOACnslWinPreview");
wc.hInstance = HINST_THISDLL;
wc.lpfnWndProc = PreviewWndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1);
wc.style = 0L;
wc.cbClsExtra = 0;
wc.cbWndExtra = 2 * sizeof(PVOID); // (two pointers)
if (!RegisterClass(&wc))
if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS)
goto Exit;
wc.lpszClassName = TEXT("WOACnslFontPreview");
wc.hInstance = HINST_THISDLL;
wc.lpfnWndProc = _FontPreviewWndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = GetStockObject(BLACK_BRUSH);
wc.style = 0L;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(PVOID); // (one pointer)
if (!RegisterClass(&wc))
if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS)
goto Exit;
wc.lpszClassName = TEXT("cpColor");
wc.hInstance = HINST_THISDLL;
wc.lpfnWndProc = ColorControlProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.style = 0L;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(PVOID); // (one pointer)
if (!RegisterClass(&wc))
if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS)
goto Exit;
wc.lpszClassName = TEXT("cpShowColor");
wc.hInstance = HINST_THISDLL;
wc.lpfnWndProc = ColorTextProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.style = 0L;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(PVOID); // (one pointer)
if (!RegisterClass(&wc))
if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS)
goto Exit;
// Needs TTFontList for all platform.
if (!NT_SUCCESS( InitializeDbcsMisc(&pld->cpd) ))
goto Exit;
GetTitleFromLinkName( (LPTSTR)pszFile, (LPTSTR)pld->cpd.ConsoleTitle );
// Check if Far East settings exist...
if ((pld->cpd.lpFEConsole = (LPNT_FE_CONSOLE_PROPS)_CopyDataBlock(psl, NT_FE_CONSOLE_PROPS_SIG))==NULL)
{
pld->cpd.lpFEConsole = (LPNT_FE_CONSOLE_PROPS)LocalAlloc( LPTR, SIZEOF(NT_FE_CONSOLE_PROPS) );
if (pld->cpd.lpFEConsole)
{
// Initialize Far East Console settings
pld->cpd.lpFEConsole->cbSize = SIZEOF( NT_FE_CONSOLE_PROPS );
pld->cpd.lpFEConsole->dwSignature = NT_FE_CONSOLE_PROPS_SIG;
if (IsFarEastCP(pld->cpd.uOEMCP))
{
InitFERegistryValues( &pld->cpd );
GetFERegistryValues( &pld->cpd );
}
}
}
if (!pld->cpd.lpFEConsole)
goto Exit;
// Get standard settings from link if they exist...
if ((pld->cpd.lpConsole = (LPNT_CONSOLE_PROPS)_CopyDataBlock(psl, NT_CONSOLE_PROPS_SIG ))==NULL)
{
pld->cpd.lpConsole = (LPNT_CONSOLE_PROPS)LocalAlloc(LPTR, SIZEOF(NT_CONSOLE_PROPS) );
if (pld->cpd.lpConsole)
{
// Initialize console settings
pld->cpd.lpConsole->cbSize = SIZEOF( NT_CONSOLE_PROPS );
pld->cpd.lpConsole->dwSignature = NT_CONSOLE_PROPS_SIG;
InitRegistryValues( &pld->cpd );
GetRegistryValues( &pld->cpd );
}
else
{
// if the above alloc failes, we fault dereferencing lpConsole...
ASSERT(FALSE);
}
}
#ifndef UNICODE
else
{
// we read the properties off of disk -- so need to convert the
// UNICODE string to ANSI
WCHAR wszFaceName[LF_FACESIZE];
hmemcpy(wszFaceName,pld->cpd.lpConsole->FaceName,LF_FACESIZE*SIZEOF(WCHAR));
WideCharToMultiByte( CP_ACP, 0,
wszFaceName, LF_FACESIZE,
pld->cpd.szFaceName, LF_FACESIZE,
NULL, NULL
);
}
#endif
if (!pld->cpd.lpConsole)
goto Exit;
// set facename pointer to correct place
#ifdef UNICODE
pld->cpd.lpFaceName = (LPTSTR)pld->cpd.lpConsole->FaceName;
#else
pld->cpd.lpFaceName = (LPTSTR)pld->cpd.szFaceName;
#endif
//
// Initialize the font cache and current font index
//
if (STATUS_SUCCESS != InitializeFonts( &pld->cpd ))
{
goto Exit;
}
pld->cpd.CurrentFontIndex = FindCreateFont( &pld->cpd,
pld->cpd.lpConsole->uFontFamily,
pld->cpd.lpFaceName,
pld->cpd.lpConsole->dwFontSize,
pld->cpd.lpConsole->uFontWeight);
// Mark the console data as current
pld->cpd.bConDirty = FALSE;
// add console settings property sheet
psp.dwSize = SIZEOF( psp );
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = HINST_THISDLL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_SETTINGS);
psp.pfnDlgProc = _ConsoleSettingsDlgProc;
psp.lParam = (LPARAM)pld;
hpage = CreatePropertySheetPage( &psp );
if (hpage)
{
if (!pfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
goto Exit;
}
}
else
{
if (pld->cpd.lpConsole)
{
LocalFree( pld->cpd.lpConsole );
pld->cpd.lpConsole = NULL;
}
if (pld->cpd.lpFEConsole)
{
LocalFree( pld->cpd.lpFEConsole );
pld->cpd.lpFEConsole = NULL;
}
goto Exit;
}
// add font selection property sheet
psp.dwSize = SIZEOF( psp );
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = HINST_THISDLL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_FONTDLG);
psp.pfnDlgProc = _FontDlgProc;
psp.lParam = (LPARAM)pld;
hpage = CreatePropertySheetPage( &psp );
if (hpage)
{
if (!pfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
goto Exit;
}
}
else
{
if (pld->cpd.lpConsole)
{
LocalFree( pld->cpd.lpConsole );
pld->cpd.lpConsole = NULL;
}
if (pld->cpd.lpFEConsole)
{
LocalFree( pld->cpd.lpFEConsole );
pld->cpd.lpFEConsole = NULL;
}
goto Exit;
}
// add console size propery sheet
psp.dwSize = SIZEOF( psp );
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = HINST_THISDLL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_SCRBUFSIZE);
psp.pfnDlgProc = _ScreenSizeDlgProc;
psp.lParam = (LPARAM)pld;
hpage = CreatePropertySheetPage( &psp );
if (hpage)
{
if (!pfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
goto Exit;
}
}
else
{
if (pld->cpd.lpConsole)
{
LocalFree( pld->cpd.lpConsole );
pld->cpd.lpConsole = NULL;
}
goto Exit;
}
// add console color propery sheet
psp.dwSize = SIZEOF( psp );
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = HINST_THISDLL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_COLOR);
psp.pfnDlgProc = _ColorDlgProc;
psp.lParam = (LPARAM)pld;
hpage = CreatePropertySheetPage( &psp );
if (hpage)
{
if (!pfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
goto Exit;
}
}
else
{
if (pld->cpd.lpConsole)
{
LocalFree( pld->cpd.lpConsole );
pld->cpd.lpConsole = NULL;
}
if (pld->cpd.lpFEConsole)
{
LocalFree( pld->cpd.lpFEConsole );
pld->cpd.lpFEConsole = NULL;
}
goto Exit;
}
#ifdef ADVANCED_PAGE
// add "advanced" settings propery sheet
psp.dwSize = SIZEOF( psp );
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = HINST_THISDLL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_ADVANCED);
psp.pfnDlgProc = _AdvancedDlgProc;
psp.lParam = (LPARAM)pld;
hpage = CreatePropertySheetPage( &psp );
if (hpage)
{
if (!pfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
goto Exit;
}
}
else
{
if (pld->cpd.lpConsole)
{
LocalFree( pld->cpd.lpConsole );
pld->cpd.lpConsole = NULL;
}
if (pld->cpd.lpFEConsole)
{
LocalFree( pld->cpd.lpFEConsole );
pld->cpd.lpFEConsole = NULL;
}
goto Exit;
}
#endif
Exit:
;
}