* create a CSRSS_SCREEN_BUFFER object before TuiInit/GuiInit 
  -> required for variable screen buffer sizes
* improve error handling in CsrCreateScreenBuffer

guiconsole.c:
* directly store WindowSize in CSRSS_CONSOLE struct
* read ScreenBufferSize value from registry and store result in CSRSS_SCREEN_BUFFER 
* use default values for ScreenBufferSize / WindowSize

tuiconsole.c:
* set screenbuffer size to size of physical console size in init

svn path=/trunk/; revision=23031
This commit is contained in:
Johannes Anderwald 2006-07-12 21:06:21 +00:00
parent b06a110bee
commit d94f7c6e2b
3 changed files with 107 additions and 68 deletions

View file

@ -108,14 +108,13 @@ static NTSTATUS FASTCALL
CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console,
PCSRSS_SCREEN_BUFFER Buffer)
{
DPRINT("CsrInitConsoleScreenBuffer Size X %d Size Y %d\n", Buffer->MaxX, Buffer->MaxY);
Buffer->Header.Type = CONIO_SCREEN_BUFFER_MAGIC;
Buffer->Header.ReferenceCount = 0;
Buffer->MaxX = Console->Size.X;
Buffer->MaxY = Console->Size.Y;
Buffer->ShowX = 0;
Buffer->ShowY = 0;
//FIXME
Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, 0, Buffer->MaxX * Buffer->MaxY * 2);
Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, Buffer->MaxX * Buffer->MaxY * sizeof(WCHAR));
if (NULL == Buffer->Buffer)
{
return STATUS_INSUFFICIENT_RESOURCES;
@ -176,7 +175,23 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
}
Console->PrivateData = NULL;
InitializeCriticalSection(&Console->Header.Lock);
GuiMode = DtbgIsDesktopVisible();
/* allocate console screen buffer */
NewBuffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER));
/* make console active, and insert into console list */
Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer;
/* add a reference count because the buffer is tied to the console */
InterlockedIncrement(&Console->ActiveBuffer->Header.ReferenceCount);
if (NULL == NewBuffer)
{
RtlFreeUnicodeString(&Console->Title);
DeleteCriticalSection(&Console->Header.Lock);
CloseHandle(Console->ActiveEvent);
return STATUS_INSUFFICIENT_RESOURCES;
}
if (! GuiMode)
{
Status = TuiInitConsole(Console);
@ -191,22 +206,15 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
Status = GuiInitConsole(Console);
if (! NT_SUCCESS(Status))
{
HeapFree(Win32CsrApiHeap,0, NewBuffer);
RtlFreeUnicodeString(&Console->Title);
DeleteCriticalSection(&Console->Header.Lock);
DeleteCriticalSection(&Console->Header.Lock);
CloseHandle(Console->ActiveEvent);
DPRINT1("GuiInitConsole: failed\n");
return Status;
}
}
NewBuffer = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER));
if (NULL == NewBuffer)
{
ConioCleanupConsole(Console);
RtlFreeUnicodeString(&Console->Title);
DeleteCriticalSection(&Console->Header.Lock);
CloseHandle(Console->ActiveEvent);
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = CsrInitConsoleScreenBuffer(Console, NewBuffer);
if (! NT_SUCCESS(Status))
{
@ -215,12 +223,11 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
DeleteCriticalSection(&Console->Header.Lock);
CloseHandle(Console->ActiveEvent);
HeapFree(Win32CsrApiHeap, 0, NewBuffer);
DPRINT1("CsrInitConsoleScreenBuffer: failed\n");
return Status;
}
Console->ActiveBuffer = NewBuffer;
/* add a reference count because the buffer is tied to the console */
InterlockedIncrement(&Console->ActiveBuffer->Header.ReferenceCount);
/* make console active, and insert into console list */
/* copy buffer contents to screen */
ConioDrawConsole(Console);
@ -2201,24 +2208,38 @@ CSR_API(CsrCreateScreenBuffer)
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Buff = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER));
if (NULL == Buff)
Buff = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER));
if (Buff != NULL)
{
if (Console->ActiveBuffer)
{
Buff->MaxX = Console->ActiveBuffer->MaxX;
Buff->MaxY = Console->ActiveBuffer->MaxY;
}
if (Buff->MaxX == 0)
Buff->MaxX = 80;
if (Buff->MaxY == 0)
Buff->MaxY = 25;
Status = CsrInitConsoleScreenBuffer(Console, Buff);
if(! NT_SUCCESS(Status))
{
Request->Status = Status;
}
else
{
Request->Status = Win32CsrInsertObject(ProcessData, &Request->Data.CreateScreenBufferRequest.OutputHandle, &Buff->Header);
}
}
else
{
Request->Status = STATUS_INSUFFICIENT_RESOURCES;
}
Status = CsrInitConsoleScreenBuffer(Console, Buff);
if(! NT_SUCCESS(Status))
{
Request->Status = Status;
}
else
{
Request->Status = Win32CsrInsertObject(ProcessData, &Request->Data.CreateScreenBufferRequest.OutputHandle, &Buff->Header);
}
ConioUnlockConsole(Console);
return Request->Status;
}

View file

@ -40,7 +40,6 @@ typedef struct GUI_CONSOLE_DATA_TAG
DWORD FullScreen;
DWORD QuickEdit;
DWORD InsertMode;
DWORD WindowSize;
} GUI_CONSOLE_DATA, *PGUI_CONSOLE_DATA;
#ifndef WM_APP
@ -215,7 +214,7 @@ GuiConsoleOpenUserSettings(HWND hWnd, DWORD ProcessId, PHKEY hSubKey, REGSAM sam
return FALSE;
}
static void FASTCALL
GuiConsoleReadUserSettings(HKEY hKey, PGUI_CONSOLE_DATA GuiData)
GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer)
{
DWORD dwNumSubKeys = 0;
DWORD dwIndex;
@ -274,7 +273,16 @@ GuiConsoleReadUserSettings(HKEY hKey, PGUI_CONSOLE_DATA GuiData)
}
else if (!wcscmp(szValueName, L"WindowSize"))
{
GuiData->WindowSize = Value;
Console->Size.X = LOWORD(Value);
Console->Size.Y = HIWORD(Value);
}
else if (!wcscmp(szValueName, L"ScreenBufferSize"))
{
if( Buffer)
{
Buffer->MaxX = LOWORD(Value);
Buffer->MaxY = HIWORD(Value);
}
}
else if (!wcscmp(szValueName, L"FullScreen"))
{
@ -291,7 +299,7 @@ GuiConsoleReadUserSettings(HKEY hKey, PGUI_CONSOLE_DATA GuiData)
}
}
static VOID FASTCALL
GuiConsoleUseDefaults(PGUI_CONSOLE_DATA GuiData)
GuiConsoleUseDefaults(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer)
{
/*
* init guidata with default properties
@ -299,13 +307,21 @@ GuiConsoleUseDefaults(PGUI_CONSOLE_DATA GuiData)
wcscpy(GuiData->FontName, L"Bitstream Vera Sans Mono");
GuiData->FontSize = 0x0008000C; // font is 8x12
GuiData->WindowSize = 0x00190050; // default window size is 25x80
GuiData->FontWeight = FW_NORMAL;
GuiData->CursorSize = 0;
GuiData->HistoryNoDup = FALSE;
GuiData->FullScreen = FALSE;
GuiData->QuickEdit = FALSE;
GuiData->InsertMode = TRUE;
Console->Size.X = 80;
Console->Size.Y = 25;
if (Buffer)
{
Buffer->MaxX = 80;
Buffer->MaxY = 25;
}
}
@ -328,20 +344,17 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
return FALSE;
}
GuiConsoleUseDefaults(GuiData);
GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer);
if (Console->ProcessList.Flink != &Console->ProcessList)
{
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry);
if (GuiConsoleOpenUserSettings(hWnd, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ))
{
GuiConsoleReadUserSettings(hKey, GuiData);
GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer);
RegCloseKey(hKey);
}
}
Console->Size.X = LOWORD(GuiData->WindowSize);
Console->Size.Y = HIWORD(GuiData->WindowSize);
InitializeCriticalSection(&GuiData->Lock);
GuiData->LineBuffer = (PWCHAR)HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY,
@ -656,37 +669,40 @@ GuiConsoleHandlePaint(HWND hWnd, HDC hDCPaint)
if (Console != NULL && GuiData != NULL &&
Console->ActiveBuffer != NULL)
{
EnterCriticalSection(&GuiData->Lock);
GuiConsolePaint(Console,
GuiData,
hDC,
&ps.rcPaint);
if (GuiData->Selection.left != -1)
if (Console->ActiveBuffer->Buffer != NULL)
{
RECT rc = GuiData->Selection;
EnterCriticalSection(&GuiData->Lock);
rc.left *= GuiData->CharWidth;
rc.top *= GuiData->CharHeight;
rc.right *= GuiData->CharWidth;
rc.bottom *= GuiData->CharHeight;
GuiConsolePaint(Console,
GuiData,
hDC,
&ps.rcPaint);
/* invert the selection */
if (IntersectRect(&rc,
&ps.rcPaint,
&rc))
if (GuiData->Selection.left != -1)
{
PatBlt(hDC,
rc.left,
rc.top,
rc.right - rc.left,
rc.bottom - rc.top,
DSTINVERT);
}
}
RECT rc = GuiData->Selection;
LeaveCriticalSection(&GuiData->Lock);
rc.left *= GuiData->CharWidth;
rc.top *= GuiData->CharHeight;
rc.right *= GuiData->CharWidth;
rc.bottom *= GuiData->CharHeight;
/* invert the selection */
if (IntersectRect(&rc,
&ps.rcPaint,
&rc))
{
PatBlt(hDC,
rc.left,
rc.top,
rc.right - rc.left,
rc.bottom - rc.top,
DSTINVERT);
}
}
LeaveCriticalSection(&GuiData->Lock);
}
}
EndPaint(hWnd, &ps);
@ -1563,7 +1579,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console)
/* wait untill initialization has finished */
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
DPRINT("received event Console %p GuiData %p X %d Y %d\n", Console, Console->PrivateData, Console->Size.X, Console->Size.Y);
DPRINT1("received event Console %p GuiData %p X %d Y %d\n", Console, Console->PrivateData, Console->Size.X, Console->Size.Y);
CloseHandle(GuiData->hGuiInitEvent);
GuiData->hGuiInitEvent = NULL;

View file

@ -242,6 +242,8 @@ TuiInitConsole(PCSRSS_CONSOLE Console)
Console->Vtbl = &TuiVtbl;
Console->hWindow = (HWND) NULL;
Console->Size = PhysicalConsoleSize;
Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X;
Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y;
EnterCriticalSection(&ActiveConsoleLock);
if (NULL != ActiveConsole)