Author: hbelusca Date: Sun Jun 23 18:20:39 2013 New Revision: 59322 URL: http://svn.reactos.org/svn/reactos?rev=59322&view=rev Log: [CONSRV] Finish to move some text functions to condrv.
Modified: trunk/reactos/win32ss/user/consrv/condrv/text.c trunk/reactos/win32ss/user/consrv/conoutput.c Modified: trunk/reactos/win32ss/user/consrv/condrv/text.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/condrv/text.c?rev=59322&r1=59321&r2=59322&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/condrv/text.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/condrv/text.c [iso-8859-1] Sun Jun 23 18:20:39 2013 @@ -438,7 +438,7 @@ } 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 (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y) @@ -1099,157 +1099,144 @@ return STATUS_SUCCESS; } - - -CSR_API(SrvGetConsoleScreenBufferInfo) +NTSTATUS NTAPI +ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo) +{ + if (Console == NULL || Buffer == NULL || ScreenBufferInfo == NULL) + return STATUS_INVALID_PARAMETER; + + /* Validity check */ + ASSERT(Console == Buffer->Header.Console); + + ScreenBufferInfo->dwSize = Buffer->ScreenBufferSize; + 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; + + // FIXME: Refine the computation + ScreenBufferInfo->dwMaximumWindowSize = Buffer->ScreenBufferSize; + + return STATUS_SUCCESS; +} + +NTSTATUS NTAPI +ConDrvSetConsoleTextAttribute(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN WORD Attribute) +{ + if (Console == NULL || Buffer == NULL) + return STATUS_INVALID_PARAMETER; + + /* Validity check */ + ASSERT(Console == Buffer->Header.Console); + + Buffer->ScreenDefaultAttrib = Attribute; + return STATUS_SUCCESS; +} + +NTSTATUS NTAPI +ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCOORD Size) { NTSTATUS Status; - PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest; - // PCONSOLE Console; - PTEXTMODE_SCREEN_BUFFER Buff; - PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info; - - DPRINT("SrvGetConsoleScreenBufferInfo\n"); - - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - // Console = Buff->Header.Console; - - 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; -} - -CSR_API(SrvSetConsoleTextAttribute) -{ - NTSTATUS Status; - PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest; - PTEXTMODE_SCREEN_BUFFER Buff; - - DPRINT("SrvSetConsoleTextAttribute\n"); - - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib; - - ConSrvReleaseScreenBuffer(Buff, TRUE); - return STATUS_SUCCESS; -} - -CSR_API(SrvSetConsoleScreenBufferSize) -{ - 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 (!NT_SUCCESS(Status)) return Status; - - Console = Buff->Header.Console; - - Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size); + + if (Console == NULL || Buffer == NULL || Size == NULL) + return STATUS_INVALID_PARAMETER; + + /* Validity check */ + ASSERT(Console == Buffer->Header.Console); + + Status = ConioResizeBuffer(Console, Buffer, *Size); if (NT_SUCCESS(Status)) ConioResizeTerminal(Console); - ConSrvReleaseScreenBuffer(Buff, TRUE); return Status; } -CSR_API(SrvScrollConsoleScreenBuffer) -{ - PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest; - PCONSOLE Console; - PTEXTMODE_SCREEN_BUFFER Buff; +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) +{ + COORD CapturedDestinationOrigin; SMALL_RECT ScreenBuffer; SMALL_RECT SrcRegion; SMALL_RECT DstRegion; SMALL_RECT UpdateRegion; - SMALL_RECT ScrollRectangle; - SMALL_RECT ClipRectangle; - NTSTATUS Status; - HANDLE OutputHandle; - BOOLEAN UseClipRectangle; - COORD DestinationOrigin; - CHAR_INFO FillChar; - - DPRINT("SrvScrollConsoleScreenBuffer\n"); - - OutputHandle = ScrollScreenBufferRequest->OutputHandle; - UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle; - DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin; - FillChar = ScrollScreenBufferRequest->Fill; - - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - Console = Buff->Header.Console; - - ScrollRectangle = ScrollScreenBufferRequest->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); + SMALL_RECT CapturedClipRectangle; + + if (Console == NULL || Buffer == NULL || ScrollRectangle == NULL || + (UseClipRectangle ? ClipRectangle == NULL : FALSE) || DestinationOrigin == NULL) + { + return STATUS_INVALID_PARAMETER; + } + + /* Validity check */ + ASSERT(Console == Buffer->Header.Console); + + CapturedDestinationOrigin = *DestinationOrigin; + + /* Make sure the source rectangle is inside the screen buffer */ + ConioInitRect(&ScreenBuffer, 0, 0, Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); + if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, ScrollRectangle)) + { 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 (ScrollRectangle->Left < 0) + { + CapturedDestinationOrigin.X -= ScrollRectangle->Left; + } + if (ScrollRectangle->Top < 0) + { + CapturedDestinationOrigin.Y -= ScrollRectangle->Top; } if (UseClipRectangle) { - ClipRectangle = ScrollScreenBufferRequest->ClipRectangle; - if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) - { - ConSrvReleaseScreenBuffer(Buff, TRUE); + CapturedClipRectangle = *ClipRectangle; + if (!ConioGetIntersection(&CapturedClipRectangle, &CapturedClipRectangle, &ScreenBuffer)) + { return STATUS_SUCCESS; } } else { - ClipRectangle = ScreenBuffer; + CapturedClipRectangle = ScreenBuffer; } ConioInitRect(&DstRegion, - DestinationOrigin.Y, - DestinationOrigin.X, - DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, - DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1); - - if (!ScrollScreenBufferRequest->Unicode) + CapturedDestinationOrigin.Y, + CapturedDestinationOrigin.X, + CapturedDestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, + CapturedDestinationOrigin.X + ConioRectWidth(&SrcRegion ) - 1); + + if (!Unicode) ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar); - ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, FillChar); - - if ((PCONSOLE_SCREEN_BUFFER)Buff == Console->ActiveBuffer) + ConioMoveRegion(Buffer, &SrcRegion, &DstRegion, &CapturedClipRectangle, FillChar); + + if ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer) { ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion); - if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle)) + if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &CapturedClipRectangle)) { /* Draw update region */ ConioDrawRegion(Console, &UpdateRegion); } } - ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } Modified: trunk/reactos/win32ss/user/consrv/conoutput.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/conoutput.c?rev=59322&r1=59321&r2=59322&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/conoutput.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/conoutput.c [iso-8859-1] Sun Jun 23 18:20:39 2013 @@ -684,160 +684,114 @@ return Status; } -#if 0000 - +NTSTATUS NTAPI +ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo); CSR_API(SrvGetConsoleScreenBufferInfo) { NTSTATUS Status; PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest; - // PCONSOLE Console; - PTEXTMODE_SCREEN_BUFFER Buff; - PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info; + PTEXTMODE_SCREEN_BUFFER Buffer; DPRINT("SrvGetConsoleScreenBufferInfo\n"); - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - // Console = Buff->Header.Console; - - 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; -} - + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + ScreenBufferInfoRequest->OutputHandle, + &Buffer, GENERIC_READ, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Status = ConDrvGetConsoleScreenBufferInfo(Buffer->Header.Console, + Buffer, + &ScreenBufferInfoRequest->Info); + + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; +} + +NTSTATUS NTAPI +ConDrvSetConsoleTextAttribute(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN WORD Attribute); CSR_API(SrvSetConsoleTextAttribute) { NTSTATUS Status; PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest; - PTEXTMODE_SCREEN_BUFFER Buff; + PTEXTMODE_SCREEN_BUFFER Buffer; DPRINT("SrvSetConsoleTextAttribute\n"); - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib; - - ConSrvReleaseScreenBuffer(Buff, TRUE); - return STATUS_SUCCESS; -} - + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + SetTextAttribRequest->OutputHandle, + &Buffer, GENERIC_WRITE, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Status = ConDrvSetConsoleTextAttribute(Buffer->Header.Console, + Buffer, + SetTextAttribRequest->Attrib); + + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; +} + +NTSTATUS NTAPI +ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCOORD Size); CSR_API(SrvSetConsoleScreenBufferSize) { 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 (!NT_SUCCESS(Status)) return Status; - - Console = Buff->Header.Console; - - Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size); - if (NT_SUCCESS(Status)) ConioResizeTerminal(Console); - - ConSrvReleaseScreenBuffer(Buff, TRUE); - return Status; -} - + PTEXTMODE_SCREEN_BUFFER Buffer; + + DPRINT("SrvSetConsoleScreenBufferSize\n"); + + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + SetScreenBufferSizeRequest->OutputHandle, + &Buffer, GENERIC_WRITE, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Status = ConDrvSetConsoleScreenBufferSize(Buffer->Header.Console, + Buffer, + &SetScreenBufferSizeRequest->Size); + + ConSrvReleaseScreenBuffer(Buffer, TRUE); + 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) { + NTSTATUS Status; 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; - HANDLE OutputHandle; - BOOLEAN UseClipRectangle; - COORD DestinationOrigin; - CHAR_INFO FillChar; + PTEXTMODE_SCREEN_BUFFER Buffer; DPRINT("SrvScrollConsoleScreenBuffer\n"); - OutputHandle = ScrollScreenBufferRequest->OutputHandle; - UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle; - DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin; - FillChar = ScrollScreenBufferRequest->Fill; - - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; - - Console = Buff->Header.Console; - - ScrollRectangle = ScrollScreenBufferRequest->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; - } - - /* 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 + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + ScrollScreenBufferRequest->OutputHandle, + &Buffer, GENERIC_WRITE, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Status = ConDrvScrollConsoleScreenBuffer(Buffer->Header.Console, + Buffer, + ScrollScreenBufferRequest->Unicode, + &ScrollScreenBufferRequest->ScrollRectangle, + ScrollScreenBufferRequest->UseClipRectangle, + &ScrollScreenBufferRequest->ClipRectangle, + &ScrollScreenBufferRequest->DestinationOrigin, + ScrollScreenBufferRequest->Fill); + + ConSrvReleaseScreenBuffer(Buffer, TRUE); + return Status; +} /* EOF */