https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1d3fb3e370be7e206762e…
commit 1d3fb3e370be7e206762e23fa6c2d5b12dc86c6b
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Feb 23 21:45:55 2020 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)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#…
---
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;