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
= 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
!= FALSE
))
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
);
142 CONSOLE_SCREEN_BUFFER_INFO csbi
;
144 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE
), &csbi
);
146 *x
= csbi
.dwCursorPosition
.X
;
147 *y
= csbi
.dwCursorPosition
.Y
;
151 CONSOLE_GetCursorX(VOID
)
153 CONSOLE_SCREEN_BUFFER_INFO csbi
;
155 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
157 return csbi
.dwCursorPosition
.X
;
161 CONSOLE_GetCursorY(VOID
)
163 CONSOLE_SCREEN_BUFFER_INFO csbi
;
165 GetConsoleScreenBufferInfo(StdOutput
, &csbi
);
167 return csbi
.dwCursorPosition
.Y
;
171 CONSOLE_SetCursorType(
175 CONSOLE_CURSOR_INFO cci
;
177 cci
.dwSize
= bInsert
? 10 : 99;
178 cci
.bVisible
= bVisible
;
180 SetConsoleCursorInfo(StdOutput
, &cci
);
192 SetConsoleCursorPosition(StdOutput
, coPos
);
196 CONSOLE_ClearScreen(VOID
)
204 FillConsoleOutputAttribute(
206 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
211 FillConsoleOutputCharacterA(
220 CONSOLE_InvertTextXY(
229 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
233 FillConsoleOutputAttribute(
235 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
243 CONSOLE_NormalTextXY(
252 for (coPos
.Y
= y
; coPos
.Y
< y
+ row
; coPos
.Y
++)
256 FillConsoleOutputAttribute(
258 FOREGROUND_WHITE
| BACKGROUND_BLUE
,
277 WriteConsoleOutputCharacterA(
287 CONSOLE_ClearTextXY(IN SHORT x
,
297 FillConsoleOutputCharacterA(StdOutput
,
305 CONSOLE_SetInputTextXY(
318 Length
= (SHORT
)wcslen(Text
);
319 if (Length
> len
- 1)
322 FillConsoleOutputAttribute(
329 WriteConsoleOutputCharacterW(
339 FillConsoleOutputCharacterA(
349 CONSOLE_SetUnderlinedTextXY(
361 Length
= (ULONG
)strlen(Text
);
363 WriteConsoleOutputCharacterA(
371 FillConsoleOutputCharacterA(
380 CONSOLE_SetStatusText(
389 vsprintf(Buffer
, fmt
, ap
);
393 coPos
.Y
= yScreen
- 1;
395 FillConsoleOutputAttribute(
402 FillConsoleOutputCharacterA(
409 WriteConsoleOutputCharacterA(
412 (ULONG
)strlen(Buffer
),
418 CONSOLE_SetStatusTextX(
428 vsprintf(Buffer
, fmt
, ap
);
432 coPos
.Y
= yScreen
- 1;
434 FillConsoleOutputAttribute(
441 FillConsoleOutputCharacterA(
450 WriteConsoleOutputCharacterA(
453 (ULONG
)strlen(Buffer
),
460 CONSOLE_ClearStatusTextX(IN SHORT x
,
467 coPos
.Y
= yScreen
- 1;
469 FillConsoleOutputCharacterA(StdOutput
,
478 CONSOLE_SetStatusTextAutoFitX(
487 vsprintf(Buffer
, fmt
, ap
);
490 Length
= (ULONG
)strlen(Buffer
);
492 if (Length
+ x
<= 79)
494 CONSOLE_SetStatusTextX (x
, Buffer
);
498 CONSOLE_SetStatusTextX (79 - Length
, Buffer
);
503 CONSOLE_SetInvertedTextXY(
515 Length
= (ULONG
)strlen(Text
);
517 FillConsoleOutputAttribute(
519 FOREGROUND_BLUE
| BACKGROUND_WHITE
,
524 WriteConsoleOutputCharacterA(
533 CONSOLE_SetHighlightedTextXY(
545 Length
= (ULONG
)strlen(Text
);
547 FillConsoleOutputAttribute(
549 FOREGROUND_WHITE
| FOREGROUND_INTENSITY
| BACKGROUND_BLUE
,
554 WriteConsoleOutputCharacterA(
574 vsprintf(buffer
, fmt
, ap
);
580 WriteConsoleOutputCharacterA(
583 (ULONG
)strlen(buffer
),
589 CONSOLE_PrintTextXYN(
602 vsprintf(buffer
, fmt
, ap
);
608 Length
= (SHORT
)strlen(buffer
);
609 if (Length
> len
- 1)
612 WriteConsoleOutputCharacterA(
623 FillConsoleOutputCharacterA(
633 CONSOLE_SetStyledText(
645 Length
= (ULONG
)strlen(Text
);
647 if (Flags
& TEXT_TYPE_STATUS
)
650 coPos
.Y
= yScreen
- 1;
652 else /* TEXT_TYPE_REGULAR (Default) */
658 if (Flags
& TEXT_ALIGN_CENTER
)
660 coPos
.X
= (xScreen
- Length
) /2;
662 else if(Flags
& TEXT_ALIGN_RIGHT
)
664 coPos
.X
= coPos
.X
- Length
;
666 if (Flags
& TEXT_PADDING_SMALL
)
670 else if (Flags
& TEXT_PADDING_MEDIUM
)
674 else if (Flags
& TEXT_PADDING_BIG
)
679 else /* TEXT_ALIGN_LEFT (Default) */
681 if (Flags
& TEXT_PADDING_SMALL
)
685 else if (Flags
& TEXT_PADDING_MEDIUM
)
689 else if (Flags
& TEXT_PADDING_BIG
)
695 if (Flags
& TEXT_TYPE_STATUS
)
697 CONSOLE_SetStatusTextX(coPos
.X
, Text
);
699 else /* TEXT_TYPE_REGULAR (Default) */
701 if (Flags
& TEXT_STYLE_HIGHLIGHT
)
703 CONSOLE_SetHighlightedTextXY(coPos
.X
, coPos
.Y
, Text
);
705 else if (Flags
& TEXT_STYLE_UNDERLINE
)
707 CONSOLE_SetUnderlinedTextXY(coPos
.X
, coPos
.Y
, Text
);
709 else /* TEXT_STYLE_NORMAL (Default) */
711 CONSOLE_SetTextXY(coPos
.X
, coPos
.Y
, Text
);
718 CONSOLE_ClearStyledText(IN SHORT x
,
728 if (Flags
& TEXT_TYPE_STATUS
)
731 coPos
.Y
= yScreen
- 1;
733 else /* TEXT_TYPE_REGULAR (Default) */
739 if (Flags
& TEXT_ALIGN_CENTER
)
741 coPos
.X
= (xScreen
- Length
) /2;
743 else if(Flags
& TEXT_ALIGN_RIGHT
)
745 coPos
.X
= coPos
.X
- Length
;
747 if (Flags
& TEXT_PADDING_SMALL
)
751 else if (Flags
& TEXT_PADDING_MEDIUM
)
755 else if (Flags
& TEXT_PADDING_BIG
)
760 else /* TEXT_ALIGN_LEFT (Default) */
762 if (Flags
& TEXT_PADDING_SMALL
)
766 else if (Flags
& TEXT_PADDING_MEDIUM
)
770 else if (Flags
& TEXT_PADDING_BIG
)
776 if (Flags
& TEXT_TYPE_STATUS
)
778 CONSOLE_ClearStatusTextX(coPos
.X
, Length
);
780 else /* TEXT_TYPE_REGULAR (Default) */
782 CONSOLE_ClearTextXY(coPos
.X
, coPos
.Y
, Length
);