2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: frontends/terminal.c
5 * PURPOSE: ConSrv terminal.
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9 /* INCLUDES *******************************************************************/
13 // #include "frontends/gui/guiterm.h"
14 #ifdef TUITERM_COMPILE
15 #include "frontends/tui/tuiterm.h"
21 /* CONSRV TERMINAL FRONTENDS INTERFACE ****************************************/
24 #ifdef TUITERM_COMPILE
26 TuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd
,
27 IN OUT PCONSOLE_INFO ConsoleInfo
,
28 IN OUT PVOID ExtraConsoleInfo
,
31 TuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd
);
35 GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd
,
36 IN OUT PCONSOLE_INFO ConsoleInfo
,
37 IN OUT PVOID ExtraConsoleInfo
,
40 GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd
);
44 NTSTATUS (NTAPI
*FRONTEND_LOAD
)(IN OUT PFRONTEND FrontEnd
,
45 IN OUT PCONSOLE_INFO ConsoleInfo
,
46 IN OUT PVOID ExtraConsoleInfo
,
50 NTSTATUS (NTAPI
*FRONTEND_UNLOAD
)(IN OUT PFRONTEND FrontEnd
);
53 * If we are not in GUI-mode, start the text-mode terminal emulator.
54 * If we fail, try to start the GUI-mode terminal emulator.
56 * Try to open the GUI-mode terminal emulator. Two cases are possible:
57 * - We are in GUI-mode, therefore GuiMode == TRUE, the previous test-case
58 * failed and we start GUI-mode terminal emulator.
59 * - We are in text-mode, therefore GuiMode == FALSE, the previous test-case
60 * succeeded BUT we failed at starting text-mode terminal emulator.
61 * Then GuiMode was switched to TRUE in order to try to open the GUI-mode
62 * terminal emulator (Win32k will automatically switch to graphical mode,
63 * therefore no additional code is needed).
67 * NOTE: Each entry of the table should be retrieved when loading a front-end
68 * (examples of the CSR servers which register some data for CSRSS).
72 CHAR FrontEndName
[80];
73 FRONTEND_LOAD FrontEndLoad
;
74 FRONTEND_UNLOAD FrontEndUnload
;
75 } FrontEndLoadingMethods
[] =
77 #ifdef TUITERM_COMPILE
78 {"TUI", TuiLoadFrontEnd
, TuiUnloadFrontEnd
},
80 {"GUI", GuiLoadFrontEnd
, GuiUnloadFrontEnd
},
82 // {"Not found", 0, NULL}
86 ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd
,
87 IN OUT PCONSOLE_INFO ConsoleInfo
,
88 IN OUT PVOID ExtraConsoleInfo
,
91 NTSTATUS Status
= STATUS_SUCCESS
;
95 * Choose an adequate terminal front-end to load, and load it
97 for (i
= 0; i
< sizeof(FrontEndLoadingMethods
) / sizeof(FrontEndLoadingMethods
[0]); ++i
)
99 DPRINT("CONSRV: Trying to load %s frontend...\n",
100 FrontEndLoadingMethods
[i
].FrontEndName
);
101 Status
= FrontEndLoadingMethods
[i
].FrontEndLoad(FrontEnd
,
105 if (NT_SUCCESS(Status
))
107 /* Save the unload callback */
108 FrontEnd
->UnloadFrontEnd
= FrontEndLoadingMethods
[i
].FrontEndUnload
;
110 DPRINT("CONSRV: %s frontend loaded successfully\n",
111 FrontEndLoadingMethods
[i
].FrontEndName
);
116 DPRINT1("CONSRV: Loading %s frontend failed, Status = 0x%08lx , continuing...\n",
117 FrontEndLoadingMethods
[i
].FrontEndName
, Status
);
125 ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd
)
127 if (FrontEnd
== NULL
) return STATUS_INVALID_PARAMETER
;
128 // return FrontEnd->Vtbl->UnloadFrontEnd(FrontEnd);
129 return FrontEnd
->UnloadFrontEnd(FrontEnd
);
133 static TERMINAL_VTBL ConSrvTermVtbl
;
136 ConSrvInitTerminal(IN OUT PTERMINAL Terminal
,
137 IN OUT PCONSOLE_INFO ConsoleInfo
,
138 IN OUT PVOID ExtraConsoleInfo
,
144 /* Load a suitable frontend for the ConSrv terminal */
145 FrontEnd
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
, sizeof(*FrontEnd
));
146 if (!FrontEnd
) return STATUS_NO_MEMORY
;
148 Status
= ConSrvLoadFrontEnd(FrontEnd
,
152 if (!NT_SUCCESS(Status
))
154 DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status
);
155 ConsoleFreeHeap(FrontEnd
);
158 DPRINT("CONSRV: Frontend initialized\n");
160 /* Initialize the ConSrv terminal */
161 Terminal
->Vtbl
= &ConSrvTermVtbl
;
162 // Terminal->Console will be initialized by ConDrvRegisterTerminal
163 Terminal
->Data
= FrontEnd
; /* We store the frontend pointer in the terminal private data */
165 return STATUS_SUCCESS
;
169 ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal
)
171 NTSTATUS Status
= STATUS_SUCCESS
;
172 PFRONTEND FrontEnd
= Terminal
->Data
;
174 /* Reset the ConSrv terminal */
175 Terminal
->Data
= NULL
;
176 Terminal
->Vtbl
= NULL
;
178 /* Unload the frontend */
179 if (FrontEnd
!= NULL
)
181 Status
= ConSrvUnloadFrontEnd(FrontEnd
);
182 ConsoleFreeHeap(FrontEnd
);
189 /* CONSRV TERMINAL INTERFACE **************************************************/
191 static NTSTATUS NTAPI
192 ConSrvTermInitTerminal(IN OUT PTERMINAL This
,
196 PFRONTEND FrontEnd
= This
->Data
;
198 /* Initialize the console pointer for our frontend */
199 FrontEnd
->Console
= Console
;
201 /** HACK HACK!! Copy FrontEnd into the console!! **/
202 DPRINT1("Using FrontEndIFace HACK(1), should be removed after proper implementation!\n");
203 Console
->FrontEndIFace
= *FrontEnd
;
205 Status
= FrontEnd
->Vtbl
->InitFrontEnd(FrontEnd
, FrontEnd
->Console
);
207 /** HACK HACK!! Be sure FrontEndIFace is correctly updated in the console!! **/
208 DPRINT1("Using FrontEndIFace HACK(2), should be removed after proper implementation!\n");
209 Console
->FrontEndIFace
= *FrontEnd
;
215 ConSrvTermDeinitTerminal(IN OUT PTERMINAL This
)
217 PFRONTEND FrontEnd
= This
->Data
;
218 FrontEnd
->Vtbl
->DeinitFrontEnd(FrontEnd
);
222 ConSrvTermDrawRegion(IN OUT PTERMINAL This
,
225 PFRONTEND FrontEnd
= This
->Data
;
226 FrontEnd
->Vtbl
->DrawRegion(FrontEnd
, Region
);
230 ConSrvTermWriteStream(IN OUT PTERMINAL This
,
238 PFRONTEND FrontEnd
= This
->Data
;
239 FrontEnd
->Vtbl
->WriteStream(FrontEnd
,
249 ConSrvTermSetCursorInfo(IN OUT PTERMINAL This
,
250 PCONSOLE_SCREEN_BUFFER ScreenBuffer
)
252 PFRONTEND FrontEnd
= This
->Data
;
253 return FrontEnd
->Vtbl
->SetCursorInfo(FrontEnd
, ScreenBuffer
);
257 ConSrvTermSetScreenInfo(IN OUT PTERMINAL This
,
258 PCONSOLE_SCREEN_BUFFER ScreenBuffer
,
262 PFRONTEND FrontEnd
= This
->Data
;
263 return FrontEnd
->Vtbl
->SetScreenInfo(FrontEnd
,
270 ConSrvTermResizeTerminal(IN OUT PTERMINAL This
)
272 PFRONTEND FrontEnd
= This
->Data
;
273 FrontEnd
->Vtbl
->ResizeTerminal(FrontEnd
);
277 ConSrvTermSetActiveScreenBuffer(IN OUT PTERMINAL This
)
279 PFRONTEND FrontEnd
= This
->Data
;
280 FrontEnd
->Vtbl
->SetActiveScreenBuffer(FrontEnd
);
284 ConSrvTermReleaseScreenBuffer(IN OUT PTERMINAL This
,
285 IN PCONSOLE_SCREEN_BUFFER ScreenBuffer
)
287 PFRONTEND FrontEnd
= This
->Data
;
288 FrontEnd
->Vtbl
->ReleaseScreenBuffer(FrontEnd
, ScreenBuffer
);
292 ConSrvTermChangeTitle(IN OUT PTERMINAL This
)
294 PFRONTEND FrontEnd
= This
->Data
;
295 FrontEnd
->Vtbl
->ChangeTitle(FrontEnd
);
299 ConSrvTermGetLargestConsoleWindowSize(IN OUT PTERMINAL This
,
302 PFRONTEND FrontEnd
= This
->Data
;
303 FrontEnd
->Vtbl
->GetLargestConsoleWindowSize(FrontEnd
, pSize
);
308 ConSrvTermGetSelectionInfo(IN OUT PTERMINAL This,
309 PCONSOLE_SELECTION_INFO pSelectionInfo)
311 PFRONTEND FrontEnd = This->Data;
312 return FrontEnd->Vtbl->GetSelectionInfo(FrontEnd, pSelectionInfo);
317 ConSrvTermSetPalette(IN OUT PTERMINAL This
,
318 HPALETTE PaletteHandle
,
321 PFRONTEND FrontEnd
= This
->Data
;
322 return FrontEnd
->Vtbl
->SetPalette(FrontEnd
, PaletteHandle
, PaletteUsage
);
326 ConSrvTermShowMouseCursor(IN OUT PTERMINAL This
,
329 PFRONTEND FrontEnd
= This
->Data
;
330 return FrontEnd
->Vtbl
->ShowMouseCursor(FrontEnd
, Show
);
333 static TERMINAL_VTBL ConSrvTermVtbl
=
335 ConSrvTermInitTerminal
,
336 ConSrvTermDeinitTerminal
,
337 ConSrvTermDrawRegion
,
338 ConSrvTermWriteStream
,
339 ConSrvTermSetCursorInfo
,
340 ConSrvTermSetScreenInfo
,
341 ConSrvTermResizeTerminal
,
342 ConSrvTermSetActiveScreenBuffer
,
343 ConSrvTermReleaseScreenBuffer
,
344 ConSrvTermChangeTitle
,
345 ConSrvTermGetLargestConsoleWindowSize
,
346 // ConSrvTermGetSelectionInfo,
347 ConSrvTermSetPalette
,
348 ConSrvTermShowMouseCursor
,
353 ResetFrontEnd(IN PCONSOLE Console
)
355 if (!Console
) return;
357 /* Reinitialize the frontend interface */
358 RtlZeroMemory(&Console
->FrontEndIFace
, sizeof(Console
->FrontEndIFace
));
359 Console
->FrontEndIFace
.Vtbl
= &ConSrvTermVtbl
;