3 * Copyright (C) 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: subsys/system/usetup/console.c
23 * PURPOSE: Console support functions
24 * PROGRAMMER: Eric Kohl
27 /* INCLUDES ******************************************************************/
34 /* GLOBALS ******************************************************************/
36 HANDLE StdInput
= INVALID_HANDLE_VALUE
;
37 HANDLE StdOutput
= INVALID_HANDLE_VALUE
;
42 /* FUNCTIONS *****************************************************************/
48 CONSOLE_SCREEN_BUFFER_INFO csbi
;
49 if (!HOST_InitConsole())
52 StdInput
= GetStdHandle(STD_INPUT_HANDLE
);
53 StdOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
54 if (!GetConsoleScreenBufferInfo(StdOutput
, &csbi
))
56 xScreen
= csbi
.dwSize
.X
;
57 yScreen
= 50;//csbi.dwSize.Y;
63 OUT PINPUT_RECORD Buffer
)
69 ReadConsoleInput(StdInput
, Buffer
, 1, &Read
);
71 if ((Buffer
->EventType
== KEY_EVENT
)
72 && (Buffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
100 (ULONG
)strlen(szText
),
112 CONSOLE_ConOutPrintf(
113 IN LPCSTR szFormat
, ...)
119 va_start(arg_ptr
, szFormat
);
120 vsprintf(szOut
, szFormat
, arg_ptr
);
126 (ULONG
)strlen(szOut
),
134 return FlushConsoleInputBuffer(StdInput
);
138 CONSOLE_GetCursorX(VOID
)
140 CONSOLE_SCREEN_BUFFER_INFO csbi
;
142 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
144 return csbi
.dwCursorPosition
.X
;
148 CONSOLE_GetCursorY(VOID
)
150 CONSOLE_SCREEN_BUFFER_INFO csbi
;
152 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
154 return csbi
.dwCursorPosition
.Y
;
158 CONSOLE_SetCursorType(
162 CONSOLE_CURSOR_INFO cci
;
164 cci
.dwSize
= bInsert
? 10 : 99;
165 cci
.bVisible
= bVisible
;
167 SetConsoleCursorInfo(StdOutput
, &cci
);
179 SetConsoleCursorPosition(StdOutput
, coPos
);
183 CONSOLE_ClearScreen(VOID
)
191 FillConsoleOutputAttribute(
193 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
198 FillConsoleOutputCharacterA(
207 CONSOLE_InvertTextXY(
216 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
220 FillConsoleOutputAttribute(
222 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
230 CONSOLE_NormalTextXY(
239 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
243 FillConsoleOutputAttribute(
245 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
264 WriteConsoleOutputCharacterA(
274 CONSOLE_ClearTextXY(IN SHORT x
,
284 FillConsoleOutputCharacterA(StdOutput
,
292 CONSOLE_SetInputTextXY(
305 Length
= (SHORT
)wcslen(Text
);
306 if (Length
> len
- 1)
309 FillConsoleOutputAttribute(
316 WriteConsoleOutputCharacterW(
324 FillConsoleOutputCharacterA(
331 if (len
> Length
+ 1)
334 FillConsoleOutputCharacterA(
344 CONSOLE_SetUnderlinedTextXY(
356 Length
= (ULONG
)strlen(Text
);
358 WriteConsoleOutputCharacterA(
366 FillConsoleOutputCharacterA(
375 CONSOLE_SetStatusText(
384 vsprintf(Buffer
, fmt
, ap
);
388 coPos
.Y
= yScreen
- 1;
390 FillConsoleOutputAttribute(
397 FillConsoleOutputCharacterA(
404 WriteConsoleOutputCharacterA(
407 (ULONG
)strlen(Buffer
),
413 CONSOLE_SetStatusTextX(
423 vsprintf(Buffer
, fmt
, ap
);
427 coPos
.Y
= yScreen
- 1;
429 FillConsoleOutputAttribute(
436 FillConsoleOutputCharacterA(
445 WriteConsoleOutputCharacterA(
448 (ULONG
)strlen(Buffer
),
455 CONSOLE_ClearStatusTextX(IN SHORT x
,
462 coPos
.Y
= yScreen
- 1;
464 FillConsoleOutputCharacterA(StdOutput
,
473 CONSOLE_SetStatusTextAutoFitX(
482 vsprintf(Buffer
, fmt
, ap
);
485 Length
= (ULONG
)strlen(Buffer
);
487 if (Length
+ x
<= 79)
489 CONSOLE_SetStatusTextX (x
, Buffer
);
493 CONSOLE_SetStatusTextX (79 - Length
, Buffer
);
498 CONSOLE_SetInvertedTextXY(
510 Length
= (ULONG
)strlen(Text
);
512 FillConsoleOutputAttribute(
514 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
519 WriteConsoleOutputCharacterA(
528 CONSOLE_SetHighlightedTextXY(
540 Length
= (ULONG
)strlen(Text
);
542 FillConsoleOutputAttribute(
544 FOREGROUND_WHITE
| FOREGROUND_INTENSITY
| BACKGROUND_BLUE
,
549 WriteConsoleOutputCharacterA(
569 vsprintf(buffer
, fmt
, ap
);
575 WriteConsoleOutputCharacterA(
578 (ULONG
)strlen(buffer
),
584 CONSOLE_PrintTextXYN(
597 vsprintf(buffer
, fmt
, ap
);
603 Length
= (SHORT
)strlen(buffer
);
604 if (Length
> len
- 1)
607 WriteConsoleOutputCharacterA(
618 FillConsoleOutputCharacterA(
628 CONSOLE_SetStyledText(
640 Length
= (ULONG
)strlen(Text
);
642 if (Flags
& TEXT_TYPE_STATUS
)
645 coPos
.Y
= yScreen
- 1;
647 else /* TEXT_TYPE_REGULAR (Default) */
653 if (Flags
& TEXT_ALIGN_CENTER
)
655 coPos
.X
= (xScreen
- Length
) /2;
657 else if(Flags
& TEXT_ALIGN_RIGHT
)
659 coPos
.X
= coPos
.X
- Length
;
661 if (Flags
& TEXT_PADDING_SMALL
)
665 else if (Flags
& TEXT_PADDING_MEDIUM
)
669 else if (Flags
& TEXT_PADDING_BIG
)
674 else /* TEXT_ALIGN_LEFT (Default) */
676 if (Flags
& TEXT_PADDING_SMALL
)
680 else if (Flags
& TEXT_PADDING_MEDIUM
)
684 else if (Flags
& TEXT_PADDING_BIG
)
690 if (Flags
& TEXT_TYPE_STATUS
)
692 CONSOLE_SetStatusTextX(coPos
.X
, Text
);
694 else /* TEXT_TYPE_REGULAR (Default) */
696 if (Flags
& TEXT_STYLE_HIGHLIGHT
)
698 CONSOLE_SetHighlightedTextXY(coPos
.X
, coPos
.Y
, Text
);
700 else if (Flags
& TEXT_STYLE_UNDERLINE
)
702 CONSOLE_SetUnderlinedTextXY(coPos
.X
, coPos
.Y
, Text
);
704 else /* TEXT_STYLE_NORMAL (Default) */
706 CONSOLE_SetTextXY(coPos
.X
, coPos
.Y
, Text
);
713 CONSOLE_ClearStyledText(IN SHORT x
,
723 if (Flags
& TEXT_TYPE_STATUS
)
726 coPos
.Y
= yScreen
- 1;
728 else /* TEXT_TYPE_REGULAR (Default) */
734 if (Flags
& TEXT_ALIGN_CENTER
)
736 coPos
.X
= (xScreen
- Length
) /2;
738 else if(Flags
& TEXT_ALIGN_RIGHT
)
740 coPos
.X
= coPos
.X
- Length
;
742 if (Flags
& TEXT_PADDING_SMALL
)
746 else if (Flags
& TEXT_PADDING_MEDIUM
)
750 else if (Flags
& TEXT_PADDING_BIG
)
755 else /* TEXT_ALIGN_LEFT (Default) */
757 if (Flags
& TEXT_PADDING_SMALL
)
761 else if (Flags
& TEXT_PADDING_MEDIUM
)
765 else if (Flags
& TEXT_PADDING_BIG
)
771 if (Flags
& TEXT_TYPE_STATUS
)
773 CONSOLE_ClearStatusTextX(coPos
.X
, Length
);
775 else /* TEXT_TYPE_REGULAR (Default) */
777 CONSOLE_ClearTextXY(coPos
.X
, coPos
.Y
, Length
);