Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821/* * ReactOS kernel * Copyright (C) 2002 ReactOS Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *//* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: base/setup/usetup/consup.c * PURPOSE: Console support functions * PROGRAMMER: */
/* INCLUDES ******************************************************************/
#include <usetup.h>
#define NDEBUG#include <debug.h>
/* GLOBALS ******************************************************************/
HANDLE StdInput = NULL;HANDLE StdOutput = NULL;
SHORT xScreen = 0;SHORT yScreen = 0;
/* FUNCTIONS *****************************************************************/
BOOLEANCONSOLE_Init(VOID){ CONSOLE_SCREEN_BUFFER_INFO csbi;
/* Allocate a new console */ if (!AllocConsole()) return FALSE;
/* Get the standard handles */ StdInput = GetStdHandle(STD_INPUT_HANDLE); StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
/* Retrieve the size of the console */ if (!GetConsoleScreenBufferInfo(StdOutput, &csbi)) { FreeConsole(); return FALSE; } xScreen = csbi.dwSize.X; yScreen = csbi.dwSize.Y;
return TRUE;}
VOIDCONSOLE_ConInKey( OUT PINPUT_RECORD Buffer){ DWORD Read;
while (TRUE) { /* Wait for a key press */ ReadConsoleInput(StdInput, Buffer, 1, &Read);
if ((Buffer->EventType == KEY_EVENT) && (Buffer->Event.KeyEvent.bKeyDown != FALSE)) { break; } }}
BOOLEANCONSOLE_ConInKeyPeek( OUT PINPUT_RECORD Buffer){ DWORD Read = 0;
while (TRUE) { /* Try to get a key press without blocking */ if (!PeekConsoleInput(StdInput, Buffer, 1, &Read)) return FALSE; if (Read == 0) return FALSE;
/* Consume it */ ReadConsoleInput(StdInput, Buffer, 1, &Read);
if ((Buffer->EventType == KEY_EVENT) && (Buffer->Event.KeyEvent.bKeyDown != FALSE)) { return TRUE; } }}
VOIDCONSOLE_ConOutChar( IN CHAR c){ DWORD Written;
WriteConsole(StdOutput, &c, 1, &Written, NULL);}
VOIDCONSOLE_ConOutPuts( IN LPCSTR szText){ DWORD Written;
WriteConsole(StdOutput, szText, (ULONG)strlen(szText), &Written, NULL); WriteConsole(StdOutput, "\n", 1, &Written, NULL);}
VOIDCONSOLE_ConOutPrintfV( IN LPCSTR szFormat, IN va_list args){ CHAR szOut[256]; DWORD dwWritten;
vsprintf(szOut, szFormat, args);
WriteConsole(StdOutput, szOut, (ULONG)strlen(szOut), &dwWritten, NULL);}
VOID__cdeclCONSOLE_ConOutPrintf( IN LPCSTR szFormat, ...){ va_list arg_ptr;
va_start(arg_ptr, szFormat); CONSOLE_ConOutPrintfV(szFormat, arg_ptr); va_end(arg_ptr);}
BOOLCONSOLE_Flush(VOID){ return FlushConsoleInputBuffer(StdInput);}
VOIDCONSOLE_GetCursorXY( OUT PSHORT x, OUT PSHORT y){ CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(StdOutput, &csbi);
*x = csbi.dwCursorPosition.X; *y = csbi.dwCursorPosition.Y;}
SHORTCONSOLE_GetCursorX(VOID){ CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(StdOutput, &csbi);
return csbi.dwCursorPosition.X;}
SHORTCONSOLE_GetCursorY(VOID){ CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(StdOutput, &csbi);
return csbi.dwCursorPosition.Y;}
VOIDCONSOLE_SetCursorType( IN BOOL bInsert, IN BOOL bVisible){ CONSOLE_CURSOR_INFO cci;
cci.dwSize = bInsert ? 10 : 99; cci.bVisible = bVisible;
SetConsoleCursorInfo(StdOutput, &cci);}
VOIDCONSOLE_SetCursorXY( IN SHORT x, IN SHORT y){ COORD coPos;
coPos.X = x; coPos.Y = y; SetConsoleCursorPosition(StdOutput, coPos);}
VOIDCONSOLE_ClearScreen(VOID){ COORD coPos; DWORD Written;
coPos.X = 0; coPos.Y = 0;
/* * Hide everything under the same foreground & background colors, so that * the actual color and text blanking reset does not create a visual "blinking". * We do this because we cannot do the screen scrolling trick that would * allow to change both the text and the colors at the same time (the * function is currently not available in our console "emulation" layer). */ FillConsoleOutputAttribute(StdOutput, FOREGROUND_BLUE | BACKGROUND_BLUE, xScreen * yScreen, coPos, &Written);
/* Blank the text */ FillConsoleOutputCharacterA(StdOutput, ' ', xScreen * yScreen, coPos, &Written);
/* Reset the actual foreground & background colors */ FillConsoleOutputAttribute(StdOutput, FOREGROUND_WHITE | BACKGROUND_BLUE, xScreen * yScreen, coPos, &Written);}
VOIDCONSOLE_InvertTextXY( IN SHORT x, IN SHORT y, IN SHORT col, IN SHORT row){ COORD coPos; DWORD Written;
for (coPos.Y = y; coPos.Y < y + row; coPos.Y++) { coPos.X = x;
FillConsoleOutputAttribute(StdOutput, FOREGROUND_BLUE | BACKGROUND_WHITE, col, coPos, &Written); }}
VOIDCONSOLE_NormalTextXY( IN SHORT x, IN SHORT y, IN SHORT col, IN SHORT row){ COORD coPos; DWORD Written;
for (coPos.Y = y; coPos.Y < y + row; coPos.Y++) { coPos.X = x;
FillConsoleOutputAttribute(StdOutput, FOREGROUND_WHITE | BACKGROUND_BLUE, col, coPos, &Written); }}
VOIDCONSOLE_SetTextXY( IN SHORT x, IN SHORT y, IN LPCSTR Text){ COORD coPos; DWORD Written;
coPos.X = x; coPos.Y = y;
WriteConsoleOutputCharacterA(StdOutput, Text, (ULONG)strlen(Text), coPos, &Written);}
VOIDCONSOLE_ClearTextXY(IN SHORT x, IN SHORT y, IN SHORT Length){ COORD coPos; DWORD Written;
coPos.X = x; coPos.Y = y;
FillConsoleOutputCharacterA(StdOutput, ' ', Length, coPos, &Written);}
VOIDCONSOLE_SetInputTextXY( IN SHORT x, IN SHORT y, IN SHORT len, IN LPCWSTR Text){ COORD coPos; SHORT Length; DWORD Written;
coPos.X = x; coPos.Y = y;
Length = (SHORT)wcslen(Text); if (Length > len - 1) Length = len - 1;
FillConsoleOutputAttribute(StdOutput, BACKGROUND_WHITE, len, coPos, &Written);
WriteConsoleOutputCharacterW(StdOutput, Text, (ULONG)Length, coPos, &Written);
coPos.X += Length; if (len > Length) { FillConsoleOutputCharacterA(StdOutput, ' ', len - Length, coPos, &Written); }}
VOIDCONSOLE_SetUnderlinedTextXY( IN SHORT x, IN SHORT y, IN LPCSTR Text){ COORD coPos; DWORD Length; DWORD Written;
coPos.X = x; coPos.Y = y;
Length = (ULONG)strlen(Text);
WriteConsoleOutputCharacterA(StdOutput, Text, Length, coPos, &Written);
coPos.Y++; FillConsoleOutputCharacterA(StdOutput, CharDoubleHorizontalLine, Length, coPos, &Written);}
VOIDCONSOLE_SetStatusTextXV( IN SHORT x, IN LPCSTR fmt, IN va_list args){ INT nLength; COORD coPos; DWORD Written; CHAR Buffer[128];
memset(Buffer, ' ', min(sizeof(Buffer), xScreen)); nLength = vsprintf(&Buffer[x], fmt, args); ASSERT(x + nLength < sizeof(Buffer)); Buffer[x + nLength] = ' ';
coPos.X = 0; coPos.Y = yScreen - 1; FillConsoleOutputAttribute(StdOutput, BACKGROUND_WHITE, xScreen, coPos, &Written); WriteConsoleOutputCharacterA(StdOutput, Buffer, min(sizeof(Buffer), xScreen), coPos, &Written);}
VOID__cdeclCONSOLE_SetStatusTextX( IN SHORT x, IN LPCSTR fmt, ...){ va_list ap;
va_start(ap, fmt); CONSOLE_SetStatusTextXV(x, fmt, ap); va_end(ap);}
VOIDCONSOLE_SetStatusTextV( IN LPCSTR fmt, IN va_list args){ CONSOLE_SetStatusTextXV(0, fmt, args);}
VOID__cdeclCONSOLE_SetStatusText( IN LPCSTR fmt, ...){ va_list ap;
va_start(ap, fmt); CONSOLE_SetStatusTextV(fmt, ap); va_end(ap);}
staticVOIDCONSOLE_ClearStatusTextX( IN SHORT x, IN SHORT Length){ COORD coPos; DWORD Written;
coPos.X = x; coPos.Y = yScreen - 1;
FillConsoleOutputCharacterA(StdOutput, ' ', Length, coPos, &Written);}
VOID__cdeclCONSOLE_SetStatusTextAutoFitX( IN SHORT x, IN LPCSTR fmt, ...){ CHAR Buffer[128]; DWORD Length; va_list ap;
va_start(ap, fmt); vsprintf(Buffer, fmt, ap); va_end(ap);
Length = (ULONG)strlen(Buffer);
if (Length + x <= 79) { CONSOLE_SetStatusTextX(x , Buffer); } else { CONSOLE_SetStatusTextX(79 - Length , Buffer); }}
VOIDCONSOLE_SetInvertedTextXY( IN SHORT x, IN SHORT y, IN LPCSTR Text){ COORD coPos; DWORD Length; DWORD Written;
coPos.X = x; coPos.Y = y;
Length = (ULONG)strlen(Text);
FillConsoleOutputAttribute(StdOutput, FOREGROUND_BLUE | BACKGROUND_WHITE, Length, coPos, &Written);
WriteConsoleOutputCharacterA(StdOutput, Text, Length, coPos, &Written);}
VOIDCONSOLE_SetHighlightedTextXY( IN SHORT x, IN SHORT y, IN LPCSTR Text){ COORD coPos; DWORD Length; DWORD Written;
coPos.X = x; coPos.Y = y;
Length = (ULONG)strlen(Text);
FillConsoleOutputAttribute(StdOutput, FOREGROUND_WHITE | FOREGROUND_INTENSITY | BACKGROUND_BLUE, Length, coPos, &Written);
WriteConsoleOutputCharacterA(StdOutput, Text, Length, coPos, &Written);}
VOID__cdeclCONSOLE_PrintTextXY( IN SHORT x, IN SHORT y, IN LPCSTR fmt, ...){ CHAR buffer[512]; va_list ap; COORD coPos; DWORD Written;
va_start(ap, fmt); vsprintf(buffer, fmt, ap); va_end(ap);
coPos.X = x; coPos.Y = y;
WriteConsoleOutputCharacterA(StdOutput, buffer, (ULONG)strlen(buffer), coPos, &Written);}
VOID__cdeclCONSOLE_PrintTextXYN( IN SHORT x, IN SHORT y, IN SHORT len, IN LPCSTR fmt, ...){ CHAR buffer[512]; va_list ap; COORD coPos; SHORT Length; DWORD Written;
va_start(ap, fmt); vsprintf(buffer, fmt, ap); va_end(ap);
coPos.X = x; coPos.Y = y;
Length = (SHORT)strlen(buffer); if (Length > len - 1) Length = len - 1;
WriteConsoleOutputCharacterA(StdOutput, buffer, Length, coPos, &Written);
coPos.X += Length;
if (len > Length) { FillConsoleOutputCharacterA(StdOutput, ' ', len - Length, coPos, &Written); }}
VOIDCONSOLE_SetStyledText( IN SHORT x, IN SHORT y, IN INT Flags, IN LPCSTR Text){ COORD coPos;
coPos.X = x; coPos.Y = y;
if (Flags & TEXT_TYPE_STATUS) { coPos.X = x; coPos.Y = yScreen - 1; } else /* TEXT_TYPE_REGULAR (Default) */ { coPos.X = x; coPos.Y = y; }
if (Flags & TEXT_ALIGN_CENTER) { coPos.X = (xScreen - (SHORT)strlen(Text)) / 2; } else if(Flags & TEXT_ALIGN_RIGHT) { coPos.X = coPos.X - (SHORT)strlen(Text);
if (Flags & TEXT_PADDING_SMALL) { coPos.X -= 1; } else if (Flags & TEXT_PADDING_MEDIUM) { coPos.X -= 2; } else if (Flags & TEXT_PADDING_BIG) { coPos.X -= 3; } } else /* TEXT_ALIGN_LEFT (Default) */ { if (Flags & TEXT_PADDING_SMALL) { coPos.X += 1; } else if (Flags & TEXT_PADDING_MEDIUM) { coPos.X += 2; } else if (Flags & TEXT_PADDING_BIG) { coPos.X += 3; } }
if (Flags & TEXT_TYPE_STATUS) { CONSOLE_SetStatusTextX(coPos.X, Text); } else /* TEXT_TYPE_REGULAR (Default) */ { if (Flags & TEXT_STYLE_HIGHLIGHT) { CONSOLE_SetHighlightedTextXY(coPos.X, coPos.Y, Text); } else if (Flags & TEXT_STYLE_UNDERLINE) { CONSOLE_SetUnderlinedTextXY(coPos.X, coPos.Y, Text); } else /* TEXT_STYLE_NORMAL (Default) */ { CONSOLE_SetTextXY(coPos.X, coPos.Y, Text); } }}
VOIDCONSOLE_ClearStyledText( IN SHORT x, IN SHORT y, IN INT Flags, IN SHORT Length){ COORD coPos;
coPos.X = x; coPos.Y = y;
if (Flags & TEXT_TYPE_STATUS) { coPos.X = x; coPos.Y = yScreen - 1; } else /* TEXT_TYPE_REGULAR (Default) */ { coPos.X = x; coPos.Y = y; }
if (Flags & TEXT_ALIGN_CENTER) { coPos.X = (xScreen - Length) / 2; } else if(Flags & TEXT_ALIGN_RIGHT) { coPos.X = coPos.X - Length;
if (Flags & TEXT_PADDING_SMALL) { coPos.X -= 1; } else if (Flags & TEXT_PADDING_MEDIUM) { coPos.X -= 2; } else if (Flags & TEXT_PADDING_BIG) { coPos.X -= 3; } } else /* TEXT_ALIGN_LEFT (Default) */ { if (Flags & TEXT_PADDING_SMALL) { coPos.X += 1; } else if (Flags & TEXT_PADDING_MEDIUM) { coPos.X += 2; } else if (Flags & TEXT_PADDING_BIG) { coPos.X += 3; } }
if (Flags & TEXT_TYPE_STATUS) { CONSOLE_ClearStatusTextX(coPos.X, Length); } else if (Flags & TEXT_STYLE_UNDERLINE) { CONSOLE_ClearTextXY(coPos.X, coPos.Y, Length); CONSOLE_ClearTextXY(coPos.X, coPos.Y + 1, Length); } else /* TEXT_TYPE_REGULAR (Default) */ { CONSOLE_ClearTextXY(coPos.X, coPos.Y, Length); }}
/* EOF */