Terminals are for consoles, and frontends for a given win32 terminal.
Start to clarify this situation in the code. Work in progress.

svn path=/branches/condrv_restructure/; revision=63123
This commit is contained in:
Hermès Bélusca-Maïto 2014-05-03 01:59:28 +00:00
parent e26a117d1f
commit 9b17c1b99d
8 changed files with 240 additions and 320 deletions

View file

@ -187,12 +187,11 @@ RemoveConsoleByPointer(IN PCONSOLE Console)
} }
/* For resetting the frontend - defined in dummyfrontend.c */
VOID ResetFrontEnd(IN PCONSOLE Console);
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
/* For resetting the terminal - defined in dummyterm.c */
VOID ResetTerminal(IN PCONSOLE Console);
VOID NTAPI VOID NTAPI
ConDrvPause(PCONSOLE Console) ConDrvPause(PCONSOLE Console)
{ {
@ -417,12 +416,12 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle,
Console->ReferenceCount = 0; Console->ReferenceCount = 0;
InitializeCriticalSection(&Console->Lock); InitializeCriticalSection(&Console->Lock);
/* Initialize the frontend interface */ /* Initialize the terminal interface */
ResetFrontEnd(Console); ResetTerminal(Console);
memcpy(Console->Colors, ConsoleInfo->Colors, sizeof(ConsoleInfo->Colors)); memcpy(Console->Colors, ConsoleInfo->Colors, sizeof(ConsoleInfo->Colors));
Console->ConsoleSize = ConsoleInfo->ConsoleSize; Console->ConsoleSize = ConsoleInfo->ConsoleSize;
Console->FixedSize = FALSE; // Value by default; is reseted by the front-ends if needed. Console->FixedSize = FALSE; // Value by default; is reseted by the terminals if needed.
/* /*
* Initialize the input buffer * Initialize the input buffer
@ -538,63 +537,63 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle,
} }
NTSTATUS NTAPI NTSTATUS NTAPI
ConDrvRegisterFrontEnd(IN PCONSOLE Console, ConDrvRegisterTerminal(IN PCONSOLE Console,
IN PFRONTEND FrontEnd) IN PTERMINAL Terminal)
{ {
NTSTATUS Status; NTSTATUS Status;
if (Console == NULL || FrontEnd == NULL) if (Console == NULL || Terminal == NULL)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
/* FIXME: Lock the console before ?? */ /* FIXME: Lock the console before ?? */
/* /*
* Attach the frontend to the console. Use now the FrontEndIFace of the console, * Attach the terminal to the console. Use now the TermIFace of the console,
* and not the user-defined temporary FrontEnd pointer. * and not the user-defined temporary Terminal pointer.
*/ */
Console->FrontEndIFace = *FrontEnd; Console->TermIFace = *Terminal;
Console->FrontEndIFace.Console = Console; Console->TermIFace.Console = Console;
/* Initialize the frontend AFTER having attached it to the console */ /* Initialize the terminal AFTER having attached it to the console */
DPRINT("Finish initialization of frontend\n"); DPRINT("Finish initialization of terminal\n");
Status = Console->FrontEndIFace.Vtbl->InitFrontEnd(&Console->FrontEndIFace, Console); Status = Console->TermIFace.Vtbl->InitTerminal(&Console->TermIFace, Console);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("FrontEnd initialization failed, Status = 0x%08lx\n", Status); DPRINT1("Terminal initialization failed, Status = 0x%08lx\n", Status);
/* We failed, detach the frontend from the console */ /* We failed, detach the terminal from the console */
FrontEnd->Console = NULL; // For the caller Terminal->Console = NULL; // For the caller
ResetFrontEnd(Console); ResetTerminal(Console);
return Status; return Status;
} }
/* Copy buffer contents to screen */ /* Copy buffer contents to screen */
// FrontEnd.Draw(); // Terminal.Draw();
// ConioDrawConsole(Console); // ConioDrawConsole(Console);
DPRINT("Console drawn\n"); DPRINT("Console drawn\n");
DPRINT("Terminal FrontEnd initialization done\n"); DPRINT("Terminal initialization done\n");
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
NTSTATUS NTAPI NTSTATUS NTAPI
ConDrvDeregisterFrontEnd(IN PCONSOLE Console) ConDrvDeregisterTerminal(IN PCONSOLE Console)
{ {
if (Console == NULL) return STATUS_INVALID_PARAMETER; if (Console == NULL) return STATUS_INVALID_PARAMETER;
/* FIXME: Lock the console before ?? */ /* FIXME: Lock the console before ?? */
/* Deinitialize the frontend BEFORE detaching it from the console */ /* Deinitialize the terminal BEFORE detaching it from the console */
Console->FrontEndIFace.Vtbl->DeinitFrontEnd(&Console->FrontEndIFace/*, Console*/); Console->TermIFace.Vtbl->DeinitTerminal(&Console->TermIFace/*, Console*/);
/* /*
* Detach the frontend from the console: * Detach the terminal from the console:
* reinitialize the frontend interface. * reinitialize the terminal interface.
*/ */
ResetFrontEnd(Console); ResetTerminal(Console);
DPRINT("Terminal FrontEnd unregistered\n"); DPRINT("Terminal unregistered\n");
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -643,7 +642,7 @@ ConDrvDeleteConsole(IN PCONSOLE Console)
/* Cleanup the UI-oriented part */ /* Cleanup the UI-oriented part */
DPRINT("Deregister console\n"); DPRINT("Deregister console\n");
ConDrvDeregisterFrontEnd(Console); ConDrvDeregisterTerminal(Console);
DPRINT("Console deregistered\n"); DPRINT("Console deregistered\n");
/*** /***

View file

@ -14,27 +14,25 @@
/* DUMMY TERMINAL INTERFACE ***************************************************/ /* DUMMY TERMINAL INTERFACE ***************************************************/
static NTSTATUS NTAPI static NTSTATUS NTAPI
DummyInitFrontEnd(IN OUT PFRONTEND This, DummyInitTerminal(IN OUT PTERMINAL This,
IN PCONSOLE Console) IN PCONSOLE Console)
{ {
/* Load some settings ?? */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static VOID NTAPI static VOID NTAPI
DummyDeinitFrontEnd(IN OUT PFRONTEND This) DummyDeinitTerminal(IN OUT PTERMINAL This)
{ {
/* Free some settings ?? */
} }
static VOID NTAPI static VOID NTAPI
DummyDrawRegion(IN OUT PFRONTEND This, DummyDrawRegion(IN OUT PTERMINAL This,
SMALL_RECT* Region) SMALL_RECT* Region)
{ {
} }
static VOID NTAPI static VOID NTAPI
DummyWriteStream(IN OUT PFRONTEND This, DummyWriteStream(IN OUT PTERMINAL This,
SMALL_RECT* Region, SMALL_RECT* Region,
SHORT CursorStartX, SHORT CursorStartX,
SHORT CursorStartY, SHORT CursorStartY,
@ -45,15 +43,15 @@ DummyWriteStream(IN OUT PFRONTEND This,
} }
static BOOL NTAPI static BOOL NTAPI
DummySetCursorInfo(IN OUT PFRONTEND This, DummySetCursorInfo(IN OUT PTERMINAL This,
PCONSOLE_SCREEN_BUFFER Buff) PCONSOLE_SCREEN_BUFFER ScreenBuffer)
{ {
return TRUE; return TRUE;
} }
static BOOL NTAPI static BOOL NTAPI
DummySetScreenInfo(IN OUT PFRONTEND This, DummySetScreenInfo(IN OUT PTERMINAL This,
PCONSOLE_SCREEN_BUFFER Buff, PCONSOLE_SCREEN_BUFFER ScreenBuffer,
SHORT OldCursorX, SHORT OldCursorX,
SHORT OldCursorY) SHORT OldCursorY)
{ {
@ -61,122 +59,60 @@ DummySetScreenInfo(IN OUT PFRONTEND This,
} }
static VOID NTAPI static VOID NTAPI
DummyResizeTerminal(IN OUT PFRONTEND This) DummyResizeTerminal(IN OUT PTERMINAL This)
{ {
} }
static VOID NTAPI static VOID NTAPI
DummySetActiveScreenBuffer(IN OUT PFRONTEND This) DummySetActiveScreenBuffer(IN OUT PTERMINAL This)
{ {
} }
static VOID NTAPI static VOID NTAPI
DummyReleaseScreenBuffer(IN OUT PFRONTEND This, DummyReleaseScreenBuffer(IN OUT PTERMINAL This,
IN PCONSOLE_SCREEN_BUFFER ScreenBuffer) IN PCONSOLE_SCREEN_BUFFER ScreenBuffer)
{ {
} }
static BOOL NTAPI
DummyProcessKeyCallback(IN OUT PFRONTEND This,
MSG* msg,
BYTE KeyStateMenu,
DWORD ShiftState,
UINT VirtualKeyCode,
BOOL Down)
{
return FALSE;
}
static VOID NTAPI static VOID NTAPI
DummyRefreshInternalInfo(IN OUT PFRONTEND This) DummyChangeTitle(IN OUT PTERMINAL This)
{ {
} }
static VOID NTAPI static VOID NTAPI
DummyChangeTitle(IN OUT PFRONTEND This) DummyGetLargestConsoleWindowSize(IN OUT PTERMINAL This,
{
}
static BOOL NTAPI
DummyChangeIcon(IN OUT PFRONTEND This,
HICON IconHandle)
{
return TRUE;
}
static HWND NTAPI
DummyGetConsoleWindowHandle(IN OUT PFRONTEND This)
{
return NULL;
}
static VOID NTAPI
DummyGetLargestConsoleWindowSize(IN OUT PFRONTEND This,
PCOORD pSize) PCOORD pSize)
{ {
} }
/*
static BOOL NTAPI static BOOL NTAPI
DummyGetSelectionInfo(IN OUT PFRONTEND This, DummyGetSelectionInfo(IN OUT PTERMINAL This,
PCONSOLE_SELECTION_INFO pSelectionInfo) PCONSOLE_SELECTION_INFO pSelectionInfo)
{ {
return TRUE; return TRUE;
} }
*/
static BOOL NTAPI static BOOL NTAPI
DummySetPalette(IN OUT PFRONTEND This, DummySetPalette(IN OUT PTERMINAL This,
HPALETTE PaletteHandle, HPALETTE PaletteHandle,
UINT PaletteUsage) UINT PaletteUsage)
{ {
return TRUE; return TRUE;
} }
static ULONG NTAPI
DummyGetDisplayMode(IN OUT PFRONTEND This)
{
return 0;
}
static BOOL NTAPI
DummySetDisplayMode(IN OUT PFRONTEND This,
ULONG NewMode)
{
return TRUE;
}
static INT NTAPI static INT NTAPI
DummyShowMouseCursor(IN OUT PFRONTEND This, DummyShowMouseCursor(IN OUT PTERMINAL This,
BOOL Show) BOOL Show)
{ {
return 0; return 0;
} }
static BOOL NTAPI static TERMINAL_VTBL DummyVtbl =
DummySetMouseCursor(IN OUT PFRONTEND This,
HCURSOR CursorHandle)
{ {
return TRUE; DummyInitTerminal,
} DummyDeinitTerminal,
static HMENU NTAPI
DummyMenuControl(IN OUT PFRONTEND This,
UINT CmdIdLow,
UINT CmdIdHigh)
{
return NULL;
}
static BOOL NTAPI
DummySetMenuClose(IN OUT PFRONTEND This,
BOOL Enable)
{
return TRUE;
}
static FRONTEND_VTBL DummyVtbl =
{
DummyInitFrontEnd,
DummyDeinitFrontEnd,
DummyDrawRegion, DummyDrawRegion,
DummyWriteStream, DummyWriteStream,
DummySetCursorInfo, DummySetCursorInfo,
@ -184,30 +120,21 @@ static FRONTEND_VTBL DummyVtbl =
DummyResizeTerminal, DummyResizeTerminal,
DummySetActiveScreenBuffer, DummySetActiveScreenBuffer,
DummyReleaseScreenBuffer, DummyReleaseScreenBuffer,
DummyProcessKeyCallback,
DummyRefreshInternalInfo,
DummyChangeTitle, DummyChangeTitle,
DummyChangeIcon,
DummyGetConsoleWindowHandle,
DummyGetLargestConsoleWindowSize, DummyGetLargestConsoleWindowSize,
DummyGetSelectionInfo, // DummyGetSelectionInfo,
DummySetPalette, DummySetPalette,
DummyGetDisplayMode,
DummySetDisplayMode,
DummyShowMouseCursor, DummyShowMouseCursor,
DummySetMouseCursor,
DummyMenuControl,
DummySetMenuClose,
}; };
VOID VOID
ResetFrontEnd(IN PCONSOLE Console) ResetTerminal(IN PCONSOLE Console)
{ {
if (!Console) return; if (!Console) return;
/* Reinitialize the frontend interface */ /* Reinitialize the terminal interface */
RtlZeroMemory(&Console->FrontEndIFace, sizeof(Console->FrontEndIFace)); RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace));
Console->FrontEndIFace.Vtbl = &DummyVtbl; Console->TermIFace.Vtbl = &DummyVtbl;
} }
/* EOF */ /* EOF */

View file

@ -82,13 +82,13 @@ ConSrvReleaseConsole(PCONSOLE Console,
} }
/* static */ NTSTATUS NTSTATUS NTAPI
ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd, ConSrvInitTerminal(IN OUT PTERMINAL Terminal,
IN OUT PCONSOLE_INFO ConsoleInfo, IN OUT PCONSOLE_INFO ConsoleInfo,
IN OUT PVOID ExtraConsoleInfo, IN OUT PVOID ExtraConsoleInfo,
IN ULONG ProcessId); IN ULONG ProcessId);
/* static */ NTSTATUS NTSTATUS NTAPI
ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd); ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal);
NTSTATUS NTAPI NTSTATUS NTAPI
ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
@ -102,7 +102,7 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
CONSOLE_INFO ConsoleInfo; CONSOLE_INFO ConsoleInfo;
SIZE_T Length = 0; SIZE_T Length = 0;
FRONTEND FrontEnd; TERMINAL Terminal; /* The ConSrv terminal for this console */
if (NewConsole == NULL || ConsoleStartInfo == NULL) if (NewConsole == NULL || ConsoleStartInfo == NULL)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
@ -122,7 +122,6 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
wcsncpy(ConsoleInfo.ConsoleTitle, ConsoleStartInfo->ConsoleTitle, Length); wcsncpy(ConsoleInfo.ConsoleTitle, ConsoleStartInfo->ConsoleTitle, Length);
ConsoleInfo.ConsoleTitle[Length] = L'\0'; ConsoleInfo.ConsoleTitle[Length] = L'\0';
#if 0
/* 3. Initialize the ConSrv terminal */ /* 3. Initialize the ConSrv terminal */
Status = ConSrvInitTerminal(&Terminal, Status = ConSrvInitTerminal(&Terminal,
&ConsoleInfo, &ConsoleInfo,
@ -134,18 +133,6 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
return Status; return Status;
} }
DPRINT("CONSRV: Terminal initialized\n"); DPRINT("CONSRV: Terminal initialized\n");
#else
Status = ConSrvLoadFrontEnd(&FrontEnd,
&ConsoleInfo,
ConsoleStartInfo,
ConsoleLeaderProcessId);
if (!NT_SUCCESS(Status))
{
DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status);
return Status;
}
DPRINT("CONSRV: Frontend initialized\n");
#endif
/* /*
* 4. Load the remaining console settings via the registry. * 4. Load the remaining console settings via the registry.
@ -190,7 +177,7 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Creating a new console failed, Status = 0x%08lx\n", Status); DPRINT1("Creating a new console failed, Status = 0x%08lx\n", Status);
ConSrvUnloadFrontEnd(&FrontEnd); ConSrvDeinitTerminal(&Terminal);
return Status; return Status;
} }
@ -212,15 +199,15 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle,
Console->QuickEdit = ConsoleInfo.QuickEdit; Console->QuickEdit = ConsoleInfo.QuickEdit;
/* Attach the ConSrv terminal to the console */ /* Attach the ConSrv terminal to the console */
Status = ConDrvRegisterFrontEnd(Console, &FrontEnd); Status = ConDrvRegisterTerminal(Console, &Terminal);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Failed to register frontend to the given console, Status = 0x%08lx\n", Status); DPRINT1("Failed to register terminal to the given console, Status = 0x%08lx\n", Status);
ConDrvDeleteConsole(Console); ConDrvDeleteConsole(Console);
ConSrvUnloadFrontEnd(&FrontEnd); ConSrvDeinitTerminal(&Terminal);
return Status; return Status;
} }
DPRINT("FrontEnd registered\n"); DPRINT("Terminal registered\n");
/* Return the newly created console to the caller and a success code too */ /* Return the newly created console to the caller and a success code too */
*NewConsoleHandle = ConsoleHandle; *NewConsoleHandle = ConsoleHandle;
@ -233,7 +220,7 @@ ConSrvDeleteConsole(PCONSOLE Console)
{ {
DPRINT("ConSrvDeleteConsole\n"); DPRINT("ConSrvDeleteConsole\n");
/* Just call the driver. ConSrvDeregisterFrontEnd is called on-demand. */ /* Just call the driver. ConDrvDeregisterTerminal is called on-demand. */
ConDrvDeleteConsole(Console); ConDrvDeleteConsole(Console);
} }

View file

@ -10,6 +10,7 @@
#include <consrv.h> #include <consrv.h>
// #include "frontends/gui/guiterm.h"
#ifdef TUITERM_COMPILE #ifdef TUITERM_COMPILE
#include "frontends/tui/tuiterm.h" #include "frontends/tui/tuiterm.h"
#endif #endif
@ -81,8 +82,7 @@ struct
// {"Not found", 0, NULL} // {"Not found", 0, NULL}
}; };
static NTSTATUS
/* static */ NTSTATUS
ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd, ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd,
IN OUT PCONSOLE_INFO ConsoleInfo, IN OUT PCONSOLE_INFO ConsoleInfo,
IN OUT PVOID ExtraConsoleInfo, IN OUT PVOID ExtraConsoleInfo,
@ -121,7 +121,7 @@ ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd,
return Status; return Status;
} }
/* static */ NTSTATUS static NTSTATUS
ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd) ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd)
{ {
if (FrontEnd == NULL) return STATUS_INVALID_PARAMETER; if (FrontEnd == NULL) return STATUS_INVALID_PARAMETER;
@ -129,33 +129,105 @@ ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd)
return FrontEnd->UnloadFrontEnd(FrontEnd); return FrontEnd->UnloadFrontEnd(FrontEnd);
} }
// See after...
static TERMINAL_VTBL ConSrvTermVtbl;
/* DUMMY FRONTEND INTERFACE ***************************************************/ NTSTATUS NTAPI
ConSrvInitTerminal(IN OUT PTERMINAL Terminal,
#if 0 IN OUT PCONSOLE_INFO ConsoleInfo,
IN OUT PVOID ExtraConsoleInfo,
static NTSTATUS NTAPI IN ULONG ProcessId)
DummyInitFrontEnd(IN OUT PFRONTEND This,
IN PCONSOLE Console)
{ {
/* Load some settings ?? */ NTSTATUS Status;
PFRONTEND FrontEnd;
/* Load a suitable frontend for the ConSrv terminal */
FrontEnd = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(*FrontEnd));
if (!FrontEnd) return STATUS_NO_MEMORY;
Status = ConSrvLoadFrontEnd(FrontEnd,
ConsoleInfo,
ExtraConsoleInfo,
ProcessId);
if (!NT_SUCCESS(Status))
{
DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status);
ConsoleFreeHeap(FrontEnd);
return Status;
}
DPRINT("CONSRV: Frontend initialized\n");
/* Initialize the ConSrv terminal */
Terminal->Vtbl = &ConSrvTermVtbl;
// Terminal->Console will be initialized by ConDrvRegisterTerminal
Terminal->Data = FrontEnd; /* We store the frontend pointer in the terminal private data */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static VOID NTAPI NTSTATUS NTAPI
DummyDeinitFrontEnd(IN OUT PFRONTEND This) ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal)
{ {
/* Free some settings ?? */ NTSTATUS Status = STATUS_SUCCESS;
PFRONTEND FrontEnd = Terminal->Data;
/* Reset the ConSrv terminal */
Terminal->Data = NULL;
Terminal->Vtbl = NULL;
/* Unload the frontend */
if (FrontEnd != NULL)
{
Status = ConSrvUnloadFrontEnd(FrontEnd);
ConsoleFreeHeap(FrontEnd);
}
return Status;
}
/* CONSRV TERMINAL INTERFACE **************************************************/
static NTSTATUS NTAPI
ConSrvTermInitTerminal(IN OUT PTERMINAL This,
IN PCONSOLE Console)
{
NTSTATUS Status;
PFRONTEND FrontEnd = This->Data;
/* Initialize the console pointer for our frontend */
FrontEnd->Console = Console;
/** HACK HACK!! Copy FrontEnd into the console!! **/
DPRINT1("Using FrontEndIFace HACK(1), should be removed after proper implementation!\n");
Console->FrontEndIFace = *FrontEnd;
Status = FrontEnd->Vtbl->InitFrontEnd(FrontEnd, FrontEnd->Console);
/** HACK HACK!! Be sure FrontEndIFace is correctly updated in the console!! **/
DPRINT1("Using FrontEndIFace HACK(2), should be removed after proper implementation!\n");
Console->FrontEndIFace = *FrontEnd;
return Status;
} }
static VOID NTAPI static VOID NTAPI
DummyDrawRegion(IN OUT PFRONTEND This, ConSrvTermDeinitTerminal(IN OUT PTERMINAL This)
{
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->DeinitFrontEnd(FrontEnd);
}
static VOID NTAPI
ConSrvTermDrawRegion(IN OUT PTERMINAL This,
SMALL_RECT* Region) SMALL_RECT* Region)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->DrawRegion(FrontEnd, Region);
} }
static VOID NTAPI static VOID NTAPI
DummyWriteStream(IN OUT PFRONTEND This, ConSrvTermWriteStream(IN OUT PTERMINAL This,
SMALL_RECT* Region, SMALL_RECT* Region,
SHORT CursorStartX, SHORT CursorStartX,
SHORT CursorStartY, SHORT CursorStartY,
@ -163,164 +235,120 @@ DummyWriteStream(IN OUT PFRONTEND This,
PWCHAR Buffer, PWCHAR Buffer,
UINT Length) UINT Length)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->WriteStream(FrontEnd,
Region,
CursorStartX,
CursorStartY,
ScrolledLines,
Buffer,
Length);
} }
static BOOL NTAPI static BOOL NTAPI
DummySetCursorInfo(IN OUT PFRONTEND This, ConSrvTermSetCursorInfo(IN OUT PTERMINAL This,
PCONSOLE_SCREEN_BUFFER Buff) PCONSOLE_SCREEN_BUFFER ScreenBuffer)
{ {
return TRUE; PFRONTEND FrontEnd = This->Data;
return FrontEnd->Vtbl->SetCursorInfo(FrontEnd, ScreenBuffer);
} }
static BOOL NTAPI static BOOL NTAPI
DummySetScreenInfo(IN OUT PFRONTEND This, ConSrvTermSetScreenInfo(IN OUT PTERMINAL This,
PCONSOLE_SCREEN_BUFFER Buff, PCONSOLE_SCREEN_BUFFER ScreenBuffer,
SHORT OldCursorX, SHORT OldCursorX,
SHORT OldCursorY) SHORT OldCursorY)
{ {
return TRUE; PFRONTEND FrontEnd = This->Data;
return FrontEnd->Vtbl->SetScreenInfo(FrontEnd,
ScreenBuffer,
OldCursorX,
OldCursorY);
} }
static VOID NTAPI static VOID NTAPI
DummyResizeTerminal(IN OUT PFRONTEND This) ConSrvTermResizeTerminal(IN OUT PTERMINAL This)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->ResizeTerminal(FrontEnd);
} }
static VOID NTAPI static VOID NTAPI
DummySetActiveScreenBuffer(IN OUT PFRONTEND This) ConSrvTermSetActiveScreenBuffer(IN OUT PTERMINAL This)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->SetActiveScreenBuffer(FrontEnd);
} }
static VOID NTAPI static VOID NTAPI
DummyReleaseScreenBuffer(IN OUT PFRONTEND This, ConSrvTermReleaseScreenBuffer(IN OUT PTERMINAL This,
IN PCONSOLE_SCREEN_BUFFER ScreenBuffer) IN PCONSOLE_SCREEN_BUFFER ScreenBuffer)
{ {
} PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->ReleaseScreenBuffer(FrontEnd, ScreenBuffer);
static BOOL NTAPI
DummyProcessKeyCallback(IN OUT PFRONTEND This,
MSG* msg,
BYTE KeyStateMenu,
DWORD ShiftState,
UINT VirtualKeyCode,
BOOL Down)
{
return FALSE;
} }
static VOID NTAPI static VOID NTAPI
DummyRefreshInternalInfo(IN OUT PFRONTEND This) ConSrvTermChangeTitle(IN OUT PTERMINAL This)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->ChangeTitle(FrontEnd);
} }
static VOID NTAPI static VOID NTAPI
DummyChangeTitle(IN OUT PFRONTEND This) ConSrvTermGetLargestConsoleWindowSize(IN OUT PTERMINAL This,
{
}
static BOOL NTAPI
DummyChangeIcon(IN OUT PFRONTEND This,
HICON IconHandle)
{
return TRUE;
}
static HWND NTAPI
DummyGetConsoleWindowHandle(IN OUT PFRONTEND This)
{
return NULL;
}
static VOID NTAPI
DummyGetLargestConsoleWindowSize(IN OUT PFRONTEND This,
PCOORD pSize) PCOORD pSize)
{ {
PFRONTEND FrontEnd = This->Data;
FrontEnd->Vtbl->GetLargestConsoleWindowSize(FrontEnd, pSize);
} }
/*
static BOOL NTAPI static BOOL NTAPI
DummyGetSelectionInfo(IN OUT PFRONTEND This, ConSrvTermGetSelectionInfo(IN OUT PTERMINAL This,
PCONSOLE_SELECTION_INFO pSelectionInfo) PCONSOLE_SELECTION_INFO pSelectionInfo)
{ {
return TRUE; PFRONTEND FrontEnd = This->Data;
return FrontEnd->Vtbl->GetSelectionInfo(FrontEnd, pSelectionInfo);
} }
*/
static BOOL NTAPI static BOOL NTAPI
DummySetPalette(IN OUT PFRONTEND This, ConSrvTermSetPalette(IN OUT PTERMINAL This,
HPALETTE PaletteHandle, HPALETTE PaletteHandle,
UINT PaletteUsage) UINT PaletteUsage)
{ {
return TRUE; PFRONTEND FrontEnd = This->Data;
} return FrontEnd->Vtbl->SetPalette(FrontEnd, PaletteHandle, PaletteUsage);
static ULONG NTAPI
DummyGetDisplayMode(IN OUT PFRONTEND This)
{
return 0;
}
static BOOL NTAPI
DummySetDisplayMode(IN OUT PFRONTEND This,
ULONG NewMode)
{
return TRUE;
} }
static INT NTAPI static INT NTAPI
DummyShowMouseCursor(IN OUT PFRONTEND This, ConSrvTermShowMouseCursor(IN OUT PTERMINAL This,
BOOL Show) BOOL Show)
{ {
return 0; PFRONTEND FrontEnd = This->Data;
return FrontEnd->Vtbl->ShowMouseCursor(FrontEnd, Show);
} }
static BOOL NTAPI static TERMINAL_VTBL ConSrvTermVtbl =
DummySetMouseCursor(IN OUT PFRONTEND This,
HCURSOR CursorHandle)
{ {
return TRUE; ConSrvTermInitTerminal,
} ConSrvTermDeinitTerminal,
ConSrvTermDrawRegion,
static HMENU NTAPI ConSrvTermWriteStream,
DummyMenuControl(IN OUT PFRONTEND This, ConSrvTermSetCursorInfo,
UINT CmdIdLow, ConSrvTermSetScreenInfo,
UINT CmdIdHigh) ConSrvTermResizeTerminal,
{ ConSrvTermSetActiveScreenBuffer,
return NULL; ConSrvTermReleaseScreenBuffer,
} ConSrvTermChangeTitle,
ConSrvTermGetLargestConsoleWindowSize,
static BOOL NTAPI // ConSrvTermGetSelectionInfo,
DummySetMenuClose(IN OUT PFRONTEND This, ConSrvTermSetPalette,
BOOL Enable) ConSrvTermShowMouseCursor,
{
return TRUE;
}
static FRONTEND_VTBL DummyVtbl =
{
DummyInitFrontEnd,
DummyDeinitFrontEnd,
DummyDrawRegion,
DummyWriteStream,
DummySetCursorInfo,
DummySetScreenInfo,
DummyResizeTerminal,
DummySetActiveScreenBuffer,
DummyReleaseScreenBuffer,
DummyProcessKeyCallback,
DummyRefreshInternalInfo,
DummyChangeTitle,
DummyChangeIcon,
DummyGetConsoleWindowHandle,
DummyGetLargestConsoleWindowSize,
DummyGetSelectionInfo,
DummySetPalette,
DummyGetDisplayMode,
DummySetDisplayMode,
DummyShowMouseCursor,
DummySetMouseCursor,
DummyMenuControl,
DummySetMenuClose,
}; };
#if 0
VOID VOID
ResetFrontEnd(IN PCONSOLE Console) ResetFrontEnd(IN PCONSOLE Console)
{ {
@ -328,9 +356,8 @@ ResetFrontEnd(IN PCONSOLE Console)
/* Reinitialize the frontend interface */ /* Reinitialize the frontend interface */
RtlZeroMemory(&Console->FrontEndIFace, sizeof(Console->FrontEndIFace)); RtlZeroMemory(&Console->FrontEndIFace, sizeof(Console->FrontEndIFace));
Console->FrontEndIFace.Vtbl = &DummyVtbl; Console->FrontEndIFace.Vtbl = &ConSrvTermVtbl;
} }
#endif #endif
/* EOF */ /* EOF */

View file

@ -186,16 +186,16 @@ typedef struct _TERMINAL_VTBL
/* /*
* Internal interface (functions called by the console server only) * Internal interface (functions called by the console server only)
*/ */
NTSTATUS (NTAPI *InitFrontEnd)(IN OUT PTERMINAL This, NTSTATUS (NTAPI *InitTerminal)(IN OUT PTERMINAL This,
IN struct _CONSOLE* Console); IN struct _CONSOLE* Console);
VOID (NTAPI *DeinitFrontEnd)(IN OUT PTERMINAL This); VOID (NTAPI *DeinitTerminal)(IN OUT PTERMINAL This);
/* Interface used for both text-mode and graphics screen buffers */ /* Interface used for both text-mode and graphics screen buffers */
VOID (NTAPI *DrawRegion)(IN OUT PTERMINAL This, VOID (NTAPI *DrawRegion)(IN OUT PTERMINAL This,
SMALL_RECT* Region); SMALL_RECT* Region);
/* Interface used only for text-mode screen buffers */ /* Interface used only for text-mode screen buffers */
VOID (NTAPI *WriteStream)(IN OUT PTERMINAL This, VOID (NTAPI *WriteStream)(IN OUT PTERMINAL This,
SMALL_RECT* Block, SMALL_RECT* Region,
SHORT CursorStartX, SHORT CursorStartX,
SHORT CursorStartY, SHORT CursorStartY,
UINT ScrolledLines, UINT ScrolledLines,
@ -211,47 +211,27 @@ typedef struct _TERMINAL_VTBL
VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PTERMINAL This); VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PTERMINAL This);
VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This, VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This,
IN PCONSOLE_SCREEN_BUFFER ScreenBuffer); IN PCONSOLE_SCREEN_BUFFER ScreenBuffer);
BOOL (NTAPI *ProcessKeyCallback)(IN OUT PTERMINAL This,
MSG* msg,
BYTE KeyStateMenu,
DWORD ShiftState,
UINT VirtualKeyCode,
BOOL Down);
VOID (NTAPI *RefreshInternalInfo)(IN OUT PTERMINAL This);
/* /*
* External interface (functions corresponding to the Console API) * External interface (functions corresponding to the Console API)
*/ */
VOID (NTAPI *ChangeTitle)(IN OUT PTERMINAL This); VOID (NTAPI *ChangeTitle)(IN OUT PTERMINAL This);
BOOL (NTAPI *ChangeIcon)(IN OUT PTERMINAL This,
HICON IconHandle);
HWND (NTAPI *GetConsoleWindowHandle)(IN OUT PTERMINAL This);
VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PTERMINAL This, VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PTERMINAL This,
PCOORD pSize); PCOORD pSize);
BOOL (NTAPI *GetSelectionInfo)(IN OUT PTERMINAL This, // BOOL (NTAPI *GetSelectionInfo)(IN OUT PTERMINAL This,
PCONSOLE_SELECTION_INFO pSelectionInfo); // PCONSOLE_SELECTION_INFO pSelectionInfo);
BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This, BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This,
HPALETTE PaletteHandle, HPALETTE PaletteHandle,
UINT PaletteUsage); UINT PaletteUsage);
ULONG (NTAPI *GetDisplayMode)(IN OUT PTERMINAL This);
BOOL (NTAPI *SetDisplayMode)(IN OUT PTERMINAL This,
ULONG NewMode);
INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This, INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This,
BOOL Show); BOOL Show);
BOOL (NTAPI *SetMouseCursor)(IN OUT PTERMINAL This,
HCURSOR CursorHandle);
HMENU (NTAPI *MenuControl)(IN OUT PTERMINAL This,
UINT CmdIdLow,
UINT CmdIdHigh);
BOOL (NTAPI *SetMenuClose)(IN OUT PTERMINAL This,
BOOL Enable);
#if 0 // Possible future front-end interface #if 0 // Possible future front-end interface
BOOL (NTAPI *GetFrontEndProperty)(IN OUT PTERMINAL This, BOOL (NTAPI *GetTerminalProperty)(IN OUT PTERMINAL This,
ULONG Flag, ULONG Flag,
PVOID Info, PVOID Info,
ULONG Size); ULONG Size);
BOOL (NTAPI *SetFrontEndProperty)(IN OUT PTERMINAL This, BOOL (NTAPI *SetTerminalProperty)(IN OUT PTERMINAL This,
ULONG Flag, ULONG Flag,
PVOID Info /*, PVOID Info /*,
ULONG Size */); ULONG Size */);

View file

@ -30,7 +30,7 @@ typedef struct _FRONTEND_VTBL
SMALL_RECT* Region); SMALL_RECT* Region);
/* Interface used only for text-mode screen buffers */ /* Interface used only for text-mode screen buffers */
VOID (NTAPI *WriteStream)(IN OUT PFRONTEND This, VOID (NTAPI *WriteStream)(IN OUT PFRONTEND This,
SMALL_RECT* Block, SMALL_RECT* Region,
SHORT CursorStartX, SHORT CursorStartX,
SHORT CursorStartY, SHORT CursorStartY,
UINT ScrolledLines, UINT ScrolledLines,

View file

@ -17,10 +17,10 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle,
IN PCONSOLE_INFO ConsoleInfo, IN PCONSOLE_INFO ConsoleInfo,
IN ULONG ConsoleLeaderProcessId); IN ULONG ConsoleLeaderProcessId);
NTSTATUS NTAPI NTSTATUS NTAPI
ConDrvRegisterFrontEnd(IN PCONSOLE Console, ConDrvRegisterTerminal(IN PCONSOLE Console,
IN PFRONTEND FrontEnd); IN PTERMINAL Terminal);
NTSTATUS NTAPI NTSTATUS NTAPI
ConDrvDeregisterFrontEnd(IN PCONSOLE Console); ConDrvDeregisterTerminal(IN PCONSOLE Console);
VOID NTAPI VOID NTAPI
ConDrvDeleteConsole(IN PCONSOLE Console); ConDrvDeleteConsole(IN PCONSOLE Console);

View file

@ -11,43 +11,43 @@
/* Macros used to call functions in the FRONTEND_VTBL virtual table */ /* Macros used to call functions in the FRONTEND_VTBL virtual table */
#define TermDrawRegion(Console, Region) \ #define TermDrawRegion(Console, Region) \
(Console)->FrontEndIFace.Vtbl->DrawRegion(&(Console)->FrontEndIFace, (Region)) (Console)->TermIFace.Vtbl->DrawRegion(&(Console)->TermIFace, (Region))
#define TermWriteStream(Console, Block, CurStartX, CurStartY, ScrolledLines, Buffer, Length) \ #define TermWriteStream(Console, Region, CurStartX, CurStartY, ScrolledLines, Buffer, Length) \
(Console)->FrontEndIFace.Vtbl->WriteStream(&(Console)->FrontEndIFace, (Block), (CurStartX), (CurStartY), \ (Console)->TermIFace.Vtbl->WriteStream(&(Console)->TermIFace, (Region), (CurStartX), (CurStartY), \
(ScrolledLines), (Buffer), (Length)) (ScrolledLines), (Buffer), (Length))
#define TermSetCursorInfo(Console, ScreenBuffer) \ #define TermSetCursorInfo(Console, ScreenBuffer) \
(Console)->FrontEndIFace.Vtbl->SetCursorInfo(&(Console)->FrontEndIFace, (ScreenBuffer)) (Console)->TermIFace.Vtbl->SetCursorInfo(&(Console)->TermIFace, (ScreenBuffer))
#define TermSetScreenInfo(Console, ScreenBuffer, OldCursorX, OldCursorY) \ #define TermSetScreenInfo(Console, ScreenBuffer, OldCursorX, OldCursorY) \
(Console)->FrontEndIFace.Vtbl->SetScreenInfo(&(Console)->FrontEndIFace, (ScreenBuffer), (OldCursorX), (OldCursorY)) (Console)->TermIFace.Vtbl->SetScreenInfo(&(Console)->TermIFace, (ScreenBuffer), (OldCursorX), (OldCursorY))
#define TermResizeTerminal(Console) \ #define TermResizeTerminal(Console) \
(Console)->FrontEndIFace.Vtbl->ResizeTerminal(&(Console)->FrontEndIFace) (Console)->TermIFace.Vtbl->ResizeTerminal(&(Console)->TermIFace)
#define TermSetActiveScreenBuffer(Console) \ #define TermSetActiveScreenBuffer(Console) \
(Console)->FrontEndIFace.Vtbl->SetActiveScreenBuffer(&(Console)->FrontEndIFace) (Console)->TermIFace.Vtbl->SetActiveScreenBuffer(&(Console)->TermIFace)
#define TermReleaseScreenBuffer(Console, ScreenBuffer) \ #define TermReleaseScreenBuffer(Console, ScreenBuffer) \
(Console)->FrontEndIFace.Vtbl->ReleaseScreenBuffer(&(Console)->FrontEndIFace, (ScreenBuffer)) (Console)->TermIFace.Vtbl->ReleaseScreenBuffer(&(Console)->TermIFace, (ScreenBuffer))
#define TermProcessKeyCallback(Console, Msg, KeyStateMenu, ShiftState, VirtualKeyCode, Down) \ #define TermProcessKeyCallback(Console, Msg, KeyStateMenu, ShiftState, VirtualKeyCode, Down) \
(Console)->FrontEndIFace.Vtbl->ProcessKeyCallback(&(Console)->FrontEndIFace, (Msg), (KeyStateMenu), (ShiftState), (VirtualKeyCode), (Down)) (Console)->FrontEndIFace.Vtbl->ProcessKeyCallback(&(Console)->FrontEndIFace, (Msg), (KeyStateMenu), (ShiftState), (VirtualKeyCode), (Down))
#define TermRefreshInternalInfo(Console) \ #define TermRefreshInternalInfo(Console) \
(Console)->FrontEndIFace.Vtbl->RefreshInternalInfo(&(Console)->FrontEndIFace) (Console)->FrontEndIFace.Vtbl->RefreshInternalInfo(&(Console)->FrontEndIFace)
#define TermChangeTitle(Console) \ #define TermChangeTitle(Console) \
(Console)->FrontEndIFace.Vtbl->ChangeTitle(&(Console)->FrontEndIFace) (Console)->TermIFace.Vtbl->ChangeTitle(&(Console)->TermIFace)
#define TermChangeIcon(Console, IconHandle) \ #define TermChangeIcon(Console, IconHandle) \
(Console)->FrontEndIFace.Vtbl->ChangeIcon(&(Console)->FrontEndIFace, (IconHandle)) (Console)->FrontEndIFace.Vtbl->ChangeIcon(&(Console)->FrontEndIFace, (IconHandle))
#define TermGetConsoleWindowHandle(Console) \ #define TermGetConsoleWindowHandle(Console) \
(Console)->FrontEndIFace.Vtbl->GetConsoleWindowHandle(&(Console)->FrontEndIFace) (Console)->FrontEndIFace.Vtbl->GetConsoleWindowHandle(&(Console)->FrontEndIFace)
#define TermGetLargestConsoleWindowSize(Console, pSize) \ #define TermGetLargestConsoleWindowSize(Console, pSize) \
(Console)->FrontEndIFace.Vtbl->GetLargestConsoleWindowSize(&(Console)->FrontEndIFace, (pSize)) (Console)->TermIFace.Vtbl->GetLargestConsoleWindowSize(&(Console)->TermIFace, (pSize))
#define TermGetSelectionInfo(Console, pSelectionInfo) \ #define TermGetSelectionInfo(Console, pSelectionInfo) \
(Console)->FrontEndIFace.Vtbl->GetSelectionInfo(&(Console)->FrontEndIFace, (pSelectionInfo)) (Console)->FrontEndIFace.Vtbl->GetSelectionInfo(&(Console)->FrontEndIFace, (pSelectionInfo))
#define TermSetPalette(Console, PaletteHandle, PaletteUsage) \ #define TermSetPalette(Console, PaletteHandle, PaletteUsage) \
(Console)->FrontEndIFace.Vtbl->SetPalette(&(Console)->FrontEndIFace, (PaletteHandle), (PaletteUsage)) (Console)->TermIFace.Vtbl->SetPalette(&(Console)->TermIFace, (PaletteHandle), (PaletteUsage))
#define TermGetDisplayMode(Console) \ #define TermGetDisplayMode(Console) \
(Console)->FrontEndIFace.Vtbl->GetDisplayMode(&(Console)->FrontEndIFace) (Console)->FrontEndIFace.Vtbl->GetDisplayMode(&(Console)->FrontEndIFace)
#define TermSetDisplayMode(Console, NewMode) \ #define TermSetDisplayMode(Console, NewMode) \
(Console)->FrontEndIFace.Vtbl->SetDisplayMode(&(Console)->FrontEndIFace, (NewMode)) (Console)->FrontEndIFace.Vtbl->SetDisplayMode(&(Console)->FrontEndIFace, (NewMode))
#define TermShowMouseCursor(Console, Show) \ #define TermShowMouseCursor(Console, Show) \
(Console)->FrontEndIFace.Vtbl->ShowMouseCursor(&(Console)->FrontEndIFace, (Show)) (Console)->TermIFace.Vtbl->ShowMouseCursor(&(Console)->TermIFace, (Show))
#define TermSetMouseCursor(Console, CursorHandle) \ #define TermSetMouseCursor(Console, CursorHandle) \
(Console)->FrontEndIFace.Vtbl->SetMouseCursor(&(Console)->FrontEndIFace, (CursorHandle)) (Console)->FrontEndIFace.Vtbl->SetMouseCursor(&(Console)->FrontEndIFace, (CursorHandle))
#define TermMenuControl(Console, CmdIdLow, CmdIdHigh) \ #define TermMenuControl(Console, CmdIdLow, CmdIdHigh) \