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: base/setup/usetup/consup.c
23 * PURPOSE: Console support functions
27 /* INCLUDES ******************************************************************/
34 /* GLOBALS ******************************************************************/
36 HANDLE StdInput
= INVALID_HANDLE_VALUE
;
37 HANDLE StdOutput
= INVALID_HANDLE_VALUE
;
42 /* FUNCTIONS *****************************************************************/
48 CONSOLE_SCREEN_BUFFER_INFO csbi
;
52 StdInput
= GetStdHandle(STD_INPUT_HANDLE
);
53 StdOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
54 if (!GetConsoleScreenBufferInfo(StdOutput
, &csbi
))
56 xScreen
= csbi
.dwSize
.X
;
57 yScreen
= csbi
.dwSize
.Y
;
63 OUT PINPUT_RECORD Buffer
)
69 /* Wait for a key press */
70 ReadConsoleInput(StdInput
, Buffer
, 1, &Read
);
72 if ((Buffer
->EventType
== KEY_EVENT
) &&
73 (Buffer
->Event
.KeyEvent
.bKeyDown
!= FALSE
))
82 OUT PINPUT_RECORD Buffer
)
88 /* Try to get a key press without blocking */
89 if (!PeekConsoleInput(StdInput
, Buffer
, 1, &Read
))
95 ReadConsoleInput(StdInput
, Buffer
, 1, &Read
);
97 if ((Buffer
->EventType
== KEY_EVENT
) &&
98 (Buffer
->Event
.KeyEvent
.bKeyDown
!= FALSE
))
128 (ULONG
)strlen(szText
),
140 CONSOLE_ConOutPrintf(
141 IN LPCSTR szFormat
, ...)
147 va_start(arg_ptr
, szFormat
);
148 vsprintf(szOut
, szFormat
, arg_ptr
);
154 (ULONG
)strlen(szOut
),
162 return FlushConsoleInputBuffer(StdInput
);
170 CONSOLE_SCREEN_BUFFER_INFO csbi
;
172 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE
), &csbi
);
174 *x
= csbi
.dwCursorPosition
.X
;
175 *y
= csbi
.dwCursorPosition
.Y
;
179 CONSOLE_GetCursorX(VOID
)
181 CONSOLE_SCREEN_BUFFER_INFO csbi
;
183 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
185 return csbi
.dwCursorPosition
.X
;
189 CONSOLE_GetCursorY(VOID
)
191 CONSOLE_SCREEN_BUFFER_INFO csbi
;
193 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
195 return csbi
.dwCursorPosition
.Y
;
199 CONSOLE_SetCursorType(
203 CONSOLE_CURSOR_INFO cci
;
205 cci
.dwSize
= bInsert
? 10 : 99;
206 cci
.bVisible
= bVisible
;
208 SetConsoleCursorInfo(StdOutput
, &cci
);
220 SetConsoleCursorPosition(StdOutput
, coPos
);
224 CONSOLE_ClearScreen(VOID
)
232 FillConsoleOutputAttribute(
234 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
239 FillConsoleOutputCharacterA(
248 CONSOLE_InvertTextXY(
257 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
261 FillConsoleOutputAttribute(
263 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
271 CONSOLE_NormalTextXY(
280 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
284 FillConsoleOutputAttribute(
286 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
305 WriteConsoleOutputCharacterA(
315 CONSOLE_ClearTextXY(IN SHORT x
,
325 FillConsoleOutputCharacterA(StdOutput
,
333 CONSOLE_SetInputTextXY(
346 Length
= (SHORT
)wcslen(Text
);
347 if (Length
> len
- 1)
350 FillConsoleOutputAttribute(
357 WriteConsoleOutputCharacterW(
367 FillConsoleOutputCharacterA(
377 CONSOLE_SetUnderlinedTextXY(
389 Length
= (ULONG
)strlen(Text
);
391 WriteConsoleOutputCharacterA(
399 FillConsoleOutputCharacterA(
408 CONSOLE_SetStatusText(
417 vsprintf(Buffer
, fmt
, ap
);
421 coPos
.Y
= yScreen
- 1;
423 FillConsoleOutputAttribute(
430 FillConsoleOutputCharacterA(
437 WriteConsoleOutputCharacterA(
440 (ULONG
)strlen(Buffer
),
446 CONSOLE_SetStatusTextX(
456 vsprintf(Buffer
, fmt
, ap
);
460 coPos
.Y
= yScreen
- 1;
462 FillConsoleOutputAttribute(
469 FillConsoleOutputCharacterA(
478 WriteConsoleOutputCharacterA(
481 (ULONG
)strlen(Buffer
),
488 CONSOLE_ClearStatusTextX(IN SHORT x
,
495 coPos
.Y
= yScreen
- 1;
497 FillConsoleOutputCharacterA(StdOutput
,
506 CONSOLE_SetStatusTextAutoFitX(
515 vsprintf(Buffer
, fmt
, ap
);
518 Length
= (ULONG
)strlen(Buffer
);
520 if (Length
+ x
<= 79)
522 CONSOLE_SetStatusTextX (x
, Buffer
);
526 CONSOLE_SetStatusTextX (79 - Length
, Buffer
);
531 CONSOLE_SetInvertedTextXY(
543 Length
= (ULONG
)strlen(Text
);
545 FillConsoleOutputAttribute(
547 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
552 WriteConsoleOutputCharacterA(
561 CONSOLE_SetHighlightedTextXY(
573 Length
= (ULONG
)strlen(Text
);
575 FillConsoleOutputAttribute(
577 FOREGROUND_WHITE
| FOREGROUND_INTENSITY
| BACKGROUND_BLUE
,
582 WriteConsoleOutputCharacterA(
602 vsprintf(buffer
, fmt
, ap
);
608 WriteConsoleOutputCharacterA(
611 (ULONG
)strlen(buffer
),
617 CONSOLE_PrintTextXYN(
630 vsprintf(buffer
, fmt
, ap
);
636 Length
= (SHORT
)strlen(buffer
);
637 if (Length
> len
- 1)
640 WriteConsoleOutputCharacterA(
651 FillConsoleOutputCharacterA(
661 CONSOLE_SetStyledText(
673 Length
= (ULONG
)strlen(Text
);
675 if (Flags
& TEXT_TYPE_STATUS
)
678 coPos
.Y
= yScreen
- 1;
680 else /* TEXT_TYPE_REGULAR (Default) */
686 if (Flags
& TEXT_ALIGN_CENTER
)
688 coPos
.X
= (xScreen
- Length
) /2;
690 else if(Flags
& TEXT_ALIGN_RIGHT
)
692 coPos
.X
= coPos
.X
- Length
;
694 if (Flags
& TEXT_PADDING_SMALL
)
698 else if (Flags
& TEXT_PADDING_MEDIUM
)
702 else if (Flags
& TEXT_PADDING_BIG
)
707 else /* TEXT_ALIGN_LEFT (Default) */
709 if (Flags
& TEXT_PADDING_SMALL
)
713 else if (Flags
& TEXT_PADDING_MEDIUM
)
717 else if (Flags
& TEXT_PADDING_BIG
)
723 if (Flags
& TEXT_TYPE_STATUS
)
725 CONSOLE_SetStatusTextX(coPos
.X
, Text
);
727 else /* TEXT_TYPE_REGULAR (Default) */
729 if (Flags
& TEXT_STYLE_HIGHLIGHT
)
731 CONSOLE_SetHighlightedTextXY(coPos
.X
, coPos
.Y
, Text
);
733 else if (Flags
& TEXT_STYLE_UNDERLINE
)
735 CONSOLE_SetUnderlinedTextXY(coPos
.X
, coPos
.Y
, Text
);
737 else /* TEXT_STYLE_NORMAL (Default) */
739 CONSOLE_SetTextXY(coPos
.X
, coPos
.Y
, Text
);
746 CONSOLE_ClearStyledText(IN SHORT x
,
756 if (Flags
& TEXT_TYPE_STATUS
)
759 coPos
.Y
= yScreen
- 1;
761 else /* TEXT_TYPE_REGULAR (Default) */
767 if (Flags
& TEXT_ALIGN_CENTER
)
769 coPos
.X
= (xScreen
- Length
) /2;
771 else if(Flags
& TEXT_ALIGN_RIGHT
)
773 coPos
.X
= coPos
.X
- Length
;
775 if (Flags
& TEXT_PADDING_SMALL
)
779 else if (Flags
& TEXT_PADDING_MEDIUM
)
783 else if (Flags
& TEXT_PADDING_BIG
)
788 else /* TEXT_ALIGN_LEFT (Default) */
790 if (Flags
& TEXT_PADDING_SMALL
)
794 else if (Flags
& TEXT_PADDING_MEDIUM
)
798 else if (Flags
& TEXT_PADDING_BIG
)
804 if (Flags
& TEXT_TYPE_STATUS
)
806 CONSOLE_ClearStatusTextX(coPos
.X
, Length
);
808 else /* TEXT_TYPE_REGULAR (Default) */
810 CONSOLE_ClearTextXY(coPos
.X
, coPos
.Y
, Length
);