/* INCLUDES *******************************************************************/
-#include "consrv.h"
-#include "console.h"
-#include "include/conio.h"
-#include "include/conio2.h"
-#include "conoutput.h"
-#include "handle.h"
+#include <consrv.h>
#define NDEBUG
#include <debug.h>
-
/* PRIVATE FUNCTIONS **********************************************************/
NTSTATUS
TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle,
IN PTEXTMODE_BUFFER_INFO TextModeInfo);
NTSTATUS
GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle,
IN PGRAPHICS_BUFFER_INFO GraphicsInfo);
VOID
NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl,
IN SIZE_T Size)
{
if (Buffer == NULL || Console == NULL)
/* Initialize the header with the default type */
ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console);
- (*Buffer)->Vtbl = NULL;
+ (*Buffer)->Vtbl = Vtbl;
return STATUS_SUCCESS;
}
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
{
if (Buffer->Header.Type == TEXTMODE_BUFFER)
+ {
TEXTMODE_BUFFER_Destroy(Buffer);
+ }
else if (Buffer->Header.Type == GRAPHICS_BUFFER)
+ {
GRAPHICS_BUFFER_Destroy(Buffer);
+ }
else if (Buffer->Header.Type == SCREEN_BUFFER)
+ {
+ // TODO: Free Buffer->Data
+
+ /* Free the palette handle */
+ if (Buffer->PaletteHandle != NULL) DeleteObject(Buffer->PaletteHandle);
+
+ /* Free the screen buffer memory */
ConsoleFreeHeap(Buffer);
+ }
// else
// do_nothing;
}
// ConDrvCreateConsoleScreenBuffer
-NTSTATUS FASTCALL
+NTSTATUS
ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle OPTIONAL,
IN ULONG BufferType,
IN PVOID ScreenBufferInfo)
{
return STATUS_INVALID_PARAMETER;
}
+ /* Use the current process if ProcessHandle is NULL */
+ if (ProcessHandle == NULL)
+ ProcessHandle = NtCurrentProcess();
+
if (BufferType == CONSOLE_TEXTMODE_BUFFER)
{
- Status = TEXTMODE_BUFFER_Initialize(Buffer,
- Console,
+ Status = TEXTMODE_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PTEXTMODE_BUFFER_INFO)ScreenBufferInfo);
}
else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
{
- Status = GRAPHICS_BUFFER_Initialize(Buffer,
- Console,
+ Status = GRAPHICS_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PGRAPHICS_BUFFER_INFO)ScreenBufferInfo);
}
else
static VOID
ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
-VOID WINAPI
-ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
+VOID NTAPI
+ConDrvDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
{
PCONSOLE Console = Buffer->Header.Console;
PCONSOLE_SCREEN_BUFFER NewBuffer;
+ /*
+ * We should notify temporarily the frontend because we are susceptible
+ * to delete the screen buffer it is using (which may be different from
+ * the active screen buffer in some cases), and because, if it actually
+ * uses the active screen buffer, we are going to nullify its pointer to
+ * change it.
+ */
+ TermReleaseScreenBuffer(Console, Buffer);
+
RemoveEntryList(&Buffer->ListEntry);
if (Buffer == Console->ActiveBuffer)
{
/* Delete active buffer; switch to most recently created */
- Console->ActiveBuffer = NULL;
if (!IsListEmpty(&Console->BufferList))
{
NewBuffer = CONTAINING_RECORD(Console->BufferList.Flink,
CONSOLE_SCREEN_BUFFER,
ListEntry);
+
+ /* Tie console to new buffer and signal the change to the frontend */
ConioSetActiveScreenBuffer(NewBuffer);
}
+ else
+ {
+ Console->ActiveBuffer = NULL;
+ // InterlockedExchangePointer(&Console->ActiveBuffer, NULL);
+ }
}
CONSOLE_SCREEN_BUFFER_Destroy(Buffer);
}
-VOID FASTCALL
+VOID
ConioDrawConsole(PCONSOLE Console)
{
SMALL_RECT Region;
if (ActiveBuffer)
{
- ConioInitRect(&Region, 0, 0, ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
- ConioDrawRegion(Console, &Region);
+ ConioInitRect(&Region, 0, 0,
+ ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
+ TermDrawRegion(Console, &Region);
}
}
{
PCONSOLE Console = Buffer->Header.Console;
Console->ActiveBuffer = Buffer;
- ConioResizeTerminal(Console);
- // ConioDrawConsole(Console);
+ // InterlockedExchangePointer(&Console->ActiveBuffer, Buffer);
+ TermSetActiveScreenBuffer(Console);
}
NTSTATUS NTAPI
if (Buffer == Console->ActiveBuffer) return STATUS_SUCCESS;
/* If old buffer has no handles, it's now unreferenced */
- if (Console->ActiveBuffer->Header.HandleCount == 0)
+ if (Console->ActiveBuffer->Header.ReferenceCount == 0)
{
- ConioDeleteScreenBuffer(Console->ActiveBuffer);
+ ConDrvDeleteScreenBuffer(Console->ActiveBuffer);
}
- /* Tie console to new buffer */
+ /* Tie console to new buffer and signal the change to the frontend */
ConioSetActiveScreenBuffer(Buffer);
return STATUS_SUCCESS;
ASSERT(Console == Buffer->Header.Console);
/* If the output buffer is the current one, redraw the correct portion of the screen */
- if (Buffer == Console->ActiveBuffer) ConioDrawRegion(Console, Region);
+ if (Buffer == Console->ActiveBuffer) TermDrawRegion(Console, Region);
return STATUS_SUCCESS;
}
+NTSTATUS NTAPI
+ConDrvSetConsolePalette(IN PCONSOLE Console,
+ // IN PGRAPHICS_SCREEN_BUFFER Buffer,
+ IN PCONSOLE_SCREEN_BUFFER Buffer,
+ IN HPALETTE PaletteHandle,
+ IN UINT PaletteUsage)
+{
+ BOOL Success;
+
+ /*
+ * Parameters validation
+ */
+ if (Console == NULL || Buffer == NULL)
+ return STATUS_INVALID_PARAMETER;
+
+ if ( PaletteUsage != SYSPAL_STATIC &&
+ PaletteUsage != SYSPAL_NOSTATIC &&
+ PaletteUsage != SYSPAL_NOSTATIC256 )
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Validity check */
+ ASSERT(Console == Buffer->Header.Console);
+
+ /* Change the palette */
+ Success = TermSetPalette(Console, PaletteHandle, PaletteUsage);
+ if (Success)
+ {
+ /* Free the old palette handle if there was already one set */
+ if ( Buffer->PaletteHandle != NULL &&
+ Buffer->PaletteHandle != PaletteHandle )
+ {
+ DeleteObject(Buffer->PaletteHandle);
+ }
+
+ /* Save the new palette in the screen buffer */
+ Buffer->PaletteHandle = PaletteHandle;
+ Buffer->PaletteUsage = PaletteUsage;
+ }
+
+ return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
+}
+
NTSTATUS NTAPI
ConDrvGetConsoleCursorInfo(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
Buffer->CursorInfo.dwSize = Size;
Buffer->CursorInfo.bVisible = Visible;
- Success = ConioSetCursorInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer);
+ Success = TermSetCursorInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer);
}
return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
// Buffer->CursorPosition.X = Position->X;
// Buffer->CursorPosition.Y = Position->Y;
if ( ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer) &&
- (!ConioSetScreenInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer, OldCursorX, OldCursorY)) )
+ (!TermSetScreenInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer, OldCursorX, OldCursorY)) )
{
return STATUS_UNSUCCESSFUL;
}