mirror of
https://github.com/reactos/reactos.git
synced 2024-07-31 00:28:56 +00:00
[CONSRV]
Finish to move some text functions to condrv. svn path=/trunk/; revision=59322
This commit is contained in:
parent
e781a0d29d
commit
346e42535c
|
@ -438,7 +438,7 @@ ConioResizeBuffer(PCONSOLE Console,
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FASTCALL
|
static VOID FASTCALL
|
||||||
ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, SMALL_RECT* UpdateRect, UINT *ScrolledLines)
|
ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, PSMALL_RECT UpdateRect, PUINT ScrolledLines)
|
||||||
{
|
{
|
||||||
/* If we hit bottom, slide the viewable screen */
|
/* If we hit bottom, slide the viewable screen */
|
||||||
if (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y)
|
if (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y)
|
||||||
|
@ -1099,157 +1099,144 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
|
||||||
CSR_API(SrvGetConsoleScreenBufferInfo)
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
if (Console == NULL || Buffer == NULL || ScreenBufferInfo == NULL)
|
||||||
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
|
return STATUS_INVALID_PARAMETER;
|
||||||
// PCONSOLE Console;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info;
|
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleScreenBufferInfo\n");
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE);
|
ScreenBufferInfo->dwSize = Buffer->ScreenBufferSize;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
ScreenBufferInfo->dwCursorPosition = Buffer->CursorPosition;
|
||||||
|
ScreenBufferInfo->wAttributes = Buffer->ScreenDefaultAttrib;
|
||||||
|
ScreenBufferInfo->srWindow.Left = Buffer->ViewOrigin.X;
|
||||||
|
ScreenBufferInfo->srWindow.Top = Buffer->ViewOrigin.Y;
|
||||||
|
ScreenBufferInfo->srWindow.Right = Buffer->ViewOrigin.X + Buffer->ViewSize.X - 1;
|
||||||
|
ScreenBufferInfo->srWindow.Bottom = Buffer->ViewOrigin.Y + Buffer->ViewSize.Y - 1;
|
||||||
|
|
||||||
// Console = Buff->Header.Console;
|
// FIXME: Refine the computation
|
||||||
|
ScreenBufferInfo->dwMaximumWindowSize = Buffer->ScreenBufferSize;
|
||||||
|
|
||||||
pInfo->dwSize = Buff->ScreenBufferSize;
|
|
||||||
pInfo->dwCursorPosition = Buff->CursorPosition;
|
|
||||||
pInfo->wAttributes = Buff->ScreenDefaultAttrib;
|
|
||||||
pInfo->srWindow.Left = Buff->ViewOrigin.X;
|
|
||||||
pInfo->srWindow.Top = Buff->ViewOrigin.Y;
|
|
||||||
pInfo->srWindow.Right = Buff->ViewOrigin.X + Buff->ViewSize.X - 1;
|
|
||||||
pInfo->srWindow.Bottom = Buff->ViewOrigin.Y + Buff->ViewSize.Y - 1;
|
|
||||||
pInfo->dwMaximumWindowSize = Buff->ScreenBufferSize; // TODO: Refine the computation
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSR_API(SrvSetConsoleTextAttribute)
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN WORD Attribute)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
if (Console == NULL || Buffer == NULL)
|
||||||
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest;
|
return STATUS_INVALID_PARAMETER;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleTextAttribute\n");
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
Buffer->ScreenDefaultAttrib = Attribute;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib;
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSR_API(SrvSetConsoleScreenBufferSize)
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCOORD Size)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
|
|
||||||
PCONSOLE Console;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetScreenBufferSizeRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
if (Console == NULL || Buffer == NULL || Size == NULL)
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
/* Validity check */
|
||||||
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
|
|
||||||
Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size);
|
Status = ConioResizeBuffer(Console, Buffer, *Size);
|
||||||
if (NT_SUCCESS(Status)) ConioResizeTerminal(Console);
|
if (NT_SUCCESS(Status)) ConioResizeTerminal(Console);
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSR_API(SrvScrollConsoleScreenBuffer)
|
NTSTATUS NTAPI
|
||||||
|
ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN BOOL Unicode,
|
||||||
|
IN PSMALL_RECT ScrollRectangle,
|
||||||
|
IN BOOL UseClipRectangle,
|
||||||
|
IN PSMALL_RECT ClipRectangle OPTIONAL,
|
||||||
|
IN PCOORD DestinationOrigin,
|
||||||
|
IN CHAR_INFO FillChar)
|
||||||
{
|
{
|
||||||
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
|
COORD CapturedDestinationOrigin;
|
||||||
PCONSOLE Console;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
SMALL_RECT ScreenBuffer;
|
SMALL_RECT ScreenBuffer;
|
||||||
SMALL_RECT SrcRegion;
|
SMALL_RECT SrcRegion;
|
||||||
SMALL_RECT DstRegion;
|
SMALL_RECT DstRegion;
|
||||||
SMALL_RECT UpdateRegion;
|
SMALL_RECT UpdateRegion;
|
||||||
SMALL_RECT ScrollRectangle;
|
SMALL_RECT CapturedClipRectangle;
|
||||||
SMALL_RECT ClipRectangle;
|
|
||||||
NTSTATUS Status;
|
|
||||||
HANDLE OutputHandle;
|
|
||||||
BOOLEAN UseClipRectangle;
|
|
||||||
COORD DestinationOrigin;
|
|
||||||
CHAR_INFO FillChar;
|
|
||||||
|
|
||||||
DPRINT("SrvScrollConsoleScreenBuffer\n");
|
if (Console == NULL || Buffer == NULL || ScrollRectangle == NULL ||
|
||||||
|
(UseClipRectangle ? ClipRectangle == NULL : FALSE) || DestinationOrigin == NULL)
|
||||||
OutputHandle = ScrollScreenBufferRequest->OutputHandle;
|
{
|
||||||
UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle;
|
return STATUS_INVALID_PARAMETER;
|
||||||
DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin;
|
}
|
||||||
FillChar = ScrollScreenBufferRequest->Fill;
|
|
||||||
|
/* Validity check */
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
ASSERT(Console == Buffer->Header.Console);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
CapturedDestinationOrigin = *DestinationOrigin;
|
||||||
Console = Buff->Header.Console;
|
|
||||||
|
/* Make sure the source rectangle is inside the screen buffer */
|
||||||
ScrollRectangle = ScrollScreenBufferRequest->ScrollRectangle;
|
ConioInitRect(&ScreenBuffer, 0, 0, Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1);
|
||||||
|
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, ScrollRectangle))
|
||||||
/* Make sure source rectangle is inside the screen buffer */
|
|
||||||
ConioInitRect(&ScreenBuffer, 0, 0, Buff->ScreenBufferSize.Y - 1, Buff->ScreenBufferSize.X - 1);
|
|
||||||
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
|
|
||||||
{
|
{
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the source was clipped on the left or top, adjust the destination accordingly */
|
/* If the source was clipped on the left or top, adjust the destination accordingly */
|
||||||
if (ScrollRectangle.Left < 0)
|
if (ScrollRectangle->Left < 0)
|
||||||
{
|
{
|
||||||
DestinationOrigin.X -= ScrollRectangle.Left;
|
CapturedDestinationOrigin.X -= ScrollRectangle->Left;
|
||||||
}
|
}
|
||||||
if (ScrollRectangle.Top < 0)
|
if (ScrollRectangle->Top < 0)
|
||||||
{
|
{
|
||||||
DestinationOrigin.Y -= ScrollRectangle.Top;
|
CapturedDestinationOrigin.Y -= ScrollRectangle->Top;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseClipRectangle)
|
if (UseClipRectangle)
|
||||||
{
|
{
|
||||||
ClipRectangle = ScrollScreenBufferRequest->ClipRectangle;
|
CapturedClipRectangle = *ClipRectangle;
|
||||||
if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer))
|
if (!ConioGetIntersection(&CapturedClipRectangle, &CapturedClipRectangle, &ScreenBuffer))
|
||||||
{
|
{
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClipRectangle = ScreenBuffer;
|
CapturedClipRectangle = ScreenBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConioInitRect(&DstRegion,
|
ConioInitRect(&DstRegion,
|
||||||
DestinationOrigin.Y,
|
CapturedDestinationOrigin.Y,
|
||||||
DestinationOrigin.X,
|
CapturedDestinationOrigin.X,
|
||||||
DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
|
CapturedDestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
|
||||||
DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1);
|
CapturedDestinationOrigin.X + ConioRectWidth(&SrcRegion ) - 1);
|
||||||
|
|
||||||
if (!ScrollScreenBufferRequest->Unicode)
|
if (!Unicode)
|
||||||
ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar);
|
ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar);
|
||||||
|
|
||||||
ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, FillChar);
|
ConioMoveRegion(Buffer, &SrcRegion, &DstRegion, &CapturedClipRectangle, FillChar);
|
||||||
|
|
||||||
if ((PCONSOLE_SCREEN_BUFFER)Buff == Console->ActiveBuffer)
|
if ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer)
|
||||||
{
|
{
|
||||||
ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
|
ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
|
||||||
if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle))
|
if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &CapturedClipRectangle))
|
||||||
{
|
{
|
||||||
/* Draw update region */
|
/* Draw update region */
|
||||||
ConioDrawRegion(Console, &UpdateRegion);
|
ConioDrawRegion(Console, &UpdateRegion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -684,160 +684,114 @@ CSR_API(SrvFillConsoleOutput)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0000
|
NTSTATUS NTAPI
|
||||||
|
ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo);
|
||||||
CSR_API(SrvGetConsoleScreenBufferInfo)
|
CSR_API(SrvGetConsoleScreenBufferInfo)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
|
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
|
||||||
// PCONSOLE Console;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info;
|
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleScreenBufferInfo\n");
|
DPRINT("SrvGetConsoleScreenBufferInfo\n");
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE);
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
ScreenBufferInfoRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
// Console = Buff->Header.Console;
|
Status = ConDrvGetConsoleScreenBufferInfo(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
&ScreenBufferInfoRequest->Info);
|
||||||
|
|
||||||
pInfo->dwSize = Buff->ScreenBufferSize;
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
pInfo->dwCursorPosition = Buff->CursorPosition;
|
return Status;
|
||||||
pInfo->wAttributes = Buff->ScreenDefaultAttrib;
|
|
||||||
pInfo->srWindow.Left = Buff->ViewOrigin.X;
|
|
||||||
pInfo->srWindow.Top = Buff->ViewOrigin.Y;
|
|
||||||
pInfo->srWindow.Right = Buff->ViewOrigin.X + Buff->ViewSize.X - 1;
|
|
||||||
pInfo->srWindow.Bottom = Buff->ViewOrigin.Y + Buff->ViewSize.Y - 1;
|
|
||||||
pInfo->dwMaximumWindowSize = Buff->ScreenBufferSize; // TODO: Refine the computation
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN WORD Attribute);
|
||||||
CSR_API(SrvSetConsoleTextAttribute)
|
CSR_API(SrvSetConsoleTextAttribute)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest;
|
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleTextAttribute\n");
|
DPRINT("SrvSetConsoleTextAttribute\n");
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
SetTextAttribRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib;
|
Status = ConDrvSetConsoleTextAttribute(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
SetTextAttribRequest->Attrib);
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
return STATUS_SUCCESS;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN PCOORD Size);
|
||||||
CSR_API(SrvSetConsoleScreenBufferSize)
|
CSR_API(SrvSetConsoleScreenBufferSize)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
|
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
|
||||||
PCONSOLE Console;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetScreenBufferSizeRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
DPRINT("SrvSetConsoleScreenBufferSize\n");
|
||||||
|
|
||||||
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
SetScreenBufferSizeRequest->OutputHandle,
|
||||||
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvSetConsoleScreenBufferSize(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
&SetScreenBufferSizeRequest->Size);
|
||||||
|
|
||||||
Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size);
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
if (NT_SUCCESS(Status)) ConioResizeTerminal(Console);
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console,
|
||||||
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
|
IN BOOL Unicode,
|
||||||
|
IN PSMALL_RECT ScrollRectangle,
|
||||||
|
IN BOOL UseClipRectangle,
|
||||||
|
IN PSMALL_RECT ClipRectangle OPTIONAL,
|
||||||
|
IN PCOORD DestinationOrigin,
|
||||||
|
IN CHAR_INFO FillChar);
|
||||||
CSR_API(SrvScrollConsoleScreenBuffer)
|
CSR_API(SrvScrollConsoleScreenBuffer)
|
||||||
{
|
{
|
||||||
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
|
|
||||||
PCONSOLE Console;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buff;
|
|
||||||
SMALL_RECT ScreenBuffer;
|
|
||||||
SMALL_RECT SrcRegion;
|
|
||||||
SMALL_RECT DstRegion;
|
|
||||||
SMALL_RECT UpdateRegion;
|
|
||||||
SMALL_RECT ScrollRectangle;
|
|
||||||
SMALL_RECT ClipRectangle;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
HANDLE OutputHandle;
|
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
|
||||||
BOOLEAN UseClipRectangle;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
COORD DestinationOrigin;
|
|
||||||
CHAR_INFO FillChar;
|
|
||||||
|
|
||||||
DPRINT("SrvScrollConsoleScreenBuffer\n");
|
DPRINT("SrvScrollConsoleScreenBuffer\n");
|
||||||
|
|
||||||
OutputHandle = ScrollScreenBufferRequest->OutputHandle;
|
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle;
|
ScrollScreenBufferRequest->OutputHandle,
|
||||||
DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin;
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
FillChar = ScrollScreenBufferRequest->Fill;
|
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
Console = Buff->Header.Console;
|
Status = ConDrvScrollConsoleScreenBuffer(Buffer->Header.Console,
|
||||||
|
Buffer,
|
||||||
|
ScrollScreenBufferRequest->Unicode,
|
||||||
|
&ScrollScreenBufferRequest->ScrollRectangle,
|
||||||
|
ScrollScreenBufferRequest->UseClipRectangle,
|
||||||
|
&ScrollScreenBufferRequest->ClipRectangle,
|
||||||
|
&ScrollScreenBufferRequest->DestinationOrigin,
|
||||||
|
ScrollScreenBufferRequest->Fill);
|
||||||
|
|
||||||
ScrollRectangle = ScrollScreenBufferRequest->ScrollRectangle;
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
|
return Status;
|
||||||
/* Make sure source rectangle is inside the screen buffer */
|
|
||||||
ConioInitRect(&ScreenBuffer, 0, 0, Buff->ScreenBufferSize.Y - 1, Buff->ScreenBufferSize.X - 1);
|
|
||||||
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
|
|
||||||
{
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the source was clipped on the left or top, adjust the destination accordingly */
|
|
||||||
if (ScrollRectangle.Left < 0)
|
|
||||||
{
|
|
||||||
DestinationOrigin.X -= ScrollRectangle.Left;
|
|
||||||
}
|
|
||||||
if (ScrollRectangle.Top < 0)
|
|
||||||
{
|
|
||||||
DestinationOrigin.Y -= ScrollRectangle.Top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UseClipRectangle)
|
|
||||||
{
|
|
||||||
ClipRectangle = ScrollScreenBufferRequest->ClipRectangle;
|
|
||||||
if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer))
|
|
||||||
{
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ClipRectangle = ScreenBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConioInitRect(&DstRegion,
|
|
||||||
DestinationOrigin.Y,
|
|
||||||
DestinationOrigin.X,
|
|
||||||
DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
|
|
||||||
DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1);
|
|
||||||
|
|
||||||
if (!ScrollScreenBufferRequest->Unicode)
|
|
||||||
ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar);
|
|
||||||
|
|
||||||
ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, FillChar);
|
|
||||||
|
|
||||||
if ((PCONSOLE_SCREEN_BUFFER)Buff == Console->ActiveBuffer)
|
|
||||||
{
|
|
||||||
ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
|
|
||||||
if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle))
|
|
||||||
{
|
|
||||||
/* Draw update region */
|
|
||||||
ConioDrawRegion(Console, &UpdateRegion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue