2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Driver DLL
4 * FILE: win32ss/user/winsrv/consrv/condrv/conoutput.c
5 * PURPOSE: General Console Output Functions
6 * PROGRAMMERS: Jeffrey Morlan
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
14 #include "include/conio.h"
15 #include "include/conio2.h"
16 #include "conoutput.h"
23 /* PRIVATE FUNCTIONS **********************************************************/
26 TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER
* Buffer
,
27 IN OUT PCONSOLE Console
,
28 IN PTEXTMODE_BUFFER_INFO TextModeInfo
);
30 GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER
* Buffer
,
31 IN OUT PCONSOLE Console
,
32 IN PGRAPHICS_BUFFER_INFO GraphicsInfo
);
35 TEXTMODE_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer
);
37 GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer
);
41 CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER
* Buffer
,
42 IN OUT PCONSOLE Console
,
45 if (Buffer
== NULL
|| Console
== NULL
)
46 return STATUS_INVALID_PARAMETER
;
48 *Buffer
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
, max(sizeof(CONSOLE_SCREEN_BUFFER
), Size
));
49 if (*Buffer
== NULL
) return STATUS_INSUFFICIENT_RESOURCES
;
51 /* Initialize the header with the default type */
52 ConSrvInitObject(&(*Buffer
)->Header
, SCREEN_BUFFER
, Console
);
53 (*Buffer
)->Vtbl
= NULL
;
54 return STATUS_SUCCESS
;
58 CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer
)
60 if (Buffer
->Header
.Type
== TEXTMODE_BUFFER
)
61 TEXTMODE_BUFFER_Destroy(Buffer
);
62 else if (Buffer
->Header
.Type
== GRAPHICS_BUFFER
)
63 GRAPHICS_BUFFER_Destroy(Buffer
);
64 else if (Buffer
->Header
.Type
== SCREEN_BUFFER
)
65 ConsoleFreeHeap(Buffer
);
70 // ConDrvCreateConsoleScreenBuffer
72 ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER
* Buffer
,
73 IN OUT PCONSOLE Console
,
75 IN PVOID ScreenBufferInfo
)
77 NTSTATUS Status
= STATUS_SUCCESS
;
79 if ( Console
== NULL
|| Buffer
== NULL
||
80 (BufferType
!= CONSOLE_TEXTMODE_BUFFER
&& BufferType
!= CONSOLE_GRAPHICS_BUFFER
) )
82 return STATUS_INVALID_PARAMETER
;
85 if (BufferType
== CONSOLE_TEXTMODE_BUFFER
)
87 Status
= TEXTMODE_BUFFER_Initialize(Buffer
,
89 (PTEXTMODE_BUFFER_INFO
)ScreenBufferInfo
);
91 else if (BufferType
== CONSOLE_GRAPHICS_BUFFER
)
93 Status
= GRAPHICS_BUFFER_Initialize(Buffer
,
95 (PGRAPHICS_BUFFER_INFO
)ScreenBufferInfo
);
99 /* Never ever go there!! */
103 /* Insert the newly created screen buffer into the list, if succeeded */
104 if (NT_SUCCESS(Status
)) InsertHeadList(&Console
->BufferList
, &(*Buffer
)->ListEntry
);
110 ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer
);
113 ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer
)
115 PCONSOLE Console
= Buffer
->Header
.Console
;
116 PCONSOLE_SCREEN_BUFFER NewBuffer
;
118 RemoveEntryList(&Buffer
->ListEntry
);
119 if (Buffer
== Console
->ActiveBuffer
)
121 /* Delete active buffer; switch to most recently created */
122 Console
->ActiveBuffer
= NULL
;
123 if (!IsListEmpty(&Console
->BufferList
))
125 NewBuffer
= CONTAINING_RECORD(Console
->BufferList
.Flink
,
126 CONSOLE_SCREEN_BUFFER
,
128 ConioSetActiveScreenBuffer(NewBuffer
);
132 CONSOLE_SCREEN_BUFFER_Destroy(Buffer
);
136 ConioDrawConsole(PCONSOLE Console
)
139 PCONSOLE_SCREEN_BUFFER ActiveBuffer
= Console
->ActiveBuffer
;
143 ConioInitRect(&Region
, 0, 0, ActiveBuffer
->ViewSize
.Y
- 1, ActiveBuffer
->ViewSize
.X
- 1);
144 ConioDrawRegion(Console
, &Region
);
149 ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer
)
151 PCONSOLE Console
= Buffer
->Header
.Console
;
152 Console
->ActiveBuffer
= Buffer
;
153 ConioResizeTerminal(Console
);
154 // ConioDrawConsole(Console);
158 ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console
,
159 IN PCONSOLE_SCREEN_BUFFER Buffer
)
161 if (Console
== NULL
|| Buffer
== NULL
)
162 return STATUS_INVALID_PARAMETER
;
165 ASSERT(Console
== Buffer
->Header
.Console
);
167 if (Buffer
== Console
->ActiveBuffer
) return STATUS_SUCCESS
;
169 /* If old buffer has no handles, it's now unreferenced */
170 if (Console
->ActiveBuffer
->Header
.HandleCount
== 0)
172 ConioDeleteScreenBuffer(Console
->ActiveBuffer
);
175 /* Tie console to new buffer */
176 ConioSetActiveScreenBuffer(Buffer
);
178 return STATUS_SUCCESS
;
181 PCONSOLE_SCREEN_BUFFER
182 ConDrvGetActiveScreenBuffer(IN PCONSOLE Console
)
184 return (Console
? Console
->ActiveBuffer
: NULL
);
187 /* PUBLIC DRIVER APIS *********************************************************/
190 ConDrvInvalidateBitMapRect(IN PCONSOLE Console
,
191 IN PCONSOLE_SCREEN_BUFFER Buffer
,
192 IN PSMALL_RECT Region
)
194 if (Console
== NULL
|| Buffer
== NULL
|| Region
== NULL
)
195 return STATUS_INVALID_PARAMETER
;
198 ASSERT(Console
== Buffer
->Header
.Console
);
200 /* If the output buffer is the current one, redraw the correct portion of the screen */
201 if (Buffer
== Console
->ActiveBuffer
) ConioDrawRegion(Console
, Region
);
203 return STATUS_SUCCESS
;
207 ConDrvGetConsoleCursorInfo(IN PCONSOLE Console
,
208 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
209 OUT PCONSOLE_CURSOR_INFO CursorInfo
)
211 if (Console
== NULL
|| Buffer
== NULL
|| CursorInfo
== NULL
)
212 return STATUS_INVALID_PARAMETER
;
215 ASSERT(Console
== Buffer
->Header
.Console
);
217 *CursorInfo
= Buffer
->CursorInfo
;
218 // CursorInfo->bVisible = Buffer->CursorInfo.bVisible;
219 // CursorInfo->dwSize = Buffer->CursorInfo.dwSize;
221 return STATUS_SUCCESS
;
225 ConDrvSetConsoleCursorInfo(IN PCONSOLE Console
,
226 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
227 IN PCONSOLE_CURSOR_INFO CursorInfo
)
230 BOOLEAN Visible
, Success
= TRUE
;
232 if (Console
== NULL
|| Buffer
== NULL
|| CursorInfo
== NULL
)
233 return STATUS_INVALID_PARAMETER
;
236 ASSERT(Console
== Buffer
->Header
.Console
);
238 Size
= min(max(CursorInfo
->dwSize
, 1), 100);
239 Visible
= CursorInfo
->bVisible
;
241 if ( (Size
!= Buffer
->CursorInfo
.dwSize
) ||
242 (Visible
&& !Buffer
->CursorInfo
.bVisible
) ||
243 (!Visible
&& Buffer
->CursorInfo
.bVisible
) )
245 Buffer
->CursorInfo
.dwSize
= Size
;
246 Buffer
->CursorInfo
.bVisible
= Visible
;
248 Success
= ConioSetCursorInfo(Console
, (PCONSOLE_SCREEN_BUFFER
)Buffer
);
251 return (Success
? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
255 ConDrvSetConsoleCursorPosition(IN PCONSOLE Console
,
256 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
259 SHORT OldCursorX
, OldCursorY
;
261 if (Console
== NULL
|| Buffer
== NULL
|| Position
== NULL
)
262 return STATUS_INVALID_PARAMETER
;
265 ASSERT(Console
== Buffer
->Header
.Console
);
267 if ( Position
->X
< 0 || Position
->X
>= Buffer
->ScreenBufferSize
.X
||
268 Position
->Y
< 0 || Position
->Y
>= Buffer
->ScreenBufferSize
.Y
)
270 return STATUS_INVALID_PARAMETER
;
273 OldCursorX
= Buffer
->CursorPosition
.X
;
274 OldCursorY
= Buffer
->CursorPosition
.Y
;
275 Buffer
->CursorPosition
= *Position
;
276 // Buffer->CursorPosition.X = Position->X;
277 // Buffer->CursorPosition.Y = Position->Y;
278 if ( ((PCONSOLE_SCREEN_BUFFER
)Buffer
== Console
->ActiveBuffer
) &&
279 (!ConioSetScreenInfo(Console
, (PCONSOLE_SCREEN_BUFFER
)Buffer
, OldCursorX
, OldCursorY
)) )
281 return STATUS_UNSUCCESSFUL
;
284 return STATUS_SUCCESS
;