OUT PCOORD MaximumViewSize,
OUT PWORD Attributes)
{
+ COORD LargestWindowSize;
+
if (Console == NULL || Buffer == NULL || ScreenBufferSize == NULL ||
CursorPosition == NULL || ViewOrigin == NULL || ViewSize == NULL ||
MaximumViewSize == NULL || Attributes == NULL)
*ViewSize = Buffer->ViewSize;
*Attributes = Buffer->ScreenDefaultAttrib;
- // FIXME: Refine the computation
- *MaximumViewSize = Buffer->ScreenBufferSize;
+ /*
+ * Retrieve the largest possible console window size, taking
+ * into account the size of the console screen buffer.
+ */
+ TermGetLargestConsoleWindowSize(Console, &LargestWindowSize);
+ LargestWindowSize.X = min(LargestWindowSize.X, Buffer->ScreenBufferSize.X);
+ LargestWindowSize.Y = min(LargestWindowSize.Y, Buffer->ScreenBufferSize.Y);
+ *MaximumViewSize = LargestWindowSize;
return STATUS_SUCCESS;
}
IN PSMALL_RECT WindowRect)
{
SMALL_RECT CapturedWindowRect;
+ COORD LargestWindowSize;
if (Console == NULL || Buffer == NULL || WindowRect == NULL)
return STATUS_INVALID_PARAMETER;
if (!Absolute)
{
- /* Relative positions given. Transform them to absolute ones */
+ /* Relative positions are given, transform them to absolute ones */
CapturedWindowRect.Left += Buffer->ViewOrigin.X;
CapturedWindowRect.Top += Buffer->ViewOrigin.Y;
CapturedWindowRect.Right += Buffer->ViewOrigin.X + Buffer->ViewSize.X - 1;
return STATUS_INVALID_PARAMETER;
}
+ /*
+ * Forbid window sizes larger than the largest allowed console window size,
+ * taking into account the size of the console screen buffer.
+ */
+ TermGetLargestConsoleWindowSize(Console, &LargestWindowSize);
+ LargestWindowSize.X = min(LargestWindowSize.X, Buffer->ScreenBufferSize.X);
+ LargestWindowSize.Y = min(LargestWindowSize.Y, Buffer->ScreenBufferSize.Y);
+ if ((CapturedWindowRect.Right - CapturedWindowRect.Left + 1 > LargestWindowSize.X) ||
+ (CapturedWindowRect.Bottom - CapturedWindowRect.Top + 1 > LargestWindowSize.Y))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
/* Shift the window rectangle coordinates if 'Left' or 'Top' are negative */
if (CapturedWindowRect.Left < 0)
{
CapturedWindowRect.Top = 0;
}
- if ((CapturedWindowRect.Right >= Buffer->ScreenBufferSize.X) ||
- (CapturedWindowRect.Bottom >= Buffer->ScreenBufferSize.Y))
- {
- return STATUS_INVALID_PARAMETER;
- }
+ /* Clip the window rectangle to the screen buffer */
+ CapturedWindowRect.Right = min(CapturedWindowRect.Right , Buffer->ScreenBufferSize.X);
+ CapturedWindowRect.Bottom = min(CapturedWindowRect.Bottom, Buffer->ScreenBufferSize.Y);
Buffer->ViewOrigin.X = CapturedWindowRect.Left;
Buffer->ViewOrigin.Y = CapturedWindowRect.Top;
/* FUNCTIONS ******************************************************************/
-static VOID
+/* NOTE: Defined in conwnd.c */
+VOID
GetScreenBufferSizeUnits(IN PCONSOLE_SCREEN_BUFFER Buffer,
IN PGUI_CONSOLE_DATA GuiData,
OUT PUINT WidthUnit,
- OUT PUINT HeightUnit)
-{
- if (Buffer == NULL || GuiData == NULL ||
- WidthUnit == NULL || HeightUnit == NULL)
- {
- return;
- }
-
- if (GetType(Buffer) == TEXTMODE_BUFFER)
- {
- *WidthUnit = GuiData->CharWidth ;
- *HeightUnit = GuiData->CharHeight;
- }
- else /* if (GetType(Buffer) == GRAPHICS_BUFFER) */
- {
- *WidthUnit = 1;
- *HeightUnit = 1;
- }
-}
+ OUT PUINT HeightUnit);
VOID
GuiConsoleMoveWindow(PGUI_CONSOLE_DATA GuiData)
/* Change the current palette */
if (ActiveBuffer->PaletteHandle == NULL)
- {
hPalette = GuiData->hSysPalette;
- }
else
- {
hPalette = ActiveBuffer->PaletteHandle;
- }
DPRINT("GuiSetActiveScreenBuffer using palette 0x%p\n", hPalette);
}
if (hIcon == NULL)
- {
return FALSE;
- }
if (hIcon != GuiData->hIcon)
{
{
PGUI_CONSOLE_DATA GuiData = This->Context;
PCONSOLE_SCREEN_BUFFER ActiveBuffer;
- RECT WorkArea;
- LONG width, height;
+ HMONITOR hMonitor;
+ MONITORINFO MonitorInfo;
+ LONG Width, Height;
UINT WidthUnit, HeightUnit;
if (!pSize) return;
- if (!SystemParametersInfoW(SPI_GETWORKAREA, 0, &WorkArea, 0))
+ /*
+ * Retrieve the monitor that is mostly covered by the current console window;
+ * default to primary monitor otherwise.
+ */
+ MonitorInfo.cbSize = sizeof(MonitorInfo);
+ hMonitor = MonitorFromWindow(GuiData->hWindow, MONITOR_DEFAULTTOPRIMARY);
+ if (hMonitor && GetMonitorInfoW(hMonitor, &MonitorInfo))
{
- DPRINT1("SystemParametersInfoW failed - What to do ??\n");
- return;
+ /* Retrieve the width and height of the client area of this monitor */
+ Width = MonitorInfo.rcWork.right - MonitorInfo.rcWork.left;
+ Height = MonitorInfo.rcWork.bottom - MonitorInfo.rcWork.top;
+ }
+ else
+ {
+ /*
+ * Retrieve the width and height of the client area for a full-screen
+ * window on the primary display monitor.
+ */
+ Width = GetSystemMetrics(SM_CXFULLSCREEN);
+ Height = GetSystemMetrics(SM_CYFULLSCREEN);
+
+ // RECT WorkArea;
+ // SystemParametersInfoW(SPI_GETWORKAREA, 0, &WorkArea, 0);
+ // Width = WorkArea.right;
+ // Height = WorkArea.bottom;
}
ActiveBuffer = GuiData->ActiveBuffer;
+#if 0
+ // NOTE: This would be surprising if we wouldn't have an associated buffer...
if (ActiveBuffer)
- {
+#endif
GetScreenBufferSizeUnits(ActiveBuffer, GuiData, &WidthUnit, &HeightUnit);
- }
+#if 0
else
- {
- /* Default: text mode */
- WidthUnit = GuiData->CharWidth ;
- HeightUnit = GuiData->CharHeight;
- }
-
- width = WorkArea.right;
- height = WorkArea.bottom;
+ /* Default: graphics mode */
+ WidthUnit = HeightUnit = 1;
+#endif
- width -= (2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)));
- height -= (2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION));
+ Width -= (2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)));
+ Height -= (2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION));
- if (width < 0) width = 0;
- if (height < 0) height = 0;
+ if (Width < 0) Width = 0;
+ if (Height < 0) Height = 0;
- pSize->X = (SHORT)(width / (int)WidthUnit ) /* HACK */ + 2;
- pSize->Y = (SHORT)(height / (int)HeightUnit) /* HACK */ + 1;
+ pSize->X = (SHORT)(Width / (int)WidthUnit ) /* HACK */ + 2;
+ pSize->Y = (SHORT)(Height / (int)HeightUnit) /* HACK */ + 1;
}
static BOOL NTAPI