Author: jmorlan Date: Thu Jul 17 16:53:39 2008 New Revision: 34568
URL: http://svn.reactos.org/svn/reactos?rev=34568&view=rev Log: Clean up console code a bit: - Get/SetConsoleTitle: Get rid of unnecessary handle creation; instead, just have csrss get the console from the ProcessData. - Instead of using ShowX/ShowY to store the origin of the buffer, use the VirtualX member that was put there for this purpose. Rename it to VirtualY, though, since it's a row number. ShowX/ShowY should hold the position of the visible window, once that's implemented. - From the CSRSS_CONSOLE structure: remove hActiveBuffer (redundant), CodePageId (unused), and hWindowIcon (only used as a temporary) - Make cursor coordinates be "logical", not "physical". This simplifies various things. - ConioConsoleFromProcessData: If process has no console, return STATUS_INVALID_HANDLE; don't pretend to succeed (causing many functions to access memory around address 0, which is probably not a good thing). Remove various Console != NULL checks which are now unnecessary.
Modified: trunk/reactos/dll/win32/kernel32/misc/console.c trunk/reactos/subsystems/win32/csrss/include/conio.h trunk/reactos/subsystems/win32/csrss/win32csr/conio.c trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c
Modified: trunk/reactos/dll/win32/kernel32/misc/console.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/con... ============================================================================== --- trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] Thu Jul 17 16:53:39 2008 @@ -3285,13 +3285,6 @@ { PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; - HANDLE hConsole; - - hConsole = CreateFileW(L"CONIN$", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hConsole == INVALID_HANDLE_VALUE) - { - return 0; - }
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0, CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR)); @@ -3302,13 +3295,11 @@ }
CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE); - Request->Data.GetTitleRequest.ConsoleHandle = hConsole;
Status = CsrClientCallServer(Request, NULL, CsrRequest, CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR)); - CloseHandle(hConsole); if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status))) { RtlFreeHeap(RtlGetProcessHeap(), 0, Request); @@ -3388,13 +3379,6 @@ PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; unsigned int c; - HANDLE hConsole; - - hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hConsole == INVALID_HANDLE_VALUE) - { - return FALSE; - }
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0, max (sizeof(CSR_API_MESSAGE), @@ -3407,7 +3391,6 @@ }
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE); - Request->Data.SetTitleRequest.Console = hConsole;
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ ) Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c]; @@ -3416,7 +3399,6 @@ NULL, CsrRequest, max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR))); - CloseHandle(hConsole); if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) ) { RtlFreeHeap(RtlGetProcessHeap(), 0, Request); @@ -3446,13 +3428,6 @@ PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; unsigned int c; - HANDLE hConsole; - - hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hConsole == INVALID_HANDLE_VALUE) - { - return FALSE; - }
Request = RtlAllocateHeap(RtlGetProcessHeap(), 0, max (sizeof(CSR_API_MESSAGE), @@ -3465,7 +3440,6 @@ }
CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE); - Request->Data.SetTitleRequest.Console = hConsole;
for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ ) Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c]; @@ -3474,7 +3448,6 @@ NULL, CsrRequest, max (sizeof(CSR_API_MESSAGE), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR))); - CloseHandle(hConsole); if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Request->Status ) ) { RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
Modified: trunk/reactos/subsystems/win32/csrss/include/conio.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/incl... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/include/conio.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/include/conio.h [iso-8859-1] Thu Jul 17 16:53:39 2008 @@ -25,7 +25,7 @@ * do a massive memcpy() to scroll the contents of the buffer up to * * scroll the screen on output, instead I just shift down the position * * to be displayed, and let it wrap around to the top again. * - * The VirtualX member keeps track of the top X coord that win32 * + * The VirtualY member keeps track of the top Y coord that win32 * * clients THINK is currently being displayed, because they think that * * when the display reaches the bottom of the buffer and another line * * being printed causes another line to scroll down, that the buffer IS * @@ -42,7 +42,7 @@ ULONG CurrentX; /* Current X cursor position */ ULONG CurrentY; /* Current Y cursor position */ BYTE DefaultAttrib; /* default char attribute */ - USHORT VirtualX; /* top row of buffer being displayed, reported to callers */ + USHORT VirtualY; /* top row of buffer being displayed, reported to callers */ CONSOLE_CURSOR_INFO CursorInfo; USHORT Mode; } CSRSS_SCREEN_BUFFER, *PCSRSS_SCREEN_BUFFER; @@ -59,7 +59,7 @@ BOOL (STDCALL *UpdateScreenInfo)(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer); BOOL (STDCALL *ChangeTitle)(PCSRSS_CONSOLE Console); VOID (STDCALL *CleanupConsole)(PCSRSS_CONSOLE Console); - BOOL (STDCALL *ChangeIcon)(PCSRSS_CONSOLE Console); + BOOL (STDCALL *ChangeIcon)(PCSRSS_CONSOLE Console, HICON hWindowIcon); } CSRSS_CONSOLE_VTBL, *PCSRSS_CONSOLE_VTBL;
typedef struct tagCSRSS_CONSOLE @@ -71,19 +71,12 @@ WORD WaitingChars; WORD WaitingLines; /* number of chars and lines in input queue */ PCSRSS_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ - HANDLE hActiveBuffer; WORD Mode; /* Console mode flags */ WORD EchoCount; /* count of chars to echo, in line buffered mode */ UNICODE_STRING Title; /* Title of console */ - struct /* active code pages */ - { - UINT Input; - UINT Output; - } CodePageId; BOOL EarlyReturn; /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */ DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */ HWND hWindow; - HICON hWindowIcon; COORD Size; PVOID PrivateData; UINT CodePage; @@ -95,11 +88,7 @@ VOID STDCALL ConioDeleteConsole(Object_t *Object); VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer); void STDCALL ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode); -void FASTCALL ConioPhysicalToLogical(PCSRSS_SCREEN_BUFFER Buff, - ULONG PhysicalX, - ULONG PhysicalY, - LONG *LogicalX, - LONG *LogicalY); +DWORD FASTCALL ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y); VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console); VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData); VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, @@ -171,7 +160,7 @@ Win32CsrLockObject((ProcessData), (Handle), (Object_t **)(Ptr), CONIO_SCREEN_BUFFER_MAGIC) #define ConioUnlockScreenBuffer(Buff) \ Win32CsrUnlockObject((Object_t *) Buff) -#define ConioChangeIcon(Console) (Console)->Vtbl->ChangeIcon(Console) +#define ConioChangeIcon(Console, hWindowIcon) (Console)->Vtbl->ChangeIcon(Console, hWindowIcon)
#endif /* CONIO_H_INCLUDED */
Modified: trunk/reactos/subsystems/win32/csrss/win32csr/conio.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win3... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/win32csr/conio.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/win32csr/conio.c [iso-8859-1] Thu Jul 17 16:53:39 2008 @@ -44,7 +44,7 @@ if (!ProcessConsole) { *Console = NULL; - return STATUS_SUCCESS; + return STATUS_INVALID_HANDLE; }
EnterCriticalSection(&(ProcessConsole->Header.Lock)); @@ -82,6 +82,12 @@ ConioConsoleCtrlEventTimeout(Event, ProcessData, INFINITE); }
+DWORD FASTCALL +ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) +{ + return 2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X); +} + #define GET_CELL_BUFFER(b,o)\ (b)->Buffer[(o)++]
@@ -92,7 +98,7 @@ static VOID FASTCALL ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff) { - DWORD Offset = 2 * (Buff->CurrentY * Buff->MaxX); + DWORD Offset = ConioGetBufferOffset(Buff, 0, Buff->CurrentY); UINT Pos;
for (Pos = 0; Pos < Buff->MaxX; Pos++) @@ -112,6 +118,7 @@ Buffer->Header.ReferenceCount = 0; Buffer->ShowX = 0; Buffer->ShowY = 0; + Buffer->VirtualY = 0; Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, Buffer->MaxX * Buffer->MaxY * 2); if (NULL == Buffer->Buffer) { @@ -153,7 +160,6 @@ Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT; Console->EarlyReturn = FALSE; Console->ActiveBuffer = NULL; - Console->hActiveBuffer = INVALID_HANDLE_VALUE; InitializeListHead(&Console->InputEvents); Console->CodePage = GetOEMCP(); Console->OutputCodePage = GetOEMCP(); @@ -187,7 +193,6 @@ NewBuffer->CursorInfo.dwSize = 5; /* make console active, and insert into console list */ Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer; - Console->hActiveBuffer = INVALID_HANDLE_VALUE;
if (! GuiMode) { @@ -335,7 +340,6 @@ ProcessData->Console = 0; return Request->Status = Status; } - Console->hActiveBuffer = Request->Data.AllocConsoleRequest.OutputHandle; }
/* Duplicate the Event */ @@ -398,29 +402,23 @@ static VOID FASTCALL ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, RECT *UpdateRect, UINT *ScrolledLines) { + /* If we hit bottom, slide the viewable screen */ if (++Buff->CurrentY == Buff->MaxY) { - Buff->CurrentY = 0; - } - /* If we hit bottom, slide the viewable screen */ - if (Buff->CurrentY == Buff->ShowY) - { - if (++Buff->ShowY == Buff->MaxY) - { - Buff->ShowY = 0; + Buff->CurrentY--; + if (++Buff->VirtualY == Buff->MaxY) + { + Buff->VirtualY = 0; } (*ScrolledLines)++; ClearLineBuffer(Buff); + if (UpdateRect->top != 0) + { + UpdateRect->top--; + } } UpdateRect->left = 0; UpdateRect->right = Buff->MaxX - 1; - if (UpdateRect->top == (LONG)Buff->CurrentY) - { - if (++UpdateRect->top == Buff->MaxY) - { - UpdateRect->top = 0; - } - } UpdateRect->bottom = Buff->CurrentY; }
@@ -434,7 +432,8 @@ LONG CursorStartX, CursorStartY; UINT ScrolledLines;
- ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorStartX, &CursorStartY); + CursorStartX = Buff->CurrentX; + CursorStartY = Buff->CurrentY; UpdateRect.left = Buff->MaxX; UpdateRect.top = Buff->CurrentY; UpdateRect.right = -1; @@ -456,31 +455,20 @@ else if (Buffer[i] == '\b') { /* Only handle BS if we're not on the first pos of the first line */ - if (0 != Buff->CurrentX || Buff->ShowY != Buff->CurrentY) + if (0 != Buff->CurrentX || 0 != Buff->CurrentY) { if (0 == Buff->CurrentX) { /* slide virtual position up */ Buff->CurrentX = Buff->MaxX - 1; - if (0 == Buff->CurrentY) - { - Buff->CurrentY = Buff->MaxY; - } - else - { - Buff->CurrentY--; - } - if ((0 == UpdateRect.top && UpdateRect.bottom < (LONG)Buff->CurrentY) - || (0 != UpdateRect.top && (LONG)Buff->CurrentY < UpdateRect.top)) - { - UpdateRect.top = Buff->CurrentY; - } + Buff->CurrentY--; + UpdateRect.top = min(UpdateRect.top, (LONG)Buff->CurrentY); } else { - Buff->CurrentX--; + Buff->CurrentX--; } - Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX); + Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib); UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX); UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX); @@ -506,7 +494,7 @@ { EndX = Buff->MaxX; } - Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX); + Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); while (Buff->CurrentX < EndX) { Buff->Buffer[Offset] = ' '; @@ -532,7 +520,7 @@ } UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX); UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX); - Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX); + Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); Buff->Buffer[Offset++] = Buffer[i]; if (Attrib) { @@ -553,11 +541,7 @@ } }
- ConioPhysicalToLogical(Buff, UpdateRect.left, UpdateRect.top, &(UpdateRect.left), - &(UpdateRect.top)); - ConioPhysicalToLogical(Buff, UpdateRect.right, UpdateRect.bottom, &(UpdateRect.right), - &(UpdateRect.bottom)); - if (! ConioIsRectEmpty(&UpdateRect) && NULL != Console && Buff == Console->ActiveBuffer) + if (! ConioIsRectEmpty(&UpdateRect) && Buff == Console->ActiveBuffer) { ConioWriteStream(Console, &UpdateRect, CursorStartX, CursorStartY, ScrolledLines, Buffer, Length); @@ -709,24 +693,6 @@ return Request->Status; }
-VOID FASTCALL -ConioPhysicalToLogical(PCSRSS_SCREEN_BUFFER Buff, - ULONG PhysicalX, - ULONG PhysicalY, - LONG *LogicalX, - LONG *LogicalY) -{ - *LogicalX = PhysicalX; - if (PhysicalY < Buff->ShowY) - { - *LogicalY = Buff->MaxY - Buff->ShowY + PhysicalY; - } - else - { - *LogicalY = PhysicalY - Buff->ShowY; - } -} - BOOLEAN __inline ConioGetIntersection( RECT *Intersection, RECT *Rect1, @@ -814,8 +780,8 @@ } for (i = 0; i < Height; i++) { - PWORD SRow = (PWORD)&ScreenBuffer->Buffer[((SY + ScreenBuffer->ShowY) % ScreenBuffer->MaxY) * ScreenBuffer->MaxX * 2]; - PWORD DRow = (PWORD)&ScreenBuffer->Buffer[((DY + ScreenBuffer->ShowY) % ScreenBuffer->MaxY) * ScreenBuffer->MaxX * 2]; + PWORD SRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, SY)]; + PWORD DRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, DY)];
SX = SrcRegion->left; DX = DstRegion->left; @@ -934,10 +900,7 @@ RtlFreeHeap(GetProcessHeap(), 0, Buffer); } } - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
Request->Data.WriteConsoleRequest.NrCharactersWritten = Written;
@@ -988,7 +951,6 @@ }
Console->ActiveBuffer = NULL; - Console->hActiveBuffer = INVALID_HANDLE_VALUE;
CloseHandle(Console->ActiveEvent); DeleteCriticalSection(&Console->Header.Lock); @@ -1050,27 +1012,22 @@ if (VK_UP == KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode) { /* only scroll up if there is room to scroll up into */ - if (Console->ActiveBuffer->ShowY != ((Console->ActiveBuffer->CurrentY + 1) % - Console->ActiveBuffer->MaxY)) + if (Console->ActiveBuffer->CurrentY != Console->ActiveBuffer->MaxY - 1) { - Console->ActiveBuffer->ShowY = (Console->ActiveBuffer->ShowY + - Console->ActiveBuffer->MaxY - 1) % - Console->ActiveBuffer->MaxY; + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + + Console->ActiveBuffer->MaxY - 1) % + Console->ActiveBuffer->MaxY; + Console->ActiveBuffer->CurrentY++; } } - else if (Console->ActiveBuffer->ShowY != Console->ActiveBuffer->CurrentY) - /* only scroll down if there is room to scroll down into */ - { - if (Console->ActiveBuffer->ShowY % Console->ActiveBuffer->MaxY != - Console->ActiveBuffer->CurrentY) + else + { + /* only scroll down if there is room to scroll down into */ + if (Console->ActiveBuffer->CurrentY != 0) { - if (((Console->ActiveBuffer->CurrentY + 1) % Console->ActiveBuffer->MaxY) != - (Console->ActiveBuffer->ShowY + Console->ActiveBuffer->MaxY) % - Console->ActiveBuffer->MaxY) - { - Console->ActiveBuffer->ShowY = (Console->ActiveBuffer->ShowY + 1) % - Console->ActiveBuffer->MaxY; - } + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) % + Console->ActiveBuffer->MaxY; + Console->ActiveBuffer->CurrentY--; } } ConioDrawConsole(Console); @@ -1363,8 +1320,8 @@ pInfo = &Request->Data.ScreenBufferInfoRequest.Info; pInfo->dwSize.X = Buff->MaxX; pInfo->dwSize.Y = Buff->MaxY; - pInfo->dwCursorPosition.X = Buff->CurrentX - Buff->ShowX; - pInfo->dwCursorPosition.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY; + pInfo->dwCursorPosition.X = Buff->CurrentX; + pInfo->dwCursorPosition.Y = Buff->CurrentY; pInfo->wAttributes = Buff->DefaultAttrib; pInfo->srWindow.Left = 0; pInfo->srWindow.Right = Buff->MaxX - 1; @@ -1401,10 +1358,7 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = Status; }
@@ -1414,33 +1368,25 @@ NewCursorY < 0 || NewCursorY >= Buff->MaxY) { ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { + ConioUnlockConsole(Console); + return Request->Status = STATUS_INVALID_PARAMETER; + } + OldCursorX = Buff->CurrentX; + OldCursorY = Buff->CurrentY; + Buff->CurrentX = NewCursorX; + Buff->CurrentY = NewCursorY; + if (Buff == Console->ActiveBuffer) + { + if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY)) + { + ConioUnlockScreenBuffer(Buff); ConioUnlockConsole(Console); - } - return Request->Status = STATUS_INVALID_PARAMETER; - } - ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &OldCursorX, &OldCursorY); - Buff->CurrentX = NewCursorX + Buff->ShowX; - Buff->CurrentY = (NewCursorY + Buff->ShowY) % Buff->MaxY; - if (NULL != Console && Buff == Console->ActiveBuffer) - { - if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY)) - { - ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } return Request->Status = STATUS_UNSUCCESSFUL; } }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
return Request->Status = STATUS_SUCCESS; } @@ -1532,8 +1478,8 @@ &Buff); if (NT_SUCCESS(Status)) { - X = Request->Data.WriteConsoleOutputCharRequest.Coord.X + Buff->ShowX; - Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY; + X = Request->Data.WriteConsoleOutputCharRequest.Coord.X; + Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Length = Request->Data.WriteConsoleOutputCharRequest.Length; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; while (Length--) @@ -1551,15 +1497,15 @@ X = 0; } } - if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord, Request->Data.WriteConsoleOutputCharRequest.Length); ConioDrawRegion(Console, &UpdateRect); }
- Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X - Buff->ShowX; - Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY; + Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X; + Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff); } @@ -1568,10 +1514,7 @@ RtlFreeHeap(GetProcessHeap(), 0, tmpString); } } - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); } Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written; return Request->Status = Status; @@ -1601,15 +1544,12 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } - return Request->Status = Status; - } - - X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX; - Y = (Request->Data.FillOutputRequest.Position.Y + Buff->ShowY) % Buff->MaxY; + ConioUnlockConsole(Console); + return Request->Status = Status; + } + + X = Request->Data.FillOutputRequest.Position.X; + Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; if(Request->Data.FillOutputRequest.Unicode) ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar); @@ -1632,7 +1572,7 @@ } }
- if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position, Request->Data.FillOutputRequest.Length); @@ -1640,10 +1580,7 @@ }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); Length = Request->Data.FillOutputRequest.Length; Request->Data.FillOutputRequest.NrCharactersWritten = Length; return Request->Status; @@ -1763,15 +1700,12 @@ &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } - return Request->Status = Status; - } - - X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX; - Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY; + ConioUnlockConsole(Console); + return Request->Status = Status; + } + + X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X; + Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Length = Request->Data.WriteConsoleOutputAttribRequest.Length; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1]; Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute; @@ -1790,20 +1724,17 @@ } }
- if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord, Request->Data.WriteConsoleOutputAttribRequest.Length); ConioDrawRegion(Console, &UpdateRect); }
- if (NULL != Console) - { - ConioUnlockConsole(Console); - } - - Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = Buff->CurrentX - Buff->ShowX; - Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY; + ConioUnlockConsole(Console); + + Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X; + Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff);
@@ -1833,15 +1764,12 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } - return Request->Status = Status; - } - - X = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX; - Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY; + ConioUnlockConsole(Console); + return Request->Status = Status; + } + + X = Request->Data.FillOutputAttribRequest.Coord.X; + Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Length = Request->Data.FillOutputAttribRequest.Length; Attr = Request->Data.FillOutputAttribRequest.Attribute; Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1]; @@ -1860,7 +1788,7 @@ } }
- if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord, Request->Data.FillOutputAttribRequest.Length); @@ -1868,10 +1796,7 @@ }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
return Request->Status = STATUS_SUCCESS; } @@ -1921,10 +1846,7 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = Status; }
@@ -1945,7 +1867,7 @@ Buff->CursorInfo.dwSize = Size; Buff->CursorInfo.bVisible = Visible;
- if (NULL != Console && ! ConioSetCursorInfo(Console, Buff)) + if (! ConioSetCursorInfo(Console, Buff)) { ConioUnlockScreenBuffer(Buff); ConioUnlockConsole(Console); @@ -1954,10 +1876,7 @@ }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
return Request->Status = STATUS_SUCCESS; } @@ -1979,15 +1898,12 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = Status; }
Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib; - if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { if (! ConioUpdateScreenInfo(Console, Buff)) { @@ -1998,10 +1914,7 @@ }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
return Request->Status = STATUS_SUCCESS; } @@ -2095,10 +2008,6 @@ { return Request->Status = Status; } - if (NULL == Console) - { - return Request->Status = STATUS_INVALID_HANDLE; - }
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); @@ -2162,11 +2071,6 @@ { return Request->Status = Status; } - if (NULL == Console) - { - DPRINT1("Trying to set screen buffer for app without console\n"); - return Request->Status = STATUS_INVALID_HANDLE; - }
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); @@ -2192,7 +2096,6 @@ } /* tie console to new buffer */ Console->ActiveBuffer = Buff; - Console->hActiveBuffer = Request->Data.SetScreenBufferRequest.OutputHandle; /* inc ref count on new buffer */ InterlockedIncrement(&Buff->Header.ReferenceCount); /* Redraw the console */ @@ -2222,7 +2125,7 @@ return Request->Status = STATUS_INVALID_PARAMETER; }
- Status = ConioLockConsole(ProcessData, Request->Data.SetTitleRequest.Console, &Console); + Status = ConioConsoleFromProcessData(ProcessData, &Console); Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); if(! NT_SUCCESS(Status)) @@ -2252,8 +2155,8 @@ { Request->Status = STATUS_NO_MEMORY; } - } - ConioUnlockConsole(Console); + ConioUnlockConsole(Console); + }
return Request->Status; } @@ -2268,9 +2171,7 @@
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioLockConsole(ProcessData, - Request->Data.GetTitleRequest.ConsoleHandle, - &Console); + Status = ConioConsoleFromProcessData(ProcessData, &Console); if (! NT_SUCCESS(Status)) { DPRINT1("Can't get console\n"); @@ -2327,10 +2228,7 @@ &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = Status; }
@@ -2371,7 +2269,7 @@ for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++) { CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X; - Offset = (((Y + Buff->ShowY) % Buff->MaxY) * Buff->MaxX + WriteRegion.left) * 2; + Offset = ConioGetBufferOffset(Buff, WriteRegion.left, Y); for (X = WriteRegion.left; X <= WriteRegion.right; X++) { if (Request->Data.WriteConsoleOutputRequest.Unicode) @@ -2388,10 +2286,7 @@ } }
- if (NULL != Console) - { - ConioDrawRegion(Console, &WriteRegion); - } + ConioDrawRegion(Console, &WriteRegion);
ConioUnlockScreenBuffer(Buff); ConioUnlockConsole(Console); @@ -2474,10 +2369,7 @@ Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = Status; }
@@ -2491,10 +2383,7 @@ if (! ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle)) { ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); return Request->Status = STATUS_SUCCESS; }
@@ -2516,10 +2405,7 @@ ClipRectangle.bottom = Request->Data.ScrollConsoleScreenBufferRequest.ClipRectangle.Bottom; if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console); ConioUnlockScreenBuffer(Buff); return Request->Status = STATUS_SUCCESS; } @@ -2542,7 +2428,7 @@
ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, Fill.Attributes << 8 | (BYTE)FillChar);
- if (NULL != Console && Buff == Console->ActiveBuffer) + if (Buff == Console->ActiveBuffer) { ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion); if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle)) @@ -2553,10 +2439,7 @@ }
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
return Request->Status = STATUS_SUCCESS; } @@ -2589,15 +2472,12 @@ Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { - if (NULL != Console) - { - ConioUnlockConsole(Console); - } - return Request->Status = Status; - } - - Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X + Buff->ShowX; - Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->ShowY) % Buff->MaxY; + ConioUnlockConsole(Console); + return Request->Status = Status; + } + + Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X; + Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i) { @@ -2627,14 +2507,11 @@
*ReadBuffer = 0; Request->Status = STATUS_SUCCESS; - Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos - Buff->ShowX; - Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY; + Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos; + Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff); - if (NULL != Console) - { - ConioUnlockConsole(Console); - } + ConioUnlockConsole(Console);
Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize; if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE)) @@ -2668,8 +2545,8 @@ return Request->Status = Status; }
- Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X + Buff->ShowX; - Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->ShowY) % Buff->MaxY; + Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X; + Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
for (i = 0; i < Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i) { @@ -2693,8 +2570,8 @@ *ReadBuffer = 0;
Request->Status = STATUS_SUCCESS; - Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos - Buff->ShowX; - Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->ShowY + Buff->MaxY) % Buff->MaxY; + Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos; + Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff);
@@ -2890,7 +2767,7 @@ { CurCharInfo = CharInfo + (i * BufferSize.X);
- Offset = (((Y + Buff->ShowY) % Buff->MaxY) * Buff->MaxX + ReadRegion.left) * 2; + Offset = ConioGetBufferOffset(Buff, ReadRegion.left, Y); for (X = ReadRegion.left; X < ReadRegion.right; ++X) { if (Request->Data.ReadConsoleOutputRequest.Unicode) @@ -3095,8 +2972,8 @@ return Request->Status = Status; }
- Console->hWindowIcon = Request->Data.SetConsoleIconRequest.WindowIcon; - Request->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); + Request->Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon) + ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); ConioUnlockConsole(Console);
return Request->Status;
Modified: trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win3... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/win32csr/guiconsole.c [iso-8859-1] Thu Jul 17 16:53:39 2008 @@ -780,21 +780,6 @@ }
static VOID FASTCALL -GuiConsoleGetLogicalCursorPos(PCSRSS_SCREEN_BUFFER Buff, ULONG *CursorX, ULONG *CursorY) -{ - *CursorX = Buff->CurrentX; - if (Buff->CurrentY < Buff->ShowY) - { - *CursorY = Buff->MaxY - Buff->ShowY + Buff->CurrentY; - } - else - { - *CursorY = Buff->CurrentY - Buff->ShowY; - } -} - - -static VOID FASTCALL GuiConsoleUpdateSelection(HWND hWnd, PRECT rc, PGUI_CONSOLE_DATA GuiData) { RECT oldRect = GuiData->Selection; @@ -895,15 +880,7 @@
for (Line = TopLine; Line <= BottomLine; Line++) { - if (Line + Buff->ShowY < Buff->MaxY) - { - From = Buff->Buffer + ((Line + Buff->ShowY) * Buff->MaxX + LeftChar) * 2; - } - else - { - From = Buff->Buffer + - ((Line - (Buff->MaxY - Buff->ShowY)) * Buff->MaxX + LeftChar) * 2; - } + From = Buff->Buffer + ConioGetBufferOffset(Buff, LeftChar, Line); Start = LeftChar; To = GuiData->LineBuffer;
@@ -947,9 +924,8 @@ if (Buff->CursorInfo.bVisible && GuiData->CursorBlinkOn && !GuiData->ForceCursorOff) { - GuiConsoleGetLogicalCursorPos(Buff, - &CursorX, - &CursorY); + CursorX = Buff->CurrentX; + CursorY = Buff->CurrentY; if (LeftChar <= CursorX && CursorX <= RightChar && TopLine <= CursorY && CursorY <= BottomLine) { @@ -958,7 +934,7 @@ { CursorHeight = 1; } - From = Buff->Buffer + (Buff->CurrentY * Buff->MaxX + Buff->CurrentX) * 2 + 1; + From = Buff->Buffer + ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY) + 1;
if (*From != DEFAULT_ATTRIB) { @@ -1165,8 +1141,8 @@ GuiInvalidateCell(GuiData, Console->hWindow, CursorStartX, CursorStartY); }
- ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, - &CursorEndX, &CursorEndY); + CursorEndX = Buff->CurrentX; + CursorEndY = Buff->CurrentY; if ((CursorEndX < Region->left || Region->right < CursorEndX || CursorEndY < Region->top || Region->bottom < CursorEndY) && (CursorEndX != CursorStartX || CursorEndY != CursorStartY)) @@ -1182,8 +1158,8 @@
if (Console->ActiveBuffer == Buff) { - ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, - &UpdateRect.left, &UpdateRect.top); + UpdateRect.left = Buff->CurrentX; + UpdateRect.top = Buff->CurrentY; UpdateRect.right = UpdateRect.left; UpdateRect.bottom = UpdateRect.top; ConioDrawRegion(Console, &UpdateRect); @@ -1206,8 +1182,8 @@ UpdateRect.bottom = OldCursorY; ConioDrawRegion(Console, &UpdateRect); /* Redraw char at new position (shows cursor) */ - ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, - &(UpdateRect.left), &(UpdateRect.top)); + UpdateRect.left = Buff->CurrentX; + UpdateRect.top = Buff->CurrentY; UpdateRect.right = UpdateRect.left; UpdateRect.bottom = UpdateRect.top; ConioDrawRegion(Console, &UpdateRect); @@ -1236,16 +1212,14 @@ PCSRSS_CONSOLE Console; PGUI_CONSOLE_DATA GuiData; RECT CursorRect; - ULONG CursorX, CursorY;
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); GuiData->CursorBlinkOn = ! GuiData->CursorBlinkOn;
- GuiConsoleGetLogicalCursorPos(Console->ActiveBuffer, &CursorX, &CursorY); - CursorRect.left = CursorX; - CursorRect.top = CursorY; - CursorRect.right = CursorX; - CursorRect.bottom = CursorY; + CursorRect.left = Console->ActiveBuffer->CurrentX; + CursorRect.top = Console->ActiveBuffer->CurrentY; + CursorRect.right = CursorRect.left; + CursorRect.bottom = CursorRect.top; GuiDrawRegion(Console, &CursorRect); }
@@ -1575,21 +1549,16 @@ { DWORD windx, windy; RECT rect; - PCSRSS_SCREEN_BUFFER ActiveBuffer; - PCSRSS_PROCESS_DATA ProcessData = NULL; - - if (Console->ProcessList.Flink != &Console->ProcessList) - { - ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); - ConioLockScreenBuffer(ProcessData, Console->hActiveBuffer, (Object_t **)&ActiveBuffer); - } + PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer; + + EnterCriticalSection(&ActiveBuffer->Header.Lock);
/* apply text / background color */ GuiData->ScreenText = pConInfo->ScreenText; GuiData->ScreenBackground = pConInfo->ScreenBackground;
/* apply cursor size */ - Console->ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100); + ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100);
windx = LOWORD(pConInfo->ScreenBuffer); windy = HIWORD(pConInfo->ScreenBuffer); @@ -1640,13 +1609,13 @@ } #endif Offset += (diff * 2); - BufferOffset += (Console->ActiveBuffer->MaxX * 2); + BufferOffset += (ActiveBuffer->MaxX * 2); } }
- if (windy > Console->ActiveBuffer->MaxY) - { - diff = windy - Console->ActiveBuffer->MaxX; + if (windy > ActiveBuffer->MaxY) + { + diff = windy - ActiveBuffer->MaxX; #if HAVE_WMEMSET wmemset((WCHAR*)&Buffer[Offset], value, diff * windx); #else @@ -1658,18 +1627,15 @@ #endif }
- (void)InterlockedExchangePointer((PVOID volatile *)&Console->ActiveBuffer->Buffer, Buffer); + (void)InterlockedExchangePointer((PVOID volatile *)&ActiveBuffer->Buffer, Buffer); HeapFree(Win32CsrApiHeap, 0, OldBuffer); - Console->ActiveBuffer->MaxX = windx; - Console->ActiveBuffer->MaxY = windy; + ActiveBuffer->MaxX = windx; + ActiveBuffer->MaxY = windy; InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE); } else { - if (ProcessData) - { - ConioUnlockScreenBuffer(ActiveBuffer); - } + LeaveCriticalSection(&ActiveBuffer->Header.Lock); return; } } @@ -1687,10 +1653,7 @@ } else { - if (ProcessData) - { - ConioUnlockScreenBuffer(ActiveBuffer); - } + LeaveCriticalSection(&ActiveBuffer->Header.Lock); return; } } @@ -1709,7 +1672,7 @@
MoveWindow(pConInfo->hConsoleWindow, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);
- if (Console->Size.X < Console->ActiveBuffer->MaxX) + if (Console->Size.X < ActiveBuffer->MaxX) { /* show scrollbar when window becomes smaller than active screen buffer */ ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, TRUE); @@ -1720,10 +1683,7 @@ ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, FALSE); } } - if (ProcessData) - { - ConioUnlockScreenBuffer(ActiveBuffer); - } + LeaveCriticalSection(&ActiveBuffer->Header.Lock); InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE); }
@@ -2087,10 +2047,10 @@ }
static BOOL STDCALL -GuiChangeIcon(PCSRSS_CONSOLE Console) -{ - SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)Console->hWindowIcon); - SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)Console->hWindowIcon); +GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon) +{ + SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon); + SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon);
return TRUE; }
Modified: trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/win3... ============================================================================== --- trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c [iso-8859-1] Thu Jul 17 16:53:39 2008 @@ -86,8 +86,7 @@ LONG i; PBYTE Src, SrcEnd;
- Src = Buff->Buffer + (((Region->top + Buff->ShowY) % Buff->MaxY) * Buff->MaxX - + Region->left + Buff->ShowX) * 2; + Src = Buff->Buffer + ConioGetBufferOffset(Buff, Region->left, Region->top); SrcDelta = Buff->MaxX * 2; SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2; DestDelta = ConioRectWidth(Region) * 2; @@ -108,7 +107,6 @@ { DWORD BytesReturned; PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; - LONG CursorX, CursorY; PCONSOLE_DRAW ConsoleDraw; UINT ConsoleDrawSize;
@@ -125,13 +123,12 @@ DPRINT1("HeapAlloc failed\n"); return; } - ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorX, &CursorY); ConsoleDraw->X = Region->left; ConsoleDraw->Y = Region->top; ConsoleDraw->SizeX = ConioRectWidth(Region); ConsoleDraw->SizeY = ConioRectHeight(Region); - ConsoleDraw->CursorX = CursorX; - ConsoleDraw->CursorY = CursorY; + ConsoleDraw->CursorX = Buff->CurrentX; + ConsoleDraw->CursorY = Buff->CurrentY;
TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region);
@@ -189,7 +186,6 @@ TuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY) { CONSOLE_SCREEN_BUFFER_INFO Info; - LONG CursorX, CursorY; DWORD BytesReturned;
if (ActiveConsole->ActiveBuffer != Buff) @@ -197,9 +193,8 @@ return TRUE; }
- ConioPhysicalToLogical(Buff, Buff->CurrentX, Buff->CurrentY, &CursorX, &CursorY); - Info.dwCursorPosition.X = CursorX; - Info.dwCursorPosition.Y = CursorY; + Info.dwCursorPosition.X = Buff->CurrentX; + Info.dwCursorPosition.Y = Buff->CurrentY; Info.wAttributes = Buff->DefaultAttrib;
if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,