https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1d3fb3e370be7e206762e2...
commit 1d3fb3e370be7e206762e23fa6c2d5b12dc86c6b Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun Feb 23 21:45:55 2020 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Feb 23 22:43:02 2020 +0100
[CONSRV] Fix setting the default screenbuffer and console view sizes when creating a new screenbuffer.
For more information, see: https://docs.microsoft.com/en-us/windows/console/createconsolescreenbuffer#r... --- win32ss/user/winsrv/consrv/condrv/conoutput.c | 2 +- win32ss/user/winsrv/consrv/condrv/console.c | 9 +++-- win32ss/user/winsrv/consrv/condrv/text.c | 34 +++++++++++-------- win32ss/user/winsrv/consrv/conoutput.c | 48 +++++++++++++++------------ win32ss/user/winsrv/consrv/include/conio.h | 9 ++--- 5 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/win32ss/user/winsrv/consrv/condrv/conoutput.c b/win32ss/user/winsrv/consrv/condrv/conoutput.c index 3e6f2407607..bec9903f814 100644 --- a/win32ss/user/winsrv/consrv/condrv/conoutput.c +++ b/win32ss/user/winsrv/consrv/condrv/conoutput.c @@ -82,7 +82,7 @@ ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN ULONG BufferType, IN PVOID ScreenBufferInfo) { - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status = STATUS_UNSUCCESSFUL;
if ( Console == NULL || Buffer == NULL || (BufferType != CONSOLE_TEXTMODE_BUFFER && BufferType != CONSOLE_GRAPHICS_BUFFER) ) diff --git a/win32ss/user/winsrv/consrv/condrv/console.c b/win32ss/user/winsrv/consrv/condrv/console.c index f888b755c2c..50542ec3025 100644 --- a/win32ss/user/winsrv/consrv/condrv/console.c +++ b/win32ss/user/winsrv/consrv/condrv/console.c @@ -185,9 +185,11 @@ ConDrvInitConsole(OUT PCONSOLE* NewConsole, }
/* - * Fix the screen buffer size if needed. The rule is: - * ScreenBufferSize >= ConsoleSize + * Set and fix the screen buffer size if needed. + * The rule is: ScreenBufferSize >= ConsoleSize */ + if (ConsoleInfo->ScreenBufferSize.X == 0) ConsoleInfo->ScreenBufferSize.X = 1; + if (ConsoleInfo->ScreenBufferSize.Y == 0) ConsoleInfo->ScreenBufferSize.Y = 1; if (ConsoleInfo->ScreenBufferSize.X < ConsoleInfo->ConsoleSize.X) ConsoleInfo->ScreenBufferSize.X = ConsoleInfo->ConsoleSize.X; if (ConsoleInfo->ScreenBufferSize.Y < ConsoleInfo->ConsoleSize.Y) @@ -224,10 +226,11 @@ ConDrvInitConsole(OUT PCONSOLE* NewConsole,
/* Initialize a new text-mode screen buffer with default settings */ ScreenBufferInfo.ScreenBufferSize = ConsoleInfo->ScreenBufferSize; + ScreenBufferInfo.ViewSize = ConsoleInfo->ConsoleSize; ScreenBufferInfo.ScreenAttrib = ConsoleInfo->ScreenAttrib; ScreenBufferInfo.PopupAttrib = ConsoleInfo->PopupAttrib; - ScreenBufferInfo.IsCursorVisible = TRUE; ScreenBufferInfo.CursorSize = ConsoleInfo->CursorSize; + ScreenBufferInfo.IsCursorVisible = TRUE;
InitializeListHead(&Console->BufferList); Status = ConDrvCreateScreenBuffer(&NewBuffer, diff --git a/win32ss/user/winsrv/consrv/condrv/text.c b/win32ss/user/winsrv/consrv/condrv/text.c index 33abb74b642..d38317de29a 100644 --- a/win32ss/user/winsrv/consrv/condrv/text.c +++ b/win32ss/user/winsrv/consrv/condrv/text.c @@ -76,6 +76,12 @@ TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, if (Console == NULL || Buffer == NULL || TextModeInfo == NULL) return STATUS_INVALID_PARAMETER;
+ if ((TextModeInfo->ScreenBufferSize.X == 0) || + (TextModeInfo->ScreenBufferSize.Y == 0)) + { + return STATUS_INVALID_PARAMETER; + } + *Buffer = NULL;
Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer, @@ -95,10 +101,16 @@ TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, return STATUS_INSUFFICIENT_RESOURCES; }
- NewBuffer->ScreenBufferSize = NewBuffer->OldScreenBufferSize - = TextModeInfo->ScreenBufferSize; - NewBuffer->ViewSize = NewBuffer->OldViewSize - = Console->ConsoleSize; + NewBuffer->ScreenBufferSize = TextModeInfo->ScreenBufferSize; + NewBuffer->OldScreenBufferSize = NewBuffer->ScreenBufferSize; + + /* + * Set and fix the view size if needed. + * The rule is: ScreenBufferSize >= ViewSize (== ConsoleSize) + */ + NewBuffer->ViewSize.X = min(max(TextModeInfo->ViewSize.X, 1), NewBuffer->ScreenBufferSize.X); + NewBuffer->ViewSize.Y = min(max(TextModeInfo->ViewSize.Y, 1), NewBuffer->ScreenBufferSize.Y); + NewBuffer->OldViewSize = NewBuffer->ViewSize;
NewBuffer->ViewOrigin.X = NewBuffer->ViewOrigin.Y = 0; NewBuffer->VirtualY = 0; @@ -465,15 +477,11 @@ ConioResizeBuffer(PCONSOLE Console, ScreenBuffer->ScreenBufferSize = ScreenBuffer->OldScreenBufferSize = Size; ScreenBuffer->VirtualY = 0;
- /* Ensure cursor and window are within buffer */ - if (ScreenBuffer->CursorPosition.X >= Size.X) - ScreenBuffer->CursorPosition.X = Size.X - 1; - if (ScreenBuffer->CursorPosition.Y >= Size.Y) - ScreenBuffer->CursorPosition.Y = Size.Y - 1; - if (ScreenBuffer->ViewOrigin.X > Size.X - ScreenBuffer->ViewSize.X) - ScreenBuffer->ViewOrigin.X = Size.X - ScreenBuffer->ViewSize.X; - if (ScreenBuffer->ViewOrigin.Y > Size.Y - ScreenBuffer->ViewSize.Y) - ScreenBuffer->ViewOrigin.Y = Size.Y - ScreenBuffer->ViewSize.Y; + /* Ensure the cursor and the view are within the buffer */ + ScreenBuffer->CursorPosition.X = min(ScreenBuffer->CursorPosition.X, Size.X - 1); + ScreenBuffer->CursorPosition.Y = min(ScreenBuffer->CursorPosition.Y, Size.Y - 1); + ScreenBuffer->ViewOrigin.X = min(ScreenBuffer->ViewOrigin.X, Size.X - ScreenBuffer->ViewSize.X); + ScreenBuffer->ViewOrigin.Y = min(ScreenBuffer->ViewOrigin.Y, Size.Y - ScreenBuffer->ViewSize.Y);
/* * Trigger a buffer resize event diff --git a/win32ss/user/winsrv/consrv/conoutput.c b/win32ss/user/winsrv/consrv/conoutput.c index 079d781514c..15fd4ff5ede 100644 --- a/win32ss/user/winsrv/consrv/conoutput.c +++ b/win32ss/user/winsrv/consrv/conoutput.c @@ -204,6 +204,7 @@ CSR_API(SrvCreateConsoleScreenBuffer)
PVOID ScreenBufferInfo = NULL; TEXTMODE_BUFFER_INFO TextModeInfo = {{80, 25}, + {80, 25}, DEFAULT_SCREEN_ATTRIB, DEFAULT_POPUP_ATTRIB , TRUE, @@ -221,29 +222,18 @@ CSR_API(SrvCreateConsoleScreenBuffer) ScreenBufferInfo = &TextModeInfo;
/* - if (Console->ActiveBuffer) - { - TextModeInfo.ScreenBufferSize = Console->ActiveBuffer->ScreenBufferSize; - if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 80; - if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 25; - - TextModeInfo.ScreenAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.ScreenDefaultAttrib; - TextModeInfo.PopupAttrib = Console->ActiveBuffer->ScreenBuffer.TextBuffer.PopupDefaultAttrib; - - TextModeInfo.IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible; - TextModeInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize; - } - */ - - /* - * This is Windows behaviour. + * This is Windows behaviour, as described by MSDN and verified manually: + * + * The newly created screen buffer will copy some properties from the + * active screen buffer at the time that this function is called. + * The behavior is as follows: + * Font - copied from active screen buffer. + * Display Window Size - copied from active screen buffer. + * Buffer Size - matched to Display Window Size (NOT copied). + * Default Attributes (colors) - copied from active screen buffer. + * Default Popup Attributes (colors) - copied from active screen buffer. */
- /* Use the current console size. Normalize it if needed */ - TextModeInfo.ScreenBufferSize = Console->ConsoleSize; - if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 1; - if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 1; - /* If we have an active screen buffer, use its attributes as the new ones */ if (Console->ActiveBuffer && GetType(Console->ActiveBuffer) == TEXTMODE_BUFFER) { @@ -252,9 +242,23 @@ CSR_API(SrvCreateConsoleScreenBuffer) TextModeInfo.ScreenAttrib = Buffer->ScreenDefaultAttrib; TextModeInfo.PopupAttrib = Buffer->PopupDefaultAttrib;
- TextModeInfo.IsCursorVisible = Buffer->CursorInfo.bVisible; TextModeInfo.CursorSize = Buffer->CursorInfo.dwSize; + TextModeInfo.IsCursorVisible = Buffer->CursorInfo.bVisible; + + /* Use the current view size */ + TextModeInfo.ScreenBufferSize = Buffer->ViewSize; + TextModeInfo.ViewSize = Buffer->ViewSize; } + else + { + /* Use the current console size */ + TextModeInfo.ScreenBufferSize = Console->ConsoleSize; + TextModeInfo.ViewSize = Console->ConsoleSize; + } + + /* Normalize the screen buffer size if needed */ + if (TextModeInfo.ScreenBufferSize.X == 0) TextModeInfo.ScreenBufferSize.X = 1; + if (TextModeInfo.ScreenBufferSize.Y == 0) TextModeInfo.ScreenBufferSize.Y = 1; } else if (CreateScreenBufferRequest->ScreenBufferType == CONSOLE_GRAPHICS_BUFFER) { diff --git a/win32ss/user/winsrv/consrv/include/conio.h b/win32ss/user/winsrv/consrv/include/conio.h index 17837c643f1..cff5de40975 100644 --- a/win32ss/user/winsrv/consrv/include/conio.h +++ b/win32ss/user/winsrv/consrv/include/conio.h @@ -105,8 +105,8 @@ struct _CONSOLE_SCREEN_BUFFER HPALETTE PaletteHandle; /* Handle to the color palette associated to this buffer */ UINT PaletteUsage; /* The new use of the system palette. See SetSystemPaletteUse 'uUsage' parameter */
-// WORD ScreenDefaultAttrib; /* Default screen char attribute */ -// WORD PopupDefaultAttrib; /* Default popup char attribute */ +// USHORT ScreenDefaultAttrib; /* Default screen char attribute */ +// USHORT PopupDefaultAttrib; /* Default popup char attribute */ USHORT Mode; /* Output buffer modes */ };
@@ -141,6 +141,7 @@ struct _CONSOLE_SCREEN_BUFFER typedef struct _TEXTMODE_BUFFER_INFO { COORD ScreenBufferSize; + COORD ViewSize; USHORT ScreenAttrib; USHORT PopupAttrib; ULONG CursorSize; @@ -153,8 +154,8 @@ typedef struct _TEXTMODE_SCREEN_BUFFER
PCHAR_INFO Buffer; /* Pointer to UNICODE screen buffer (Buffer->Char.UnicodeChar only is valid, not Char.AsciiChar) */
- WORD ScreenDefaultAttrib; /* Default screen char attribute */ - WORD PopupDefaultAttrib; /* Default popup char attribute */ + USHORT ScreenDefaultAttrib; /* Default screen char attribute */ + USHORT PopupDefaultAttrib; /* Default popup char attribute */ } TEXTMODE_SCREEN_BUFFER, *PTEXTMODE_SCREEN_BUFFER;