Windows2000/private/shell/shell32/pifvid.c

328 lines
9.9 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*
* Microsoft Confidential
* Copyright (C) Microsoft Corporation 1991
* All Rights Reserved.
* PIFVID.C
* User interface dialogs for GROUP_VID
* History:
* Created 04-Jan-1993 1:10pm by Jeff Parsons
*/
#include "shellprv.h"
#pragma hdrstop
#ifdef WIN32
#define hModule GetModuleHandle(TEXT("SHELL32.DLL"))
#endif
#define VDD_DEVICE_ID 0x0000A
BINF abinfVid[] = {
{IDC_WINDOWED, BITNUM(VID_FULLSCREEN) | 0x80},
{IDC_FULLSCREEN, BITNUM(VID_FULLSCREEN)},
{IDC_TEXTEMULATE, BITNUM(VID_TEXTEMULATE)},
{IDC_DYNAMICVIDMEM, BITNUM(VID_RETAINMEMORY) | 0x80},
};
#ifndef _WIN32_WINNT // no console window toolbar on NT
BINF abinfWin[] ;= {
{IDC_TOOLBAR, BITNUM(WIN_TOOLBAR)},
};
#endif _WIN32_WINNT
BINF abinfWinInit[] = {
{IDC_WINRESTORE, BITNUM(WININIT_NORESTORE) | 0x80},
};
// Private function prototypes
void EnableVidDlg(HWND hDlg, PPROPLINK ppl);
void InitVidDlg(HWND hDlg, PPROPLINK ppl);
void ApplyVidDlg(HWND hDlg, PPROPLINK ppl);
// Context-sensitive help ids
const static DWORD rgdwHelp[] = {
IDC_SCREENUSAGEGRP, IDH_COMM_GROUPBOX,
IDC_FULLSCREEN, IDH_DOS_SCREEN_USAGE_FULL,
IDC_WINDOWED, IDH_DOS_SCREEN_USAGE_WINDOW,
#ifdef NEW_UNICODE
IDC_SCREENXBUFLBL, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_SCREENXBUF, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_SCREENYBUFLBL, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_SCREENYBUF, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_WINXSIZELBL, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_WINXSIZE, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_WINYSIZELBL, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_WINYSIZE, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
#else
IDC_SCREENLINESLBL, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
IDC_SCREENLINES, IDH_DOS_DISPLAY_SCREEN_SETTINGS,
#endif
IDC_WINDOWUSAGEGRP, IDH_COMM_GROUPBOX,
IDC_TOOLBAR, IDH_DOS_WINDOWS_TOOLBAR,
IDC_SCREENPERFGRP, IDH_COMM_GROUPBOX,
IDC_TEXTEMULATE, IDH_DOS_DISPLAY_ROM,
IDC_WINRESTORE, IDH_DOS_SCREEN_RESTORE,
IDC_DYNAMICVIDMEM, IDH_DOS_SCREEN_DMA,
IDC_REALMODEDISABLE,IDH_DOS_REALMODEPROPS,
0, 0
};
/*
* This is a little table that converts listbox indices into
* screen lines.
* The correspondences are...
* IDS_WHATEVER = List box index + IDS_DEFAULTLINES
* nLines = awVideoLines[List box index]
*/
#if IDS_25LINES - IDS_DEFAULTLINES != 1 || \
IDS_43LINES - IDS_DEFAULTLINES != 2 || \
IDS_50LINES - IDS_DEFAULTLINES != 3
#error Manifest constants damaged.
#endif
#ifdef NEW_UNICODE
// 0xFFFF tags the end of the array
#define AW_END_TAG 0xFFFF
WORD awBuffX[] = { 80, 90, 100, 120, AW_END_TAG };
WORD awBuffY[] = { 25, 43, 50, 60, 70, 80, 90, 100, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 9999, AW_END_TAG };
WORD awWinX[] = { 80, 90, 100, 120, AW_END_TAG };
WORD awWinY[] = { 25, 43, 50, 60, 70, 80, 90, 100, AW_END_TAG };
#else
WORD awVideoLines[] = { 0, 25, 43, 50 };
#endif // NEW_UNICODE
BOOL_PTR CALLBACK DlgVidProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PPROPLINK ppl;
FunctionName(DlgVidProc);
ppl = (PPROPLINK)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg) {
case WM_INITDIALOG:
lParam = ((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
ppl = (PPROPLINK)(INT_PTR)lParam;
InitVidDlg(hDlg, ppl);
break;
HELP_CASES(rgdwHelp) // Handle help messages
case WM_COMMAND:
if (LOWORD(lParam) == 0)
break; // message not from a control
switch (LOWORD(wParam)) {
#ifdef NEW_UNICODE
case IDC_SCREENXBUF:
case IDC_SCREENYBUF:
case IDC_WINXSIZE:
case IDC_WINYSIZE:
if ((HIWORD(wParam) == CBN_SELCHANGE) || (HIWORD(wParam) == CBN_EDITCHANGE))
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
break;
#else
case IDC_SCREENLINES:
if (HIWORD(wParam) == CBN_SELCHANGE)
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
break;
#endif // NEW_UNICODE
case IDC_WINDOWED:
case IDC_FULLSCREEN:
case IDC_WINRESTORE:
case IDC_TEXTEMULATE:
case IDC_DYNAMICVIDMEM:
#ifndef _WIN32_WINNT // no console window toolbar on NT
case IDC_TOOLBAR:
#endif _WIN32_WINNT
if (HIWORD(wParam) == BN_CLICKED)
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR *)lParam)->code) {
case PSN_SETACTIVE:
AdjustRealModeControls(ppl, hDlg);
break;
case PSN_KILLACTIVE:
// This gives the current page a chance to validate itself
// SetWindowLong(hDlg, DWL_MSGRESULT, 0);
break;
case PSN_APPLY:
// This happens on OK....
ApplyVidDlg(hDlg, ppl);
break;
case PSN_RESET:
// This happens on Cancel....
break;
}
break;
default:
return FALSE; // return 0 when not processing
}
return TRUE;
}
void InitVidDlg(HWND hDlg, PPROPLINK ppl)
{
WORD w;
HWND hwnd;
PROPVID vid;
PROPWIN win;
TCHAR szBuf[MAX_STRING_SIZE];
FunctionName(InitVidDlg);
if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_VID),
&vid, SIZEOF(vid), GETPROPS_NONE) ||
!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_WIN),
&win, SIZEOF(win), GETPROPS_NONE)) {
Warning(hDlg, IDS_QUERY_ERROR, MB_ICONEXCLAMATION | MB_OK);
return;
}
SetDlgBits(hDlg, &abinfVid[0], ARRAYSIZE(abinfVid), vid.flVid);
SetDlgBits(hDlg, &abinfWinInit[0], ARRAYSIZE(abinfWinInit), win.flWinInit);
#ifndef _WIN32_WINNT // no console window toolbar on NT
SetDlgBits(hDlg, &abinfWin[0], ARRAYSIZE(abinfWin), win.flWin);
#endif _WIN32_WINNT
#ifdef NEW_UNICODE
/*
* Fill in the buffer and screen size combo boxes with some intelligent
* choices.
*/
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_SCREENXBUF));
for (w = 0; awBuffX[w]!=AW_END_TAG; w++) {
wsprintf( szBuf, TEXT("%3d"), awBuffX[w] );
VERIFYTRUE(SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == w);
}
SendMessage( hwnd, CB_SETCURSEL, 0, 0 );
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_SCREENYBUF));
for (w = 0; awBuffY[w]!=AW_END_TAG; w++) {
wsprintf( szBuf, TEXT("%4d"), awBuffY[w] );
VERIFYTRUE(SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == w);
}
SendMessage( hwnd, CB_SETCURSEL, 0, 0 );
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_WINXSIZE));
for (w = 0; awWinX[w]!=AW_END_TAG; w++) {
wsprintf( szBuf, TEXT("%3d"), awWinX[w] );
VERIFYTRUE(SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == w);
}
SendMessage( hwnd, CB_SETCURSEL, 0, 0 );
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_WINYSIZE));
for (w = 0; awWinY[w]!=AW_END_TAG; w++) {
wsprintf( szBuf, TEXT("%3d"), awWinY[w] );
VERIFYTRUE(SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == w);
}
SendMessage( hwnd, CB_SETCURSEL, 0, 0 );
#else
/*
* Fill in the "Initial screen size" combo box. Note that
* we bail on low-memory errors. Note also that if we have
* a nonstandard size, we just leave the combo box with no
* default selection.
*/
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_SCREENLINES));
for (w = 0; w < ARRAYSIZE(awVideoLines); w++) {
VERIFYTRUE(LoadString(hModule, IDS_DEFAULTLINES + w, szBuf, ARRAYSIZE(szBuf)));
VERIFYTRUE(SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == w);
if (vid.cScreenLines == awVideoLines[w]) {
SendMessage(hwnd, CB_SETCURSEL, w, 0);
}
}
if (!IsBilingualCP(g_uCodePage))
{
EnableWindow(GetDlgItem(hDlg, IDC_SCREENLINESLBL), FALSE);
EnableWindow(hwnd, FALSE);
}
#endif // NEW_UNICODE
}
void ApplyVidDlg(HWND hDlg, PPROPLINK ppl)
{
DWORD dw;
HWND hwnd;
PROPVID vid;
PROPWIN win;
FunctionName(ApplyVidDlg);
// Get the current set of properties, then overlay the new settings
if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_VID),
&vid, SIZEOF(vid), GETPROPS_NONE) ||
!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_WIN),
&win, SIZEOF(win), GETPROPS_NONE)) {
Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
return;
}
GetDlgBits(hDlg, &abinfVid[0], ARRAYSIZE(abinfVid), &vid.flVid);
GetDlgBits(hDlg, &abinfWinInit[0], ARRAYSIZE(abinfWinInit), &win.flWinInit);
#ifndef _WIN32_WINNT // no console window toolbar on NT
GetDlgBits(hDlg, &abinfWin[0], ARRAYSIZE(abinfWin), &win.flWin);
#endif _WIN32_WINNT
#ifdef NEW_UNICODE
/*
* Get the console buffer/window size settings and map to the
* appropriate PIF settings.
*/
#else
/*
* If there is no current selection, don't change the cScreenLines
* property. This allows the user to retain an unusual number of
* screen lines by simply not touching the field.
*/
VERIFYTRUE(hwnd = GetDlgItem(hDlg, IDC_SCREENLINES));
dw = (DWORD) SendMessage(hwnd, CB_GETCURSEL, 0, 0L);
if (dw < ARRAYSIZE(awVideoLines)) {
vid.cScreenLines = awVideoLines[dw];
}
#endif // NEW_UNICODE
if (!PifMgr_SetProperties(ppl, MAKELP(0,GROUP_VID),
&vid, SIZEOF(vid), SETPROPS_NONE) ||
!PifMgr_SetProperties(ppl, MAKELP(0,GROUP_WIN),
&win, SIZEOF(win), SETPROPS_NONE))
Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
else
if (ppl->hwndNotify) {
ppl->flProp |= PROP_NOTIFY;
PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(vid), (LPARAM)MAKELP(0,GROUP_VID));
PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(win), (LPARAM)MAKELP(0,GROUP_WIN));
}
}