* PROJECT: ReactOS Console Configuration DLL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/win32/console/layout.c
- * PURPOSE: displays layout dialog
- * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@student.tugraz.at)
+ * PURPOSE: Layout dialog
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
*/
#include "console.h"
+#define NDEBUG
+#include <debug.h>
-void PaintConsole(LPDRAWITEMSTRUCT drawItem, PConsoleInfo pConInfo)
+const WCHAR szPreviewText[] =
+ L"C:\\ReactOS> dir \n" \
+ L"SYSTEM <DIR> 13-04-15 5:00a\n" \
+ L"SYSTEM32 <DIR> 13-04-15 5:00a\n" \
+ L"readme txt 1739 13-04-15 5:00a\n" \
+ L"explorer exe 3329536 13-04-15 5:00a\n" \
+ L"vgafonts cab 18736 13-04-15 5:00a\n" \
+ L"setuplog txt 313 13-04-15 5:00a\n" \
+ L"win ini 7005 13-04-15 5:00a\n" ;
+
+
+VOID
+PaintConsole(LPDRAWITEMSTRUCT drawItem,
+ PCONSOLE_PROPS pConInfo)
{
- HBRUSH hBrush;
- RECT cRect, fRect;
- DWORD startx, starty;
- DWORD endx, endy;
- DWORD sizex, sizey;
-
- FillRect(drawItem->hDC, &drawItem->rcItem, GetSysColorBrush(COLOR_BACKGROUND));
-
- sizex = drawItem->rcItem.right - drawItem->rcItem.left;
- sizey = drawItem->rcItem.bottom - drawItem->rcItem.top;
-
- if (pConInfo->WindowPosition == UINT_MAX)
- {
- startx = sizex / 3;
- starty = sizey / 3;
- }
- else
- {
- // TODO:
- // Calculate pos correctly when console centered
- startx = sizex / 3;
- starty = sizey / 3;
- }
-
- // TODO:
- // Strech console when bold fonts are selected
- endx = drawItem->rcItem.right - startx + 15;
- endy = starty + sizey / 3;
-
- /* Draw console size */
- SetRect(&cRect, startx, starty, endx, endy);
- FillRect(drawItem->hDC, &cRect, GetSysColorBrush(COLOR_WINDOWFRAME));
-
- /* Draw console border */
- SetRect(&fRect, startx + 1, starty + 1, cRect.right - 1, cRect.bottom - 1);
- FrameRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
-
- /* Draw left box */
- SetRect(&fRect, startx + 3, starty + 3, startx + 5, starty + 5);
- FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
-
- /* Draw window title */
- SetRect(&fRect, startx + 7, starty + 3, cRect.right - 9, starty + 5);
- FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVECAPTION));
-
- /* Draw first right box */
- SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5);
- FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
-
- /* Draw second right box */
- SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5);
- FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
-
- /* Draw scrollbar */
- SetRect(&fRect, cRect.right - 5, fRect.bottom + 1, cRect.right - 3, cRect.bottom - 3);
- FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_SCROLLBAR));
-
- /* Draw console background */
- hBrush = CreateSolidBrush(pConInfo->ScreenBackground);
- SetRect(&fRect, startx + 3, starty + 6, cRect.right - 6, cRect.bottom - 3);
- FillRect(drawItem->hDC, &fRect, hBrush);
- DeleteObject((HGDIOBJ)hBrush);
+ PGUI_CONSOLE_INFO GuiInfo = pConInfo->TerminalInfo.TermInfo;
+ HBRUSH hBrush;
+ RECT cRect, fRect;
+ DWORD startx, starty;
+ DWORD endx, endy;
+ DWORD sizex, sizey;
+
+ FillRect(drawItem->hDC, &drawItem->rcItem, GetSysColorBrush(COLOR_BACKGROUND));
+
+ // FIXME: Use: SM_CXSIZE, SM_CYSIZE, SM_CXVSCROLL, SM_CYHSCROLL, SM_CXMIN, SM_CYMIN, SM_CXFRAME, SM_CYFRAME
+ /* Use it for scaling */
+ sizex = drawItem->rcItem.right - drawItem->rcItem.left;
+ sizey = drawItem->rcItem.bottom - drawItem->rcItem.top ;
+
+ if ( GuiInfo->WindowOrigin.x == MAXDWORD &&
+ GuiInfo->WindowOrigin.y == MAXDWORD )
+ {
+ startx = sizex / 3;
+ starty = sizey / 3;
+ }
+ else
+ {
+ // TODO:
+ // Calculate pos correctly when console centered
+ startx = GuiInfo->WindowOrigin.x;
+ starty = GuiInfo->WindowOrigin.y;
+ }
+
+ // TODO:
+ // Stretch console when bold fonts are selected
+ endx = startx + pConInfo->ci.ConsoleSize.X; // drawItem->rcItem.right - startx + 15;
+ endy = starty + pConInfo->ci.ConsoleSize.Y; // starty + sizey / 3;
+
+ /* Draw console size */
+ SetRect(&cRect, startx, starty, endx, endy);
+ FillRect(drawItem->hDC, &cRect, GetSysColorBrush(COLOR_WINDOWFRAME));
+
+ /* Draw console border */
+ SetRect(&fRect, startx + 1, starty + 1, cRect.right - 1, cRect.bottom - 1);
+ FrameRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
+
+ /* Draw left box */
+ SetRect(&fRect, startx + 3, starty + 3, startx + 5, starty + 5);
+ FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
+
+ /* Draw window title */
+ SetRect(&fRect, startx + 7, starty + 3, cRect.right - 9, starty + 5);
+ FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVECAPTION));
+
+ /* Draw first right box */
+ SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5);
+ FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
+
+ /* Draw second right box */
+ SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5);
+ FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER));
+
+ /* Draw scrollbar */
+ SetRect(&fRect, cRect.right - 5, fRect.bottom + 1, cRect.right - 3, cRect.bottom - 3);
+ FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_SCROLLBAR));
+
+ /* Draw console background */
+ hBrush = CreateSolidBrush(pConInfo->ci.Colors[BkgdAttribFromAttrib(pConInfo->ci.ScreenAttrib)]);
+ SetRect(&fRect, startx + 3, starty + 6, cRect.right - 6, cRect.bottom - 3);
+ FillRect(drawItem->hDC, &fRect, hBrush);
+ DeleteObject((HGDIOBJ)hBrush);
}
-void PaintText(LPDRAWITEMSTRUCT drawItem, PConsoleInfo pConInfo)
+BOOL
+PaintText(LPDRAWITEMSTRUCT drawItem,
+ PCONSOLE_PROPS pConInfo,
+ TEXT_TYPE TextMode)
{
- COLORREF pbkColor, ptColor;
- COLORREF nbkColor, ntColor;
- HBRUSH hBrush = NULL;
- TCHAR szText[1024];
-
- ZeroMemory(szText, sizeof(szText));
- LoadString(hApplet, IDS_SCREEN_TEXT, szText, sizeof(szText) / sizeof(TCHAR));
-
- if (drawItem->CtlID == IDC_STATIC_SCREEN_COLOR)
- {
- nbkColor = pConInfo->ScreenBackground;
- hBrush = CreateSolidBrush(nbkColor);
- ntColor = pConInfo->ScreenText;
- }
- else if (drawItem->CtlID == IDC_STATIC_POPUP_COLOR)
- {
- nbkColor = pConInfo->PopupBackground;
- hBrush = CreateSolidBrush(nbkColor);
- ntColor = pConInfo->PopupText;
- }
-
- if (!hBrush)
- {
- return;
- }
-
- FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
- if (ntColor == nbkColor)
- {
- /* Text has same color -> invisible */
- return;
- }
-
- ptColor = SetTextColor(drawItem->hDC, ntColor);
- pbkColor = SetBkColor(drawItem->hDC, nbkColor);
- DrawText(drawItem->hDC, szText, _tcslen(szText), &drawItem->rcItem, 0);
- SetTextColor(drawItem->hDC, ptColor);
- SetBkColor(drawItem->hDC, pbkColor);
- DeleteObject((HGDIOBJ)hBrush);
+ PGUI_CONSOLE_INFO GuiInfo = pConInfo->TerminalInfo.TermInfo;
+ USHORT CurrentAttrib;
+ COLORREF pbkColor, ptColor;
+ COLORREF nbkColor, ntColor;
+ HBRUSH hBrush;
+ HFONT Font, OldFont;
+
+ if (TextMode == Screen)
+ CurrentAttrib = pConInfo->ci.ScreenAttrib;
+ else if (TextMode == Popup)
+ CurrentAttrib = pConInfo->ci.PopupAttrib;
+ else
+ return FALSE;
+
+ nbkColor = pConInfo->ci.Colors[BkgdAttribFromAttrib(CurrentAttrib)];
+ ntColor = pConInfo->ci.Colors[TextAttribFromAttrib(CurrentAttrib)];
+
+ hBrush = CreateSolidBrush(nbkColor);
+ if (!hBrush) return FALSE;
+
+ Font = CreateFontW(GuiInfo->FontSize.Y,
+ 0, // GuiInfo->FontSize.X,
+ 0,
+ TA_BASELINE,
+ GuiInfo->FontWeight,
+ FALSE,
+ FALSE,
+ FALSE,
+ OEM_CHARSET,
+ OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS,
+ NONANTIALIASED_QUALITY,
+ FIXED_PITCH | GuiInfo->FontFamily /* FF_DONTCARE */,
+ GuiInfo->FaceName);
+ if (Font == NULL)
+ {
+ DPRINT1("PaintText: CreateFont failed\n");
+ return FALSE;
+ }
+
+ OldFont = SelectObject(drawItem->hDC, Font);
+ if (OldFont == NULL)
+ {
+ DeleteObject(Font);
+ return FALSE;
+ }
+
+ FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
+
+ ptColor = SetTextColor(drawItem->hDC, ntColor);
+ pbkColor = SetBkColor(drawItem->hDC, nbkColor);
+ DrawTextW(drawItem->hDC, szPreviewText, wcslen(szPreviewText), &drawItem->rcItem, 0);
+ SetTextColor(drawItem->hDC, ptColor);
+ SetBkColor(drawItem->hDC, pbkColor);
+ DeleteObject((HGDIOBJ)hBrush);
+
+ SelectObject(drawItem->hDC, OldFont);
+ DeleteObject(Font);
+
+ return TRUE;
}
-
INT_PTR
CALLBACK
-LayoutProc(
- HWND hwndDlg,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam
-)
+LayoutProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
{
- LPNMUPDOWN lpnmud;
- LPPSHNOTIFY lppsn;
- PConsoleInfo pConInfo = (PConsoleInfo)GetWindowLongPtr(hwndDlg, DWLP_USER);
-
- UNREFERENCED_PARAMETER(hwndDlg);
- UNREFERENCED_PARAMETER(wParam);
-
- switch(uMsg)
- {
- case WM_INITDIALOG:
- {
- DWORD xres, yres;
- HDC hDC;
- pConInfo = (PConsoleInfo) ((LPPROPSHEETPAGE)lParam)->lParam;
- SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo);
- SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, HIWORD(pConInfo->ScreenBuffer), FALSE);
- SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, LOWORD(pConInfo->ScreenBuffer), FALSE);
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, HIWORD(pConInfo->WindowSize), FALSE);
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, LOWORD(pConInfo->WindowSize), FALSE);
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_SCREEN_BUFFER_HEIGHT), UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_SCREEN_BUFFER_WIDTH), UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_SIZE_HEIGHT), UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_SIZE_WIDTH), UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
-
- hDC = GetDC(NULL);
- xres = GetDeviceCaps(hDC, HORZRES);
- yres = GetDeviceCaps(hDC, VERTRES);
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT), UDM_SETRANGE, 0, (LPARAM)MAKELONG(xres, 0));
- SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP), UDM_SETRANGE, 0, (LPARAM)MAKELONG(yres, 0));
-
- if (pConInfo->WindowPosition != MAXDWORD)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, LOWORD(pConInfo->WindowPosition), FALSE);
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, HIWORD(pConInfo->WindowPosition), FALSE);
- }
- else
- {
- // FIXME: Calculate window pos from xres, yres
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, 88, FALSE);
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, 88, FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP), FALSE);
- SendMessage(GetDlgItem(hwndDlg, IDC_CHECK_SYSTEM_POS_WINDOW), BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
- }
-
- return TRUE;
- }
- case WM_DRAWITEM:
- {
- PaintConsole((LPDRAWITEMSTRUCT)lParam, pConInfo);
- return TRUE;
- }
- case WM_NOTIFY:
- {
- lpnmud = (LPNMUPDOWN) lParam;
- lppsn = (LPPSHNOTIFY) lParam;
-
- if (lppsn->hdr.code == UDN_DELTAPOS)
- {
- DWORD wheight, wwidth;
- DWORD sheight, swidth;
- DWORD left, top;
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_WIDTH)
- {
- wwidth = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- wwidth = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_HEIGHT)
- {
- wheight = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- wheight = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_WIDTH)
- {
- swidth = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- swidth = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_HEIGHT)
- {
- sheight = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- sheight = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_LEFT)
- {
- left = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_TOP)
- {
- top = lpnmud->iPos + lpnmud->iDelta;
- }
- else
- {
- top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, NULL, FALSE);
- }
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_WIDTH || lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_HEIGHT)
- {
- /* Automatically adjust screen buffer size when window size enlarges */
- if (wwidth >= swidth)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, wwidth, TRUE);
- swidth = wwidth;
- }
-
- if (wheight >= sheight)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, wheight, TRUE);
- sheight = wheight;
- }
- }
- swidth = max(swidth, 1);
- sheight = max(sheight, 1);
-
- if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_WIDTH || lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_HEIGHT)
- {
- /* Automatically adjust window size when screen buffer decreases */
- if (wwidth > swidth)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, swidth, TRUE);
- wwidth = swidth;
- }
-
- if (wheight > sheight)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, sheight, TRUE);
- wheight = sheight;
- }
- }
-
- pConInfo->ScreenBuffer = MAKELONG(swidth, sheight);
- pConInfo->WindowSize = MAKELONG(wwidth, wheight);
- pConInfo->WindowPosition = MAKELONG(left, top);
- PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
- }
- break;
- }
- case WM_COMMAND:
- {
- switch(LOWORD(wParam))
- {
- case IDC_EDIT_SCREEN_BUFFER_WIDTH:
- case IDC_EDIT_SCREEN_BUFFER_HEIGHT:
- case IDC_EDIT_WINDOW_SIZE_WIDTH:
- case IDC_UPDOWN_WINDOW_SIZE_HEIGHT:
- case IDC_EDIT_WINDOW_POS_LEFT:
- case IDC_EDIT_WINDOW_POS_TOP:
- {
- if (HIWORD(wParam) == EN_KILLFOCUS)
- {
- DWORD wheight, wwidth;
- DWORD sheight, swidth;
- DWORD left, top;
-
- wwidth = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, NULL, FALSE);
- wheight = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, NULL, FALSE);
- swidth = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, NULL, FALSE);
- sheight = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, NULL, FALSE);
- left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, FALSE);
- top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, NULL, FALSE);
-
- swidth = max(swidth, 1);
- sheight = max(sheight, 1);
-
- /* Automatically adjust window size when screen buffer decreases */
- if (wwidth > swidth)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, swidth, TRUE);
- wwidth = swidth;
- }
-
- if (wheight > sheight)
- {
- SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, sheight, TRUE);
- wheight = sheight;
- }
-
-
- pConInfo->ScreenBuffer = MAKELONG(swidth, sheight);
- pConInfo->WindowSize = MAKELONG(wwidth, wheight);
- pConInfo->WindowPosition = MAKELONG(left, top);
-
- PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
- }
- break;
- }
-
- case IDC_CHECK_SYSTEM_POS_WINDOW:
- {
- LONG res = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
- if (res == BST_CHECKED)
- {
- ULONG left, top;
-
- left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, FALSE);
- top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, NULL, FALSE);
- pConInfo->WindowPosition = MAKELONG(left, top);
- SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT), TRUE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP), TRUE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT), TRUE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP), TRUE);
- }
- else if (res == BST_UNCHECKED)
- {
- pConInfo->WindowPosition = UINT_MAX;
- SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP), FALSE);
- }
- }
- }
- }
- default:
- break;
- }
-
- return FALSE;
+ PCONSOLE_PROPS pConInfo = (PCONSOLE_PROPS)GetWindowLongPtr(hwndDlg, DWLP_USER);
+ PGUI_CONSOLE_INFO GuiInfo = (pConInfo ? pConInfo->TerminalInfo.TermInfo : NULL);
+
+ UNREFERENCED_PARAMETER(hwndDlg);
+ UNREFERENCED_PARAMETER(wParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ /* Multi-monitor support */
+ LONG xVirtScr, yVirtScr; // Coordinates of the top-left virtual screen
+ LONG cxVirtScr, cyVirtScr; // Width and Height of the virtual screen
+ LONG cxFrame , cyFrame ; // Thickness of the window frame
+
+ pConInfo = (PCONSOLE_PROPS)((LPPROPSHEETPAGE)lParam)->lParam;
+ GuiInfo = pConInfo->TerminalInfo.TermInfo;
+ SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo);
+
+ /* Multi-monitor support */
+ xVirtScr = GetSystemMetrics(SM_XVIRTUALSCREEN);
+ yVirtScr = GetSystemMetrics(SM_YVIRTUALSCREEN);
+ cxVirtScr = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+ cyVirtScr = GetSystemMetrics(SM_CYVIRTUALSCREEN);
+ cxFrame = GetSystemMetrics(SM_CXFRAME);
+ cyFrame = GetSystemMetrics(SM_CYFRAME);
+
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_SCREEN_BUFFER_HEIGHT, UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_SCREEN_BUFFER_WIDTH , UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_WINDOW_SIZE_HEIGHT, UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_WINDOW_SIZE_WIDTH , UDM_SETRANGE, 0, (LPARAM)MAKELONG(9999, 1));
+
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, pConInfo->ci.ScreenBufferSize.Y, FALSE);
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH , pConInfo->ci.ScreenBufferSize.X, FALSE);
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, pConInfo->ci.ConsoleSize.Y, FALSE);
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH , pConInfo->ci.ConsoleSize.X, FALSE);
+
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT, UDM_SETRANGE, 0,
+ (LPARAM)MAKELONG(xVirtScr + cxVirtScr - cxFrame, xVirtScr - cxFrame));
+ SendDlgItemMessageW(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP , UDM_SETRANGE, 0,
+ (LPARAM)MAKELONG(yVirtScr + cyVirtScr - cyFrame, yVirtScr - cyFrame));
+
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, GuiInfo->WindowOrigin.x, TRUE);
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , GuiInfo->WindowOrigin.y, TRUE);
+
+ if (GuiInfo->AutoPosition)
+ {
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , FALSE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP , FALSE);
+ }
+ CheckDlgButton(hwndDlg, IDC_CHECK_SYSTEM_POS_WINDOW,
+ GuiInfo->AutoPosition ? BST_CHECKED : BST_UNCHECKED);
+
+ return TRUE;
+ }
+
+ case WM_DRAWITEM:
+ {
+ PaintConsole((LPDRAWITEMSTRUCT)lParam, pConInfo);
+ return TRUE;
+ }
+
+ case WM_NOTIFY:
+ {
+ LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
+ LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam;
+
+ if (lppsn->hdr.code == UDN_DELTAPOS)
+ {
+ DWORD wheight, wwidth;
+ DWORD sheight, swidth;
+ DWORD left, top;
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_WIDTH)
+ {
+ wwidth = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ wwidth = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, NULL, FALSE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_HEIGHT)
+ {
+ wheight = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ wheight = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, NULL, FALSE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_WIDTH)
+ {
+ swidth = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ swidth = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, NULL, FALSE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_HEIGHT)
+ {
+ sheight = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ sheight = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, NULL, FALSE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_LEFT)
+ {
+ left = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, TRUE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_TOP)
+ {
+ top = lpnmud->iPos + lpnmud->iDelta;
+ }
+ else
+ {
+ top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP, NULL, TRUE);
+ }
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_WIDTH || lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_SIZE_HEIGHT)
+ {
+ /* Automatically adjust screen buffer size when window size enlarges */
+ if (wwidth >= swidth)
+ {
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, wwidth, TRUE);
+ swidth = wwidth;
+ }
+ if (wheight >= sheight)
+ {
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, wheight, TRUE);
+ sheight = wheight;
+ }
+ }
+
+ /* Be sure that the (new) screen buffer sizes are in the correct range */
+ swidth = min(max(swidth , 1), 0xFFFF);
+ sheight = min(max(sheight, 1), 0xFFFF);
+
+ if (lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_WIDTH || lppsn->hdr.idFrom == IDC_UPDOWN_SCREEN_BUFFER_HEIGHT)
+ {
+ /* Automatically adjust window size when screen buffer decreases */
+ if (wwidth > swidth)
+ {
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, swidth, TRUE);
+ wwidth = swidth;
+ }
+ if (wheight > sheight)
+ {
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, sheight, TRUE);
+ wheight = sheight;
+ }
+ }
+
+ pConInfo->ci.ScreenBufferSize.X = (SHORT)swidth;
+ pConInfo->ci.ScreenBufferSize.Y = (SHORT)sheight;
+ pConInfo->ci.ConsoleSize.X = (SHORT)wwidth;
+ pConInfo->ci.ConsoleSize.Y = (SHORT)wheight;
+ GuiInfo->WindowOrigin.x = left;
+ GuiInfo->WindowOrigin.y = top;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDC_EDIT_SCREEN_BUFFER_WIDTH:
+ {
+ if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ DWORD swidth, wwidth;
+
+ swidth = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, NULL, FALSE);
+ wwidth = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH , NULL, FALSE);
+
+ /* Be sure that the (new) screen buffer width is in the correct range */
+ swidth = min(max(swidth, 1), 0xFFFF);
+
+ /* Automatically adjust window size when screen buffer decreases */
+ if (wwidth > swidth)
+ {
+ wwidth = swidth;
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH, wwidth, TRUE);
+ }
+
+ pConInfo->ci.ScreenBufferSize.X = (SHORT)swidth;
+ pConInfo->ci.ConsoleSize.X = (SHORT)wwidth;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case IDC_EDIT_WINDOW_SIZE_WIDTH:
+ {
+ if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ DWORD swidth, wwidth;
+
+ swidth = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, NULL, FALSE);
+ wwidth = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_WIDTH , NULL, FALSE);
+
+ /* Automatically adjust screen buffer size when window size enlarges */
+ if (wwidth >= swidth)
+ {
+ swidth = wwidth;
+
+ /* Be sure that the (new) screen buffer width is in the correct range */
+ swidth = min(max(swidth, 1), 0xFFFF);
+
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_WIDTH, swidth, TRUE);
+ }
+
+ pConInfo->ci.ScreenBufferSize.X = (SHORT)swidth;
+ pConInfo->ci.ConsoleSize.X = (SHORT)wwidth;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case IDC_EDIT_SCREEN_BUFFER_HEIGHT:
+ {
+ if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ DWORD sheight, wheight;
+
+ sheight = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, NULL, FALSE);
+ wheight = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT , NULL, FALSE);
+
+ /* Be sure that the (new) screen buffer width is in the correct range */
+ sheight = min(max(sheight, 1), 0xFFFF);
+
+ /* Automatically adjust window size when screen buffer decreases */
+ if (wheight > sheight)
+ {
+ wheight = sheight;
+ SetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT, wheight, TRUE);
+ }
+
+ pConInfo->ci.ScreenBufferSize.Y = (SHORT)sheight;
+ pConInfo->ci.ConsoleSize.Y = (SHORT)wheight;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case IDC_EDIT_WINDOW_SIZE_HEIGHT:
+ {
+ if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ DWORD sheight, wheight;
+
+ sheight = GetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, NULL, FALSE);
+ wheight = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_SIZE_HEIGHT , NULL, FALSE);
+
+ /* Automatically adjust screen buffer size when window size enlarges */
+ if (wheight >= sheight)
+ {
+ sheight = wheight;
+
+ /* Be sure that the (new) screen buffer width is in the correct range */
+ sheight = min(max(sheight, 1), 0xFFFF);
+
+ SetDlgItemInt(hwndDlg, IDC_EDIT_SCREEN_BUFFER_HEIGHT, sheight, TRUE);
+ }
+
+ pConInfo->ci.ScreenBufferSize.Y = (SHORT)sheight;
+ pConInfo->ci.ConsoleSize.Y = (SHORT)wheight;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case IDC_EDIT_WINDOW_POS_LEFT:
+ case IDC_EDIT_WINDOW_POS_TOP:
+ {
+ if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ DWORD left, top;
+
+ left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, TRUE);
+ top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , NULL, TRUE);
+
+ GuiInfo->WindowOrigin.x = left;
+ GuiInfo->WindowOrigin.y = top;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ break;
+ }
+
+ case IDC_CHECK_SYSTEM_POS_WINDOW:
+ {
+ LONG res = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
+ if (res == BST_CHECKED)
+ {
+ ULONG left, top;
+
+ left = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, NULL, TRUE);
+ top = GetDlgItemInt(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , NULL, TRUE);
+
+ GuiInfo->AutoPosition = FALSE;
+ GuiInfo->WindowOrigin.x = left;
+ GuiInfo->WindowOrigin.y = top;
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+
+ SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, TRUE);
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , TRUE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT, TRUE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP , TRUE);
+ }
+ else if (res == BST_UNCHECKED)
+ {
+ GuiInfo->AutoPosition = TRUE;
+ // Do not touch GuiInfo->WindowOrigin !!
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+
+ SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_LEFT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_EDIT_WINDOW_POS_TOP , FALSE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_LEFT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_UPDOWN_WINDOW_POS_TOP , FALSE);
+ }
+ }
+ }
+ }
+
+ default:
+ break;
+ }
+
+ return FALSE;
}