terminal/src/propsheet/LayoutPage.cpp
Josh Soref a13ccfd0f5
Fix a bunch of spelling errors across the project (#4295)
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
2020-02-10 20:40:01 +00:00

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);
}