a13ccfd0f5
Generated by https://github.com/jsoref/spelling `f`; to maintain your repo, please consider `fchurn` I generally try to ignore upstream bits. I've accidentally included some items from the `deps/` directory. I expect someone will give me a list of items to drop, I'm happy to drop whole files/directories, or to split the PR into multiple items (E.g. comments/locals/public). Closes #4294
263 lines
8.9 KiB
C++
263 lines
8.9 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "precomp.h"
|
|
|
|
BOOL g_fScreenSizeDlgInitialized = FALSE;
|
|
BOOL g_fInScreenSizeSETACTIVE = FALSE;
|
|
|
|
BOOL GetStateInfo(HWND /*hDlg*/, UINT Item, __out LPINT lpValue)
|
|
{
|
|
BOOL bRet = TRUE;
|
|
int Value;
|
|
|
|
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:
|
|
Value = 0;
|
|
bRet = FALSE;
|
|
break;
|
|
}
|
|
|
|
*lpValue = Value;
|
|
return bRet;
|
|
}
|
|
|
|
/*++
|
|
Dialog proc for the screen size dialog box.
|
|
--*/
|
|
INT_PTR WINAPI ScreenSizeDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
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, 0);
|
|
SendDlgItemMessage(hDlg, IDD_SCRBUF_HEIGHT, EM_LIMITTEXT, 4, 0);
|
|
SendDlgItemMessage(hDlg, IDD_WINDOW_WIDTH, EM_LIMITTEXT, 4, 0);
|
|
SendDlgItemMessage(hDlg, IDD_WINDOW_HEIGHT, EM_LIMITTEXT, 4, 0);
|
|
SendDlgItemMessage(hDlg, IDD_WINDOW_POSX, EM_LIMITTEXT, 5, 0);
|
|
SendDlgItemMessage(hDlg, IDD_WINDOW_POSY, EM_LIMITTEXT, 5, 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 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);
|
|
|
|
CheckDlgButton(hDlg, IDD_LINE_WRAP, gpStateInfo->fWrapText);
|
|
CreateAndAssociateToolTipToControl(IDD_LINE_WRAP, hDlg, IDS_TOOLTIP_LINE_WRAP);
|
|
ToggleV2ColorControls(hDlg);
|
|
g_fScreenSizeDlgInitialized = 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))
|
|
{
|
|
Undo((HWND)lParam);
|
|
}
|
|
else if (!g_fInScreenSizeSETACTIVE && g_fScreenSizeDlgInitialized)
|
|
{
|
|
UpdateApplyButton(hDlg);
|
|
}
|
|
|
|
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 preview window with the new value
|
|
*/
|
|
hWnd = GetDlgItem(hDlg, IDD_PREVIEWWINDOW);
|
|
SendMessage(hWnd, CM_PREVIEW_UPDATE, 0, 0);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
|
|
case IDD_LINE_WRAP:
|
|
{
|
|
const BOOL fCurrentLineWrap = (IsDlgButtonChecked(hDlg, IDD_LINE_WRAP) == BST_CHECKED);
|
|
gpStateInfo->fWrapText = fCurrentLineWrap;
|
|
EnableWindow(GetDlgItem(hDlg, IDD_SCRBUF_WIDTH), g_fForceV2 ? !fCurrentLineWrap : TRUE);
|
|
UpdateApplyButton(hDlg);
|
|
return TRUE;
|
|
}
|
|
|
|
case IDD_AUTO_POSITION:
|
|
Value = IsDlgButtonChecked(hDlg, IDD_AUTO_POSITION);
|
|
UpdateStateInfo(hDlg, IDD_AUTO_POSITION, Value);
|
|
if (g_fScreenSizeDlgInitialized)
|
|
{
|
|
UpdateApplyButton(hDlg);
|
|
}
|
|
|
|
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:
|
|
{
|
|
const PSHNOTIFY* const pshn = (LPPSHNOTIFY)lParam;
|
|
switch (pshn->hdr.code)
|
|
{
|
|
case PSN_APPLY:
|
|
/*
|
|
* Write out the state values and exit.
|
|
*/
|
|
EndDlgPage(hDlg, !pshn->lParam);
|
|
return TRUE;
|
|
|
|
case PSN_KILLACTIVE:
|
|
/*
|
|
* Fake the dialog proc into thinking the edit control just
|
|
* lost focus so it'll update properly
|
|
*/
|
|
Item = GetDlgCtrlID(GetFocus());
|
|
if (Item)
|
|
{
|
|
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
|
|
}
|
|
return TRUE;
|
|
|
|
case PSN_SETACTIVE:
|
|
// When page becomes active, ensure that window and screen size box availability
|
|
// is updated based on the Word Wrap status.
|
|
g_fInScreenSizeSETACTIVE = TRUE;
|
|
if (g_fForceV2 && gpStateInfo->fWrapText)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDD_SCRBUF_WIDTH), FALSE);
|
|
|
|
gpStateInfo->ScreenBufferSize.X = gpStateInfo->WindowSize.X;
|
|
UpdateItem(hDlg, IDD_SCRBUF_WIDTH, gpStateInfo->ScreenBufferSize.X);
|
|
|
|
// Force the preview window to update as well
|
|
hWnd = GetDlgItem(hDlg, IDD_PREVIEWWINDOW);
|
|
SendMessage(hWnd, CM_PREVIEW_UPDATE, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDD_SCRBUF_WIDTH), TRUE);
|
|
}
|
|
|
|
ToggleV2LayoutControls(hDlg);
|
|
g_fInScreenSizeSETACTIVE = FALSE;
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// enables or disables layout page dialog controls depending on whether V2 is enabled or not
|
|
void ToggleV2LayoutControls(__in const HWND hDlg)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDD_LINE_WRAP), g_fForceV2);
|
|
CheckDlgButton(hDlg, IDD_LINE_WRAP, g_fForceV2 ? gpStateInfo->fWrapText : FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDD_SCRBUF_WIDTH), g_fForceV2 ? !gpStateInfo->fWrapText : TRUE);
|
|
}
|