ReactOS 0.4.16-dev-88-ga65b6ae
layout.c File Reference
#include "console.h"
#include <debug.h>
Include dependency graph for layout.c:

Go to the source code of this file.

Classes

struct  _WINPREV_DATA
 

Macros

#define NDEBUG
 
#define WIN_PREVIEW_CLASS   L"WinPreview"
 
#define RescaleCX(pData, len)    MulDiv((len), (pData)->siPreview.cx, (pData)->siVirtScr.cx)
 
#define RescaleCY(pData, len)    MulDiv((len), (pData)->siPreview.cy, (pData)->siVirtScr.cy)
 
#define RescaleRect(pData, rect)
 

Typedefs

typedef struct _WINPREV_DATA WINPREV_DATA
 
typedef struct _WINPREV_DATAPWINPREV_DATA
 

Functions

static LRESULT CALLBACK WinPrevProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
BOOL RegisterWinPrevClass (IN HINSTANCE hInstance)
 
BOOL UnRegisterWinPrevClass (IN HINSTANCE hInstance)
 
static VOID WinPrev_OnDisplayChange (IN PWINPREV_DATA pData)
 
static VOID WinPrev_OnDraw (IN HDC hDC, IN PWINPREV_DATA pData)
 
VOID PaintText (IN LPDRAWITEMSTRUCT drawItem, IN PCONSOLE_STATE_INFO pConInfo, IN TEXT_TYPE TextMode)
 
INT_PTR CALLBACK LayoutProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 

Variables

const WCHAR szPreviewText []
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file layout.c.

◆ RescaleCX

#define RescaleCX (   pData,
  len 
)     MulDiv((len), (pData)->siPreview.cx, (pData)->siVirtScr.cx)

Definition at line 116 of file layout.c.

◆ RescaleCY

#define RescaleCY (   pData,
  len 
)     MulDiv((len), (pData)->siPreview.cy, (pData)->siVirtScr.cy)

Definition at line 119 of file layout.c.

◆ RescaleRect

#define RescaleRect (   pData,
  rect 
)
Value:
do { \
(rect).top = RescaleCY((pData), (rect).top); \
} while (0)
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLdouble GLdouble right
Definition: glext.h:10859
GLint left
Definition: glext.h:7726
GLint GLint bottom
Definition: glext.h:7726
#define RescaleCY(pData, len)
Definition: layout.c:119
#define RescaleCX(pData, len)
Definition: layout.c:116
& rect
Definition: startmenu.cpp:1413
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830

Definition at line 122 of file layout.c.

◆ WIN_PREVIEW_CLASS

#define WIN_PREVIEW_CLASS   L"WinPreview"

Definition at line 17 of file layout.c.

Typedef Documentation

◆ PWINPREV_DATA

◆ WINPREV_DATA

Function Documentation

◆ LayoutProc()

INT_PTR CALLBACK LayoutProc ( HWND  hDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 525 of file layout.c.

529{
530 switch (uMsg)
531 {
532 case WM_INITDIALOG:
533 {
534 /* Multi-monitor support */
535 LONG xVirtScr, yVirtScr; // Coordinates of the top-left virtual screen
536 LONG cxVirtScr, cyVirtScr; // Width and Height of the virtual screen
537 LONG cxFrame , cyFrame ; // Thickness of the window frame
538
543 cxFrame = GetSystemMetrics(SM_CXFRAME);
544 cyFrame = GetSystemMetrics(SM_CYFRAME);
545
550
555
557 (LPARAM)MAKELONG(xVirtScr + cxVirtScr - cxFrame, xVirtScr - cxFrame));
559 (LPARAM)MAKELONG(yVirtScr + cyVirtScr - cyFrame, yVirtScr - cyFrame));
560
563
565 {
570 }
573
574 return TRUE;
575 }
576
577 case WM_DISPLAYCHANGE:
578 {
579 /* Retransmit to the preview window */
581 WM_DISPLAYCHANGE, wParam, lParam);
582 break;
583 }
584
585 case WM_NOTIFY:
586 {
588
589 if (lppsn->hdr.code == UDN_DELTAPOS)
590 {
591 LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
592 DWORD wheight, wwidth;
593 DWORD sheight, swidth;
594 DWORD left, top;
595
597 {
598 wwidth = lpnmud->iPos + lpnmud->iDelta;
599 }
600 else
601 {
603 }
604
606 {
607 wheight = lpnmud->iPos + lpnmud->iDelta;
608 }
609 else
610 {
612 }
613
615 {
616 swidth = lpnmud->iPos + lpnmud->iDelta;
617 }
618 else
619 {
621 }
622
624 {
625 sheight = lpnmud->iPos + lpnmud->iDelta;
626 }
627 else
628 {
630 }
631
633 {
634 left = lpnmud->iPos + lpnmud->iDelta;
635 }
636 else
637 {
639 }
640
642 {
643 top = lpnmud->iPos + lpnmud->iDelta;
644 }
645 else
646 {
648 }
649
651 {
652 /* Automatically adjust screen buffer size when window size enlarges */
653 if (wwidth >= swidth)
654 {
656 swidth = wwidth;
657 }
658 if (wheight >= sheight)
659 {
661 sheight = wheight;
662 }
663 }
664
665 /* Be sure that the (new) screen buffer sizes are in the correct range */
666 swidth = min(max(swidth , 1), 0xFFFF);
667 sheight = min(max(sheight, 1), 0xFFFF);
668
670 {
671 /* Automatically adjust window size when screen buffer decreases */
672 if (wwidth > swidth)
673 {
675 wwidth = swidth;
676 }
677 if (wheight > sheight)
678 {
680 wheight = sheight;
681 }
682 }
683
684 ConInfo->ScreenBufferSize.X = (SHORT)swidth;
685 ConInfo->ScreenBufferSize.Y = (SHORT)sheight;
686 ConInfo->WindowSize.X = (SHORT)wwidth;
687 ConInfo->WindowSize.Y = (SHORT)wheight;
690
692 PropSheet_Changed(GetParent(hDlg), hDlg);
693 }
694 break;
695 }
696
697 case WM_COMMAND:
698 {
699 if (HIWORD(wParam) == EN_KILLFOCUS)
700 {
701 switch (LOWORD(wParam))
702 {
704 {
705 DWORD swidth, wwidth;
706
709
710 /* Be sure that the (new) screen buffer width is in the correct range */
711 swidth = min(max(swidth, 1), 0xFFFF);
712
713 /* Automatically adjust window size when screen buffer decreases */
714 if (wwidth > swidth)
715 {
716 wwidth = swidth;
718 }
719
720 ConInfo->ScreenBufferSize.X = (SHORT)swidth;
721 ConInfo->WindowSize.X = (SHORT)wwidth;
722
724 PropSheet_Changed(GetParent(hDlg), hDlg);
725 break;
726 }
727
729 {
730 DWORD swidth, wwidth;
731
734
735 /* Automatically adjust screen buffer size when window size enlarges */
736 if (wwidth >= swidth)
737 {
738 swidth = wwidth;
739
740 /* Be sure that the (new) screen buffer width is in the correct range */
741 swidth = min(max(swidth, 1), 0xFFFF);
742
744 }
745
746 ConInfo->ScreenBufferSize.X = (SHORT)swidth;
747 ConInfo->WindowSize.X = (SHORT)wwidth;
748
750 PropSheet_Changed(GetParent(hDlg), hDlg);
751 break;
752 }
753
755 {
756 DWORD sheight, wheight;
757
760
761 /* Be sure that the (new) screen buffer width is in the correct range */
762 sheight = min(max(sheight, 1), 0xFFFF);
763
764 /* Automatically adjust window size when screen buffer decreases */
765 if (wheight > sheight)
766 {
767 wheight = sheight;
769 }
770
771 ConInfo->ScreenBufferSize.Y = (SHORT)sheight;
772 ConInfo->WindowSize.Y = (SHORT)wheight;
773
775 PropSheet_Changed(GetParent(hDlg), hDlg);
776 break;
777 }
778
780 {
781 DWORD sheight, wheight;
782
785
786 /* Automatically adjust screen buffer size when window size enlarges */
787 if (wheight >= sheight)
788 {
789 sheight = wheight;
790
791 /* Be sure that the (new) screen buffer width is in the correct range */
792 sheight = min(max(sheight, 1), 0xFFFF);
793
795 }
796
797 ConInfo->ScreenBufferSize.Y = (SHORT)sheight;
798 ConInfo->WindowSize.Y = (SHORT)wheight;
799
801 PropSheet_Changed(GetParent(hDlg), hDlg);
802 break;
803 }
804
807 {
810
812 PropSheet_Changed(GetParent(hDlg), hDlg);
813 break;
814 }
815 }
816 }
817 else
818 if (HIWORD(wParam) == BN_CLICKED &&
820 {
822 {
827
829 // Do not touch ConInfo->WindowPosition !!
830
832 PropSheet_Changed(GetParent(hDlg), hDlg);
833 }
834 else
835 {
836 ULONG left, top;
837
840
845
849
851 PropSheet_Changed(GetParent(hDlg), hDlg);
852 }
853 }
854
855 break;
856 }
857
858 default:
859 break;
860 }
861
862 return FALSE;
863}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
PCONSOLE_STATE_INFO ConInfo
Definition: console.c:23
#define IDC_CHECK_SYSTEM_POS_WINDOW
Definition: resource.h:63
#define IDC_EDIT_WINDOW_SIZE_WIDTH
Definition: resource.h:55
#define IDC_UPDOWN_WINDOW_SIZE_WIDTH
Definition: resource.h:56
#define IDC_EDIT_WINDOW_POS_LEFT
Definition: resource.h:59
#define IDC_UPDOWN_WINDOW_SIZE_HEIGHT
Definition: resource.h:58
#define IDC_STATIC_LAYOUT_WINDOW_PREVIEW
Definition: resource.h:64
#define IDC_EDIT_WINDOW_POS_TOP
Definition: resource.h:61
#define IDC_UPDOWN_SCREEN_BUFFER_WIDTH
Definition: resource.h:51
#define IDC_UPDOWN_SCREEN_BUFFER_HEIGHT
Definition: resource.h:54
#define IDC_EDIT_SCREEN_BUFFER_HEIGHT
Definition: resource.h:53
#define IDC_EDIT_SCREEN_BUFFER_WIDTH
Definition: resource.h:52
#define IDC_EDIT_WINDOW_SIZE_HEIGHT
Definition: resource.h:57
#define IDC_UPDOWN_WINDOW_POS_LEFT
Definition: resource.h:60
#define IDC_UPDOWN_WINDOW_POS_TOP
Definition: resource.h:62
#define EnableDlgItem(hDlg, nID, bEnable)
Definition: eventvwr.h:55
unsigned long DWORD
Definition: ntddk_ex.h:95
#define min(a, b)
Definition: monoChain.cc:55
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
struct _PSHNOTIFY * LPPSHNOTIFY
#define UDM_SETRANGE
Definition: commctrl.h:2146
struct _NM_UPDOWN * LPNMUPDOWN
#define UDN_DELTAPOS
Definition: commctrl.h:2174
#define WM_NOTIFY
Definition: richedit.h:61
COORD ScreenBufferSize
Definition: settings.h:32
POINT WindowPosition
Definition: settings.h:34
ULONG Y
Definition: bl.h:1340
ULONG X
Definition: bl.h:1339
int iDelta
Definition: commctrl.h:2171
NMHDR hdr
Definition: prsht.h:330
UINT_PTR idFrom
Definition: winuser.h:3161
UINT code
Definition: winuser.h:3162
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define max(a, b)
Definition: svc.c:63
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
LONG_PTR LPARAM
Definition: windef.h:208
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1042
#define EN_KILLFOCUS
Definition: winuser.h:2028
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
#define BST_UNCHECKED
Definition: winuser.h:199
#define SM_CXFRAME
Definition: winuser.h:997
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_INITDIALOG
Definition: winuser.h:1742
#define SM_CYFRAME
Definition: winuser.h:999
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1041
BOOL WINAPI SetDlgItemInt(_In_ HWND, _In_ int, _In_ UINT, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define BN_CLICKED
Definition: winuser.h:1928
UINT WINAPI GetDlgItemInt(_In_ HWND, _In_ int, _Out_opt_ PBOOL, _In_ BOOL)
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1039
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
int WINAPI GetSystemMetrics(_In_ int)
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1040
#define BST_CHECKED
Definition: winuser.h:197

Referenced by InitApplet().

◆ PaintText()

VOID PaintText ( IN LPDRAWITEMSTRUCT  drawItem,
IN PCONSOLE_STATE_INFO  pConInfo,
IN TEXT_TYPE  TextMode 
)

Definition at line 471 of file layout.c.

475{
476 USHORT CurrentAttrib;
477 COLORREF pbkColor, ptColor;
478 COLORREF nbkColor, ntColor;
479 HBRUSH hBrush;
480 HFONT hOldFont;
481
482 if (TextMode == Screen)
483 CurrentAttrib = pConInfo->ScreenAttributes;
484 else if (TextMode == Popup)
485 CurrentAttrib = pConInfo->PopupAttributes;
486 else
487 return;
488
489 nbkColor = pConInfo->ColorTable[BkgdAttribFromAttrib(CurrentAttrib)];
490 ntColor = pConInfo->ColorTable[TextAttribFromAttrib(CurrentAttrib)];
491
492 /* Draw the console background */
493 hBrush = CreateSolidBrush(nbkColor);
494 FillRect(drawItem->hDC, &drawItem->rcItem, hBrush ? hBrush : GetStockObject(BLACK_BRUSH));
495 if (hBrush) DeleteObject(hBrush);
496
497 /* Refresh the font preview, getting a new font if necessary */
498 if (FontPreview.hFont == NULL)
500 /* Recheck hFont since RefreshFontPreview() may not have updated it */
501 if (FontPreview.hFont == NULL)
502 return;
503
504 /* Draw the preview text using the current font */
505 hOldFont = SelectObject(drawItem->hDC, FontPreview.hFont);
506 // if (!hOldFont) return;
507
508 /* Add a few space between the preview window border and the text sample */
509 InflateRect(&drawItem->rcItem, -2, -2);
510
511 ptColor = SetTextColor(drawItem->hDC, ntColor);
512 pbkColor = SetBkColor(drawItem->hDC, nbkColor);
513 DrawTextW(drawItem->hDC, szPreviewText, (INT)wcslen(szPreviewText), &drawItem->rcItem, 0);
514 SetTextColor(drawItem->hDC, ptColor);
515 SetBkColor(drawItem->hDC, pbkColor);
516
517 SelectObject(drawItem->hDC, hOldFont);
518}
@ Screen
Definition: console.h:34
@ Popup
Definition: console.h:35
FONT_PREVIEW FontPreview
Definition: font.c:21
VOID RefreshFontPreview(IN FONT_PREVIEW *Preview, IN PCONSOLE_STATE_INFO pConInfo)
Definition: font.c:52
pKey DeleteObject()
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
const WCHAR szPreviewText[]
Definition: layout.c:460
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
unsigned short USHORT
Definition: pedump.c:61
HFONT hFont
Definition: console.h:40
int32_t INT
Definition: typedefs.h:58
#define TextAttribFromAttrib(Attribute)
Definition: settings.h:72
#define BkgdAttribFromAttrib(Attribute)
Definition: settings.h:73
DWORD COLORREF
Definition: windef.h:300
HGDIOBJ WINAPI GetStockObject(_In_ int)
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:999
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
#define BLACK_BRUSH
Definition: wingdi.h:896
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)

Referenced by ColorsProc(), and FontProc().

◆ RegisterWinPrevClass()

BOOL RegisterWinPrevClass ( IN HINSTANCE  hInstance)

Definition at line 32 of file layout.c.

34{
36
37 WndClass.lpszClassName = WIN_PREVIEW_CLASS;
38 WndClass.lpfnWndProc = WinPrevProc;
39 WndClass.style = 0;
40 WndClass.hInstance = hInstance;
41 WndClass.hIcon = NULL;
43 WndClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
44 WndClass.lpszMenuName = NULL;
45 WndClass.cbClsExtra = 0;
46 WndClass.cbWndExtra = 0; // sizeof(PWINPREV_DATA);
47
48 return (RegisterClassW(&WndClass) != 0);
49}
WCHAR WndClass[]
Definition: capicon.c:23
HINSTANCE hInstance
Definition: charmap.c:19
#define WIN_PREVIEW_CLASS
Definition: layout.c:17
static LRESULT CALLBACK WinPrevProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: layout.c:398
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
#define IDC_ARROW
Definition: winuser.h:687
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2149
#define COLOR_BACKGROUND
Definition: winuser.h:916

Referenced by InitApplet().

◆ UnRegisterWinPrevClass()

BOOL UnRegisterWinPrevClass ( IN HINSTANCE  hInstance)

Definition at line 52 of file layout.c.

54{
56}
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)

Referenced by InitApplet().

◆ WinPrev_OnDisplayChange()

static VOID WinPrev_OnDisplayChange ( IN PWINPREV_DATA  pData)
static

Definition at line 59 of file layout.c.

61{
62 // RECT rcNew;
63
66
67 /*
68 * The rescaling factor "siPreview / siVirtScr" should be the minimum of the ratios
69 * pData->rcMaxArea.right / pData->siVirtScr.cx , and
70 * pData->rcMaxArea.bottom / pData->siVirtScr.cy ,
71 * or equivalently, the maximum of the inverse of these ratios.
72 * This condition is equivalent to the following inequality being tested.
73 */
74 // if (pData->siVirtScr.cx / pData->rcMaxArea.right >= pData->siVirtScr.cy / pData->rcMaxArea.bottom)
75 if (pData->siVirtScr.cx * pData->rcMaxArea.bottom >= pData->siVirtScr.cy * pData->rcMaxArea.right)
76 {
77 pData->siPreview.cx = MulDiv(pData->siVirtScr.cx, pData->rcMaxArea.right, pData->siVirtScr.cx);
78 pData->siPreview.cy = MulDiv(pData->siVirtScr.cy, pData->rcMaxArea.right, pData->siVirtScr.cx);
79 }
80 else
81 {
82 pData->siPreview.cx = MulDiv(pData->siVirtScr.cx, pData->rcMaxArea.bottom, pData->siVirtScr.cy);
83 pData->siPreview.cy = MulDiv(pData->siVirtScr.cy, pData->rcMaxArea.bottom, pData->siVirtScr.cy);
84 }
85
86 /*
87 * Now, the lengths in screen-units can be rescaled into preview-units with:
88 * MulDiv(cx, pData->siPreview.cx, pData->siVirtScr.cx);
89 * and:
90 * MulDiv(cy, pData->siPreview.cy, pData->siVirtScr.cy);
91 */
92
93#if 0 // TODO: Investigate!
94 /*
95 * Since both rcMaxArea and siPreview are client window area sizes,
96 * transform them into window sizes.
97 */
98 SetRect(&rcNew, 0, 0, pData->siPreview.cx, pData->siPreview.cy);
99 AdjustWindowRect(&rcNew,
100 WS_BORDER,
101 // GetWindowLongPtrW(pData->hWnd, GWL_STYLE) & ~WS_OVERLAPPED,
102 FALSE);
103 OffsetRect(&rcNew, -rcNew.left, -rcNew.top);
104 rcNew.right += 2;
105 rcNew.bottom += 2;
106#endif
107
108 SetWindowPos(pData->hWnd,
109 0 /* HWND_TOP */,
110 0, 0,
111 pData->siPreview.cx, pData->siPreview.cy,
112 // rcNew.right, rcNew.bottom,
114}
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
#define WS_BORDER
Definition: pedump.c:625
#define SWP_NOACTIVATE
Definition: winuser.h:1245
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOMOVE
Definition: winuser.h:1247
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SWP_NOZORDER
Definition: winuser.h:1250
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)

Referenced by WinPrevProc().

◆ WinPrev_OnDraw()

static VOID WinPrev_OnDraw ( IN HDC  hDC,
IN PWINPREV_DATA  pData 
)
static

Definition at line 138 of file layout.c.

141{
143 HBRUSH hBrush;
144 RECT rcWin, fRect;
145 SIZE /*siBorder,*/ siFrame, siButton, siScroll;
146 SIZE resize;
147
148 RECT rcItem;
149
150 GetClientRect(pData->hWnd, &rcItem);
151
152 /*
153 * Retrieve some system metrics and rescale them.
154 * They will be added separately, so that to always round the sizes up.
155 */
156
157 /* Don't care about border as it is almost always 1 and <= frame size */
158 /* Example: Frame = 4, or 13 ... while Border = 1 */
159 // siBorder.cx = GetSystemMetrics(SM_CXBORDER);
160 // siBorder.cy = GetSystemMetrics(SM_CYBORDER);
161
162 /* Window frame size */
163 siFrame.cx = GetSystemMetrics(SM_CXFRAME);
164 if (siFrame.cx > 0)
165 {
166 siFrame.cx = RescaleCX(pData, siFrame.cx);
167 siFrame.cx = max(1, siFrame.cx);
168 }
169 siFrame.cy = GetSystemMetrics(SM_CYFRAME);
170 if (siFrame.cy > 0)
171 {
172 siFrame.cy = RescaleCY(pData, siFrame.cy);
173 siFrame.cy = max(1, siFrame.cy);
174 }
175
176 /* Window caption buttons */
177 siButton.cx = GetSystemMetrics(SM_CXSIZE);
178 siButton.cx = RescaleCX(pData, siButton.cx);
179 siButton.cx = max(1, siButton.cx);
180
181 siButton.cy = GetSystemMetrics(SM_CYSIZE);
182 siButton.cy = RescaleCY(pData, siButton.cy);
183 siButton.cy = max(1, siButton.cy);
184
185 /* Enlarge them for improving their appearance */
186 // siButton.cx *= 2;
187 siButton.cy *= 2;
188
189 /* Dimensions of the scrollbars */
190 siScroll.cx = GetSystemMetrics(SM_CXVSCROLL);
191 siScroll.cx = RescaleCX(pData, siScroll.cx);
192 siScroll.cx = max(1, siScroll.cx);
193
194 siScroll.cy = GetSystemMetrics(SM_CYHSCROLL);
195 siScroll.cy = RescaleCY(pData, siScroll.cy);
196 siScroll.cy = max(1, siScroll.cy);
197
198
199 // FIXME: Use SM_CXMIN, SM_CYMIN ??
200
201
202 /*
203 * Compute the console window layout
204 */
205
206 if (FontPreview.hFont == NULL)
208
209 /* We start with the console client area, rescaled for the preview */
210 SetRect(&rcWin, 0, 0,
211 pConInfo->WindowSize.X * FontPreview.CharWidth,
212 pConInfo->WindowSize.Y * FontPreview.CharHeight);
213 RescaleRect(pData, rcWin);
214
215 /* Add the scrollbars if needed (does not account for any frame) */
216 if (pConInfo->WindowSize.X < pConInfo->ScreenBufferSize.X)
217 {
218 /* Horizontal scrollbar */
219 rcWin.bottom += siScroll.cy;
220 // NOTE: If an additional exterior frame is needed, add +1
221 }
222 else
223 {
224 /* No scrollbar */
225 siScroll.cy = 0;
226 }
227 if (pConInfo->WindowSize.Y < pConInfo->ScreenBufferSize.Y)
228 {
229 /* Vertical scrollbar */
230 rcWin.right += siScroll.cx;
231 // NOTE: If an additional exterior frame is needed, add +1
232 }
233 else
234 {
235 /* No scrollbar */
236 siScroll.cx = 0;
237 }
238
239 /* Add the title bar, taking into account the frames */
240 rcWin.top -= siButton.cy - 1;
241
242 /* If we have a non-zero window frame size, add an interior border and the frame */
243 resize.cx = (siFrame.cx > 0 ? 1 + siFrame.cx : 0);
244 resize.cy = (siFrame.cy > 0 ? 1 + siFrame.cy : 0);
245
246 /* Add the outer border */
247 ++resize.cx, ++resize.cy;
248
249 InflateRect(&rcWin, resize.cx, resize.cy);
250
251 /* Finally, move the window rectangle back to its correct origin */
252 OffsetRect(&rcWin, -rcWin.left, -rcWin.top);
253
254 if ( pConInfo->WindowPosition.x == MAXDWORD &&
255 pConInfo->WindowPosition.y == MAXDWORD )
256 {
257 // OffsetRect(&rcWin, (rcItem.right - rcItem.left) / 3, (rcItem.bottom - rcItem.top) / 3);
258 OffsetRect(&rcWin, 0, 0);
259 }
260 else
261 {
262 OffsetRect(&rcWin,
263 RescaleCX(pData, pConInfo->WindowPosition.x),
264 RescaleCY(pData, pConInfo->WindowPosition.y));
265 }
266
267
268 /*
269 * Paint the preview window
270 */
271
272 /* Fill the background with desktop colour */
274
275 /*
276 * Draw the exterior frame. Use 'FillRect' instead of 'FrameRect'
277 * so that, when we want to draw frames around other elements,
278 * we can just instead separate them with space instead of redrawing
279 * a frame with 'FrameRect'.
280 */
282 InflateRect(&rcWin, -1, -1);
283
284 /* Draw the border */
286 if (siFrame.cx > 0)
287 {
288 SetRect(&fRect, rcWin.left, rcWin.top, rcWin.left + siFrame.cx, rcWin.bottom);
289 FillRect(hDC, &fRect, hBrush);
290 SetRect(&fRect, rcWin.right - siFrame.cx, rcWin.top, rcWin.right, rcWin.bottom);
291 FillRect(hDC, &fRect, hBrush);
292
293 InflateRect(&rcWin, -siFrame.cx, 0);
294 }
295 if (siFrame.cy > 0)
296 {
297 SetRect(&fRect, rcWin.left, rcWin.top, rcWin.right, rcWin.top + siFrame.cy);
298 FillRect(hDC, &fRect, hBrush);
299 SetRect(&fRect, rcWin.left, rcWin.bottom - siFrame.cy, rcWin.right, rcWin.bottom);
300 FillRect(hDC, &fRect, hBrush);
301
302 InflateRect(&rcWin, 0, -siFrame.cy);
303 }
304
305 /* Draw the interior frame if we had a border */
306 if (siFrame.cx > 0 || siFrame.cy > 0)
307 {
308#if 0 // See the remark above
309 SetRect(&fRect, rcWin.left, rcWin.top, rcWin.right, rcWin.bottom);
311#endif
312 InflateRect(&rcWin, (siFrame.cx > 0 ? -1 : 0), (siFrame.cy > 0 ? -1 : 0));
313 }
314
315 /* Draw the console window title bar */
317
318 /* Draw the system menu (left button) */
319 SetRect(&fRect, rcWin.left, rcWin.top, rcWin.left + siButton.cx, rcWin.top + siButton.cy - 2);
320 // DrawFrameControl(hDC, &fRect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
321 FillRect(hDC, &fRect, hBrush);
322 fRect.right++; // Separation
323
324 /* Draw the caption bar */
325 SetRect(&fRect, fRect.right, fRect.top, rcWin.right - 2 * (siButton.cx + 1), fRect.bottom);
327 fRect.right++; // Separation
328
329 /* Draw the minimize menu (first right button) */
330 SetRect(&fRect, fRect.right, fRect.top, fRect.right + siButton.cx, fRect.bottom);
331 // DrawFrameControl(hDC, &fRect, DFC_CAPTION, DFCS_CAPTIONMIN);
332 FillRect(hDC, &fRect, hBrush);
333 fRect.right++; // Separation
334
335 /* Draw the maximize menu (second right button) */
336 SetRect(&fRect, fRect.right, fRect.top, fRect.right + siButton.cx, fRect.bottom);
337 // DrawFrameControl(hDC, &fRect, DFC_CAPTION, DFCS_CAPTIONMAX);
338 FillRect(hDC, &fRect, hBrush);
339
340 rcWin.top += siButton.cy - 1;
341
342 /* Add the scrollbars if needed */
343 if (siScroll.cy > 0 || siScroll.cx > 0)
344 {
346
347 right = rcWin.right;
348 bottom = rcWin.bottom;
349
350 /*
351 * If both the horizontal and vertical scrollbars are present,
352 * reserve some space for the "dead square" at the bottom right.
353 */
354 if (siScroll.cy > 0 && siScroll.cx > 0)
355 {
356 right -= (1 + siScroll.cx);
357 bottom -= (1 + siScroll.cy);
358 }
359
361
362 /* Horizontal scrollbar */
363 if (siScroll.cy > 0)
364 {
365 SetRect(&fRect, rcWin.left, rcWin.bottom - siScroll.cy, right, rcWin.bottom);
366 FillRect(hDC, &fRect, hBrush);
367 }
368
369 /* Vertical scrollbar */
370 if (siScroll.cx > 0)
371 {
372 SetRect(&fRect, rcWin.right - siScroll.cx, rcWin.top, rcWin.right, bottom);
373 FillRect(hDC, &fRect, hBrush);
374 }
375
376 /*
377 * If both the horizontal and vertical scrollbars are present,
378 * draw the "dead square" at the bottom right.
379 */
380 if (siScroll.cy > 0 && siScroll.cx > 0)
381 {
382 SetRect(&fRect, rcWin.right - siScroll.cx, rcWin.bottom - siScroll.cy, rcWin.right, rcWin.bottom);
383 FillRect(hDC, &fRect, hBrush);
384 }
385
386 // NOTE: If an additional exterior frame is needed, remove +1 for each direction
387 rcWin.right -= siScroll.cx;
388 rcWin.bottom -= siScroll.cy;
389 }
390
391 /* Draw the console background */
393 FillRect(hDC, &rcWin, hBrush ? hBrush : GetStockObject(BLACK_BRUSH));
394 if (hBrush) DeleteObject(hBrush);
395}
static HDC hDC
Definition: 3dtext.c:33
#define RescaleRect(pData, rect)
Definition: layout.c:122
#define MAXDWORD
COLORREF ColorTable[16]
Definition: settings.h:53
USHORT ScreenAttributes
Definition: settings.h:47
UINT CharWidth
Definition: console.h:41
UINT CharHeight
Definition: console.h:42
struct _CONSOLE_STATE_INFO * PCONSOLE_STATE_INFO
int WINAPI FrameRect(_In_ HDC, _In_ LPCRECT, _In_ HBRUSH)
#define COLOR_SCROLLBAR
Definition: winuser.h:915
#define COLOR_WINDOWFRAME
Definition: winuser.h:922
#define SM_CYSIZE
Definition: winuser.h:995
#define SM_CXVSCROLL
Definition: winuser.h:964
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define COLOR_ACTIVECAPTION
Definition: winuser.h:918
#define SM_CXSIZE
Definition: winuser.h:994
#define SM_CYHSCROLL
Definition: winuser.h:965
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define COLOR_ACTIVEBORDER
Definition: winuser.h:926
#define COLOR_BTNFACE
Definition: winuser.h:931

Referenced by WinPrevProc().

◆ WinPrevProc()

static LRESULT CALLBACK WinPrevProc ( HWND  hWnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 398 of file layout.c.

399{
401
403
404 switch (msg)
405 {
406 case WM_CREATE:
407 {
409 if (!pData)
410 {
411 /* We failed to allocate our private data, halt the window creation */
412 return (LRESULT)-1;
413 }
414 pData->hWnd = hWnd;
415 pData->pData = ConInfo;
416 GetClientRect(pData->hWnd, &pData->rcMaxArea);
417 // LPCREATESTRUCT::cx and cy give window (not client) size
420 break;
421 }
422
423 case WM_DESTROY:
424 {
425 if (pData)
427 break;
428 }
429
430 case WM_DISPLAYCHANGE:
431 {
434 // InvalidateRect(hWnd, NULL, FALSE);
435 break;
436 }
437
438 case WM_SIZE:
439 break;
440
441 case WM_ERASEBKGND:
442 return 1;
443
444 case WM_PAINT:
445 {
446 PAINTSTRUCT ps;
447 BeginPaint(hWnd, &ps);
449 EndPaint(hWnd, &ps);
450 return 0;
451 }
452 }
453
455}
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static VOID WinPrev_OnDisplayChange(IN PWINPREV_DATA pData)
Definition: layout.c:59
struct _WINPREV_DATA * PWINPREV_DATA
static VOID WinPrev_OnDraw(IN HDC hDC, IN PWINPREV_DATA pData)
Definition: layout.c:138
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define GWLP_USERDATA
Definition: treelist.c:63
LONG_PTR LRESULT
Definition: windef.h:209
#define WM_PAINT
Definition: winuser.h:1623
#define WM_ERASEBKGND
Definition: winuser.h:1628
#define GetWindowLongPtrW
Definition: winuser.h:4832
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_CREATE
Definition: winuser.h:1611
#define WM_SIZE
Definition: winuser.h:1614
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI UpdateWindow(_In_ HWND)
#define WM_DESTROY
Definition: winuser.h:1612
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define SetWindowLongPtrW
Definition: winuser.h:5358

Referenced by RegisterWinPrevClass().

Variable Documentation

◆ szPreviewText

const WCHAR szPreviewText[]
Initial value:
=
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"
#define L(x)
Definition: ntvdm.h:50

Definition at line 460 of file layout.c.

Referenced by PaintText().