ReactOS  0.4.14-dev-77-gd9e7c48
layout.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Console Configuration DLL
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: dll/cpl/console/layout.c
5  * PURPOSE: Layout dialog
6  * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7  * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 #include "console.h"
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 /* CONSOLE WINDOW PREVIEW Control *********************************************/
16 
17 #define WIN_PREVIEW_CLASS L"WinPreview"
18 
19 typedef struct _WINPREV_DATA
20 {
21  HWND hWnd; // The window which this structure refers to
22  RECT rcMaxArea; // Maximum rectangle in which the preview window can be sized
23  SIZE siPreview; // Actual size of the preview window
24  SIZE siVirtScr; // Width and Height of the virtual screen
25  PVOID pData; // Private data
27 
28 static LRESULT CALLBACK
30 
31 BOOL
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 }
50 
51 BOOL
54 {
56 }
57 
58 static VOID
61 {
62  // RECT rcNew;
63 
64  pData->siVirtScr.cx = GetSystemMetrics(SM_CXVIRTUALSCREEN);
65  pData->siVirtScr.cy = GetSystemMetrics(SM_CYVIRTUALSCREEN);
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 }
115 
116 #define RescaleCX(pData, len) \
117  MulDiv((len), (pData)->siPreview.cx, (pData)->siVirtScr.cx)
118 
119 #define RescaleCY(pData, len) \
120  MulDiv((len), (pData)->siPreview.cy, (pData)->siVirtScr.cy)
121 
122 #define RescaleRect(pData, rect) \
123 do { \
124  (rect).left = RescaleCX((pData), (rect).left); \
125  (rect).right = RescaleCX((pData), (rect).right); \
126  (rect).top = RescaleCY((pData), (rect).top); \
127  (rect).bottom = RescaleCY((pData), (rect).bottom); \
128 } while (0)
129 
130 #if 0
131 static VOID
132 WinPrev_OnSize(VOID)
133 {
134 }
135 #endif
136 
137 static VOID
139  IN HDC hDC,
141 {
142  PCONSOLE_STATE_INFO pConInfo = (PCONSOLE_STATE_INFO)pData->pData;
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)
207  RefreshFontPreview(&FontPreview, pConInfo);
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  {
345  LONG right, bottom;
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 */
392  hBrush = CreateSolidBrush(pConInfo->ColorTable[BkgdAttribFromAttrib(pConInfo->ScreenAttributes)]);
393  FillRect(hDC, &rcWin, hBrush);
394  DeleteObject(hBrush);
395 }
396 
397 static LRESULT CALLBACK
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);
448  WinPrev_OnDraw(ps.hdc, pData);
449  EndPaint(hWnd, &ps);
450  return 0;
451  }
452  }
453 
454  return DefWindowProcW(hWnd, msg, wParam, lParam);
455 }
456 
457 
458 /* CONSOLE TEXT PREVIEW *******************************************************/
459 
461  L"C:\\ReactOS> dir \n" \
462  L"SYSTEM <DIR> 13-04-15 5:00a\n" \
463  L"SYSTEM32 <DIR> 13-04-15 5:00a\n" \
464  L"readme txt 1739 13-04-15 5:00a\n" \
465  L"explorer exe 3329536 13-04-15 5:00a\n" \
466  L"vgafonts cab 18736 13-04-15 5:00a\n" \
467  L"setuplog txt 313 13-04-15 5:00a\n" \
468  L"win ini 7005 13-04-15 5:00a\n" ;
469 
470 VOID
472  IN LPDRAWITEMSTRUCT drawItem,
473  IN PCONSOLE_STATE_INFO pConInfo,
474  IN TEXT_TYPE TextMode)
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  hBrush = CreateSolidBrush(nbkColor);
493  if (!hBrush) return;
494 
495  if (FontPreview.hFont == NULL)
496  RefreshFontPreview(&FontPreview, pConInfo);
497 
498  hOldFont = SelectObject(drawItem->hDC, FontPreview.hFont);
499  //if (hOldFont == NULL)
500  //{
501  // DeleteObject(hBrush);
502  // return;
503  //}
504 
505  FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
506 
507  /* Add a few space between the preview window border and the text sample */
508  InflateRect(&drawItem->rcItem, -2, -2);
509 
510  ptColor = SetTextColor(drawItem->hDC, ntColor);
511  pbkColor = SetBkColor(drawItem->hDC, nbkColor);
512  DrawTextW(drawItem->hDC, szPreviewText, (INT)wcslen(szPreviewText), &drawItem->rcItem, 0);
513  SetTextColor(drawItem->hDC, ptColor);
514  SetBkColor(drawItem->hDC, pbkColor);
515 
516  SelectObject(drawItem->hDC, hOldFont);
517  DeleteObject(hBrush);
518 }
519 
520 
521 /* LAYOUT DIALOG **************************************************************/
522 
523 INT_PTR
524 CALLBACK
526  UINT uMsg,
527  WPARAM wParam,
528  LPARAM lParam)
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 
564  if (ConInfo->AutoPosition)
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  {
587  LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam;
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 
632  if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_LEFT)
633  {
634  left = lpnmud->iPos + lpnmud->iDelta;
635  }
636  else
637  {
639  }
640 
641  if (lppsn->hdr.idFrom == IDC_UPDOWN_WINDOW_POS_TOP)
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 }
SIZE siVirtScr
Definition: layout.c:24
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
#define IN
Definition: typedefs.h:38
#define max(a, b)
Definition: svc.c:63
#define IDC_EDIT_WINDOW_SIZE_WIDTH
Definition: resource.h:55
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SM_CYHSCROLL
Definition: winuser.h:952
#define TRUE
Definition: types.h:120
#define COLOR_WINDOWFRAME
Definition: winuser.h:909
#define SM_CYSIZE
Definition: winuser.h:982
BOOL RegisterWinPrevClass(IN HINSTANCE hInstance)
Definition: layout.c:32
USHORT ScreenAttributes
Definition: settings.h:47
long y
Definition: polytest.cpp:48
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1026
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
long x
Definition: polytest.cpp:48
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1028
struct _PSHNOTIFY * LPPSHNOTIFY
POINT WindowPosition
Definition: settings.h:34
struct _NM_UPDOWN * LPNMUPDOWN
static LRESULT CALLBACK WinPrevProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: layout.c:398
VOID PaintText(IN LPDRAWITEMSTRUCT drawItem, IN PCONSOLE_STATE_INFO pConInfo, IN TEXT_TYPE TextMode)
Definition: layout.c:471
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
BOOL WINAPI UpdateWindow(_In_ HWND)
HWND hWnd
Definition: settings.c:17
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
static VOID WinPrev_OnDisplayChange(IN PWINPREV_DATA pData)
Definition: layout.c:59
RECT rcMaxArea
Definition: layout.c:22
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
UINT_PTR WPARAM
Definition: windef.h:207
#define GetWindowLongPtrW
Definition: winuser.h:4730
#define SWP_NOZORDER
Definition: winuser.h:1232
#define SM_CYFRAME
Definition: winuser.h:986
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
int32_t INT_PTR
Definition: typedefs.h:62
#define SM_CXFRAME
Definition: winuser.h:984
int32_t INT
Definition: typedefs.h:56
WPARAM wParam
Definition: combotst.c:138
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT CharHeight
Definition: console.h:42
UINT code
Definition: winuser.h:3133
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:975
NMHDR hdr
Definition: prsht.h:312
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
HINSTANCE hInstance
Definition: charmap.c:20
#define EN_KILLFOCUS
Definition: winuser.h:2007
struct _WINPREV_DATA WINPREV_DATA
struct _WINPREV_DATA * PWINPREV_DATA
#define IDC_UPDOWN_WINDOW_SIZE_HEIGHT
Definition: resource.h:58
#define IDC_EDIT_WINDOW_POS_TOP
Definition: resource.h:61
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define COLOR_SCROLLBAR
Definition: winuser.h:902
short SHORT
Definition: pedump.c:59
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
UINT_PTR idFrom
Definition: winuser.h:3132
COLORREF ColorTable[16]
Definition: settings.h:53
#define IDC_UPDOWN_WINDOW_POS_TOP
Definition: resource.h:62
#define GWLP_USERDATA
Definition: treelist.c:63
#define MAKELONG(a, b)
Definition: typedefs.h:248
HWND hWnd
Definition: layout.c:21
smooth NULL
Definition: ftsmooth.c:416
UINT WINAPI GetDlgItemInt(_In_ HWND, _In_ int, _Out_opt_ PBOOL, _In_ BOOL)
#define COLOR_ACTIVECAPTION
Definition: winuser.h:905
#define MAXDWORD
#define IDC_STATIC_LAYOUT_WINDOW_PREVIEW
Definition: resource.h:64
LONG_PTR LPARAM
Definition: windef.h:208
GLint GLint bottom
Definition: glext.h:7726
#define IDC_UPDOWN_SCREEN_BUFFER_WIDTH
Definition: resource.h:51
#define UDM_SETRANGE
Definition: commctrl.h:2113
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
struct _CONSOLE_STATE_INFO * PCONSOLE_STATE_INFO
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1029
#define WM_DESTROY
Definition: winuser.h:1591
#define BkgdAttribFromAttrib(Attribute)
Definition: settings.h:73
ULONG X
Definition: bl.h:1340
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define IDC_UPDOWN_WINDOW_POS_LEFT
Definition: resource.h:60
#define WM_SIZE
Definition: winuser.h:1593
#define PropSheet_Changed(d, w)
Definition: prsht.h:326
#define SWP_NOACTIVATE
Definition: winuser.h:1227
DWORD COLORREF
Definition: windef.h:285
#define RescaleRect(pData, rect)
Definition: layout.c:122
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define COLOR_ACTIVEBORDER
Definition: winuser.h:913
int WINAPI GetSystemMetrics(_In_ int)
#define BN_CLICKED
Definition: winuser.h:1907
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint left
Definition: glext.h:7726
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2074
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
GLdouble GLdouble right
Definition: glext.h:10859
SIZE siPreview
Definition: layout.c:23
#define WM_PAINT
Definition: winuser.h:1602
const WCHAR szPreviewText[]
Definition: layout.c:460
#define IDC_EDIT_WINDOW_POS_LEFT
Definition: resource.h:59
BOOL WINAPI SetDlgItemInt(_In_ HWND, _In_ int, _In_ UINT, _In_ BOOL)
#define UDN_DELTAPOS
Definition: commctrl.h:2141
static const WCHAR L[]
Definition: oid.c:1250
#define COLOR_BTNFACE
Definition: winuser.h:918
#define IDC_EDIT_WINDOW_SIZE_HEIGHT
Definition: resource.h:57
#define RescaleCY(pData, len)
Definition: layout.c:119
HFONT hFont
Definition: console.h:40
enum _TEXT_TYPE TEXT_TYPE
#define WM_COMMAND
Definition: winuser.h:1722
#define RescaleCX(pData, len)
Definition: layout.c:116
INT_PTR CALLBACK LayoutProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: layout.c:525
#define TextAttribFromAttrib(Attribute)
Definition: settings.h:72
#define BST_UNCHECKED
Definition: winuser.h:199
Definition: console.h:35
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1027
#define IDC_UPDOWN_WINDOW_SIZE_WIDTH
Definition: resource.h:56
#define IDC_EDIT_SCREEN_BUFFER_HEIGHT
Definition: resource.h:53
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:888
static HDC hDC
Definition: 3dtext.c:33
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
int iDelta
Definition: commctrl.h:2138
HWND WINAPI GetParent(_In_ HWND)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define WS_BORDER
Definition: pedump.c:625
#define IDC_CHECK_SYSTEM_POS_WINDOW
Definition: resource.h:63
unsigned short USHORT
Definition: pedump.c:61
#define EnableDlgItem(hDlg, nID, bEnable)
Definition: eventvwr.h:52
FONT_PREVIEW FontPreview
Definition: font.c:21
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
VOID RefreshFontPreview(IN FONT_PREVIEW *Preview, IN PCONSOLE_STATE_INFO pConInfo)
Definition: font.c:49
PCONSOLE_STATE_INFO ConInfo
Definition: console.c:23
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define SM_CXVSCROLL
Definition: winuser.h:951
#define BST_CHECKED
Definition: winuser.h:197
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define WM_CREATE
Definition: winuser.h:1590
#define SM_CXSIZE
Definition: winuser.h:981
COORD ScreenBufferSize
Definition: settings.h:32
BOOL UnRegisterWinPrevClass(IN HINSTANCE hInstance)
Definition: layout.c:52
#define HIWORD(l)
Definition: typedefs.h:246
unsigned int ULONG
Definition: retypes.h:1
Definition: console.h:34
#define SWP_NOMOVE
Definition: winuser.h:1229
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SetWindowLongPtrW
Definition: winuser.h:5247
#define COLOR_BACKGROUND
Definition: hardware.h:164
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
#define WM_ERASEBKGND
Definition: winuser.h:1607
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LONG_PTR LRESULT
Definition: windef.h:209
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
ULONG Y
Definition: bl.h:1341
UINT CharWidth
Definition: console.h:41
#define WM_INITDIALOG
Definition: winuser.h:1721
PVOID pData
Definition: layout.c:25
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:394
#define MulDiv(x, y, z)
Definition: gdifloat.h:86
static VOID WinPrev_OnDraw(IN HDC hDC, IN PWINPREV_DATA pData)
Definition: layout.c:138
#define WM_NOTIFY
Definition: richedit.h:61
WCHAR WndClass[]
Definition: capicon.c:23
#define IDC_UPDOWN_SCREEN_BUFFER_HEIGHT
Definition: resource.h:54
int WINAPI FrameRect(_In_ HDC, _In_ LPCRECT, _In_ HBRUSH)
#define IDC_EDIT_SCREEN_BUFFER_WIDTH
Definition: resource.h:52
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17
#define WIN_PREVIEW_CLASS
Definition: layout.c:17