ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

consup.c
Go to the documentation of this file.
00001 /*
00002  *  ReactOS kernel
00003  *  Copyright (C) 2002 ReactOS Team
00004  *
00005  *  This program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2 of the License, or
00008  *  (at your option) any later version.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License along
00016  *  with this program; if not, write to the Free Software Foundation, Inc.,
00017  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00018  */
00019 /*
00020  * COPYRIGHT:       See COPYING in the top level directory
00021  * PROJECT:         ReactOS text-mode setup
00022  * FILE:            subsys/system/usetup/console.c
00023  * PURPOSE:         Console support functions
00024  * PROGRAMMER:      Eric Kohl
00025  */
00026 
00027 /* INCLUDES ******************************************************************/
00028 
00029 #include "usetup.h"
00030 
00031 #define NDEBUG
00032 #include <debug.h>
00033 
00034 /* GLOBALS ******************************************************************/
00035 
00036 HANDLE StdInput  = INVALID_HANDLE_VALUE;
00037 HANDLE StdOutput = INVALID_HANDLE_VALUE;
00038 
00039 SHORT xScreen = 0;
00040 SHORT yScreen = 0;
00041 
00042 /* FUNCTIONS *****************************************************************/
00043 
00044 BOOLEAN
00045 CONSOLE_Init(
00046     VOID)
00047 {
00048     CONSOLE_SCREEN_BUFFER_INFO csbi;
00049     if (!HOST_InitConsole())
00050         return FALSE;
00051 
00052     StdInput = GetStdHandle(STD_INPUT_HANDLE);
00053     StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
00054     if (!GetConsoleScreenBufferInfo(StdOutput, &csbi))
00055         return FALSE;
00056     xScreen = csbi.dwSize.X;
00057     yScreen = 50;//csbi.dwSize.Y;
00058     return TRUE;
00059 }
00060 
00061 VOID
00062 CONSOLE_ConInKey(
00063     OUT PINPUT_RECORD Buffer)
00064 {
00065     DWORD Read;
00066 
00067     while (TRUE)
00068     {
00069         ReadConsoleInput(StdInput, Buffer, 1, &Read);
00070 
00071         if ((Buffer->EventType == KEY_EVENT)
00072          && (Buffer->Event.KeyEvent.bKeyDown == TRUE))
00073             break;
00074     }
00075 }
00076 
00077 VOID
00078 CONSOLE_ConOutChar(
00079     IN CHAR c)
00080 {
00081     DWORD Written;
00082 
00083     WriteConsole(
00084         StdOutput,
00085         &c,
00086         1,
00087         &Written,
00088         NULL);
00089 }
00090 
00091 VOID
00092 CONSOLE_ConOutPuts(
00093     IN LPCSTR szText)
00094 {
00095     DWORD Written;
00096 
00097     WriteConsole(
00098         StdOutput,
00099         szText,
00100         (ULONG)strlen(szText),
00101         &Written,
00102         NULL);
00103     WriteConsole(
00104         StdOutput,
00105         "\n",
00106         1,
00107         &Written,
00108         NULL);
00109 }
00110 
00111 VOID
00112 CONSOLE_ConOutPrintf(
00113     IN LPCSTR szFormat, ...)
00114 {
00115     CHAR szOut[256];
00116     DWORD dwWritten;
00117     va_list arg_ptr;
00118 
00119     va_start(arg_ptr, szFormat);
00120     vsprintf(szOut, szFormat, arg_ptr);
00121     va_end(arg_ptr);
00122 
00123     WriteConsole(
00124         StdOutput,
00125         szOut,
00126         (ULONG)strlen(szOut),
00127         &dwWritten,
00128         NULL);
00129 }
00130 
00131 BOOL
00132 CONSOLE_Flush(VOID)
00133 {
00134     return FlushConsoleInputBuffer(StdInput);
00135 }
00136 
00137 SHORT
00138 CONSOLE_GetCursorX(VOID)
00139 {
00140     CONSOLE_SCREEN_BUFFER_INFO csbi;
00141 
00142     GetConsoleScreenBufferInfo(StdOutput, &csbi);
00143 
00144     return csbi.dwCursorPosition.X;
00145 }
00146 
00147 SHORT
00148 CONSOLE_GetCursorY(VOID)
00149 {
00150     CONSOLE_SCREEN_BUFFER_INFO csbi;
00151 
00152     GetConsoleScreenBufferInfo(StdOutput, &csbi);
00153 
00154     return csbi.dwCursorPosition.Y;
00155 }
00156 
00157 VOID
00158 CONSOLE_SetCursorType(
00159     IN BOOL bInsert,
00160     IN BOOL bVisible)
00161 {
00162     CONSOLE_CURSOR_INFO cci;
00163 
00164     cci.dwSize = bInsert ? 10 : 99;
00165     cci.bVisible = bVisible;
00166 
00167     SetConsoleCursorInfo(StdOutput, &cci);
00168 }
00169 
00170 VOID
00171 CONSOLE_SetCursorXY(
00172     IN SHORT x,
00173     IN SHORT y)
00174 {
00175     COORD coPos;
00176 
00177     coPos.X = x;
00178     coPos.Y = y;
00179     SetConsoleCursorPosition(StdOutput, coPos);
00180 }
00181 
00182 VOID
00183 CONSOLE_ClearScreen(VOID)
00184 {
00185     COORD coPos;
00186     DWORD Written;
00187 
00188     coPos.X = 0;
00189     coPos.Y = 0;
00190 
00191     FillConsoleOutputAttribute(
00192         StdOutput,
00193         FOREGROUND_WHITE | BACKGROUND_BLUE,
00194         xScreen * yScreen,
00195         coPos,
00196         &Written);
00197 
00198     FillConsoleOutputCharacterA(
00199         StdOutput,
00200         ' ',
00201         xScreen * yScreen,
00202         coPos,
00203         &Written);
00204 }
00205 
00206 VOID
00207 CONSOLE_InvertTextXY(
00208     IN SHORT x,
00209     IN SHORT y,
00210     IN SHORT col,
00211     IN SHORT row)
00212 {
00213     COORD coPos;
00214     DWORD Written;
00215 
00216     for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
00217     {
00218         coPos.X = x;
00219 
00220         FillConsoleOutputAttribute(
00221             StdOutput,
00222             FOREGROUND_BLUE | BACKGROUND_WHITE,
00223             col,
00224             coPos,
00225             &Written);
00226     }
00227 }
00228 
00229 VOID
00230 CONSOLE_NormalTextXY(
00231     IN SHORT x,
00232     IN SHORT y,
00233     IN SHORT col,
00234     IN SHORT row)
00235 {
00236     COORD coPos;
00237     DWORD Written;
00238 
00239     for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
00240     {
00241         coPos.X = x;
00242 
00243         FillConsoleOutputAttribute(
00244             StdOutput,
00245             FOREGROUND_WHITE | BACKGROUND_BLUE,
00246             col,
00247             coPos,
00248             &Written);
00249     }
00250 }
00251 
00252 VOID
00253 CONSOLE_SetTextXY(
00254     IN SHORT x,
00255     IN SHORT y,
00256     IN LPCSTR Text)
00257 {
00258     COORD coPos;
00259     DWORD Written;
00260 
00261     coPos.X = x;
00262     coPos.Y = y;
00263 
00264     WriteConsoleOutputCharacterA(
00265         StdOutput,
00266         Text,
00267         (ULONG)strlen(Text),
00268         coPos,
00269         &Written);
00270 }
00271 
00272 static
00273 VOID
00274 CONSOLE_ClearTextXY(IN SHORT x,
00275                     IN SHORT y,
00276                     IN SHORT Length)
00277 {
00278     COORD coPos;
00279     DWORD Written;
00280 
00281     coPos.X = x;
00282     coPos.Y = y;
00283 
00284     FillConsoleOutputCharacterA(StdOutput,
00285                                 ' ',
00286                                 Length,
00287                                 coPos,
00288                                 &Written);
00289 }
00290 
00291 VOID
00292 CONSOLE_SetInputTextXY(
00293     IN SHORT x,
00294     IN SHORT y,
00295     IN SHORT len,
00296     IN LPCWSTR Text)
00297 {
00298     COORD coPos;
00299     SHORT Length;
00300     DWORD Written;
00301 
00302     coPos.X = x;
00303     coPos.Y = y;
00304 
00305     Length = (SHORT)wcslen(Text);
00306     if (Length > len - 1)
00307         Length = len - 1;
00308 
00309     FillConsoleOutputAttribute(
00310         StdOutput,
00311         BACKGROUND_WHITE,
00312         len,
00313         coPos,
00314         &Written);
00315 
00316     WriteConsoleOutputCharacterW(
00317         StdOutput,
00318         Text,
00319         (ULONG)Length,
00320         coPos,
00321         &Written);
00322 
00323     coPos.X += Length;
00324     FillConsoleOutputCharacterA(
00325         StdOutput,
00326         '_',
00327         1,
00328         coPos,
00329         &Written);
00330 
00331     if (len > Length + 1)
00332     {
00333         coPos.X++;
00334         FillConsoleOutputCharacterA(
00335             StdOutput,
00336             ' ',
00337             len - Length - 1,
00338             coPos,
00339             &Written);
00340     }
00341 }
00342 
00343 VOID
00344 CONSOLE_SetUnderlinedTextXY(
00345     IN SHORT x,
00346     IN SHORT y,
00347     IN LPCSTR Text)
00348 {
00349     COORD coPos;
00350     DWORD Length;
00351     DWORD Written;
00352 
00353     coPos.X = x;
00354     coPos.Y = y;
00355 
00356     Length = (ULONG)strlen(Text);
00357 
00358     WriteConsoleOutputCharacterA(
00359         StdOutput,
00360         Text,
00361         Length,
00362         coPos,
00363         &Written);
00364 
00365     coPos.Y++;
00366     FillConsoleOutputCharacterA(
00367         StdOutput,
00368         0xCD,
00369         Length,
00370         coPos,
00371         &Written);
00372 }
00373 
00374 VOID
00375 CONSOLE_SetStatusText(
00376     IN LPCSTR fmt, ...)
00377 {
00378     CHAR Buffer[128];
00379     va_list ap;
00380     COORD coPos;
00381     DWORD Written;
00382 
00383     va_start(ap, fmt);
00384     vsprintf(Buffer, fmt, ap);
00385     va_end(ap);
00386 
00387     coPos.X = 0;
00388     coPos.Y = yScreen - 1;
00389 
00390     FillConsoleOutputAttribute(
00391         StdOutput,
00392         BACKGROUND_WHITE,
00393         xScreen,
00394         coPos,
00395         &Written);
00396 
00397     FillConsoleOutputCharacterA(
00398         StdOutput,
00399         ' ',
00400         xScreen,
00401         coPos,
00402         &Written);
00403 
00404     WriteConsoleOutputCharacterA(
00405         StdOutput,
00406         Buffer,
00407         (ULONG)strlen(Buffer),
00408         coPos,
00409         &Written);
00410 }
00411 
00412 VOID
00413 CONSOLE_SetStatusTextX(
00414     IN SHORT x,
00415     IN LPCSTR fmt, ...)
00416 {
00417     CHAR Buffer[128];
00418     va_list ap;
00419     COORD coPos;
00420     DWORD Written;
00421 
00422     va_start(ap, fmt);
00423     vsprintf(Buffer, fmt, ap);
00424     va_end(ap);
00425 
00426     coPos.X = 0;
00427     coPos.Y = yScreen - 1;
00428 
00429     FillConsoleOutputAttribute(
00430         StdOutput,
00431         BACKGROUND_WHITE,
00432         xScreen,
00433         coPos,
00434         &Written);
00435 
00436     FillConsoleOutputCharacterA(
00437         StdOutput,
00438         ' ',
00439         xScreen,
00440         coPos,
00441         &Written);
00442 
00443     coPos.X = x;
00444 
00445     WriteConsoleOutputCharacterA(
00446         StdOutput,
00447         Buffer,
00448         (ULONG)strlen(Buffer),
00449         coPos,
00450         &Written);
00451 }
00452 
00453 static
00454 VOID
00455 CONSOLE_ClearStatusTextX(IN SHORT x,
00456                          IN SHORT Length)
00457 {
00458     COORD coPos;
00459     DWORD Written;
00460 
00461     coPos.X = x;
00462     coPos.Y = yScreen - 1;
00463 
00464     FillConsoleOutputCharacterA(StdOutput,
00465                                 ' ',
00466                                 Length,
00467                                 coPos,
00468                                 &Written);
00469 }
00470 
00471 
00472 VOID
00473 CONSOLE_SetStatusTextAutoFitX(
00474     IN SHORT x,
00475     IN LPCSTR fmt, ...)
00476 {
00477     CHAR Buffer[128];
00478     DWORD Length;
00479     va_list ap;
00480 
00481     va_start(ap, fmt);
00482     vsprintf(Buffer, fmt, ap);
00483     va_end(ap);
00484 
00485     Length = (ULONG)strlen(Buffer);
00486 
00487     if (Length + x <= 79)
00488     {
00489         CONSOLE_SetStatusTextX (x , Buffer);
00490     }
00491     else
00492     {
00493         CONSOLE_SetStatusTextX (79 - Length , Buffer);
00494     }
00495 }
00496 
00497 VOID
00498 CONSOLE_SetInvertedTextXY(
00499     IN SHORT x,
00500     IN SHORT y,
00501     IN LPCSTR Text)
00502 {
00503     COORD coPos;
00504     DWORD Length;
00505     DWORD Written;
00506 
00507     coPos.X = x;
00508     coPos.Y = y;
00509 
00510     Length = (ULONG)strlen(Text);
00511 
00512     FillConsoleOutputAttribute(
00513         StdOutput,
00514         FOREGROUND_BLUE | BACKGROUND_WHITE,
00515         Length,
00516         coPos,
00517         &Written);
00518 
00519     WriteConsoleOutputCharacterA(
00520         StdOutput,
00521         Text,
00522         Length,
00523         coPos,
00524         &Written);
00525 }
00526 
00527 VOID
00528 CONSOLE_SetHighlightedTextXY(
00529     IN SHORT x,
00530     IN SHORT y,
00531     IN LPCSTR Text)
00532 {
00533     COORD coPos;
00534     DWORD Length;
00535     DWORD Written;
00536 
00537     coPos.X = x;
00538     coPos.Y = y;
00539 
00540     Length = (ULONG)strlen(Text);
00541 
00542     FillConsoleOutputAttribute(
00543         StdOutput,
00544         FOREGROUND_WHITE | FOREGROUND_INTENSITY | BACKGROUND_BLUE,
00545         Length,
00546         coPos,
00547         &Written);
00548 
00549     WriteConsoleOutputCharacterA(
00550         StdOutput,
00551         Text,
00552         Length,
00553         coPos,
00554         &Written);
00555 }
00556 
00557 VOID
00558 CONSOLE_PrintTextXY(
00559     IN SHORT x,
00560     IN SHORT y,
00561     IN LPCSTR fmt, ...)
00562 {
00563     CHAR buffer[512];
00564     va_list ap;
00565     COORD coPos;
00566     DWORD Written;
00567 
00568     va_start(ap, fmt);
00569     vsprintf(buffer, fmt, ap);
00570     va_end(ap);
00571 
00572     coPos.X = x;
00573     coPos.Y = y;
00574 
00575     WriteConsoleOutputCharacterA(
00576         StdOutput,
00577         buffer,
00578         (ULONG)strlen(buffer),
00579         coPos,
00580         &Written);
00581 }
00582 
00583 VOID
00584 CONSOLE_PrintTextXYN(
00585     IN SHORT x,
00586     IN SHORT y,
00587     IN SHORT len,
00588     IN LPCSTR fmt, ...)
00589 {
00590     CHAR buffer[512];
00591     va_list ap;
00592     COORD coPos;
00593     SHORT Length;
00594     DWORD Written;
00595 
00596     va_start(ap, fmt);
00597     vsprintf(buffer, fmt, ap);
00598     va_end(ap);
00599 
00600     coPos.X = x;
00601     coPos.Y = y;
00602 
00603     Length = (SHORT)strlen(buffer);
00604     if (Length > len - 1)
00605         Length = len - 1;
00606 
00607     WriteConsoleOutputCharacterA(
00608         StdOutput,
00609         buffer,
00610         Length,
00611         coPos,
00612         &Written);
00613 
00614     coPos.X += Length;
00615 
00616     if (len > Length)
00617     {
00618         FillConsoleOutputCharacterA(
00619             StdOutput,
00620             ' ',
00621             len - Length,
00622             coPos,
00623             &Written);
00624     }
00625 }
00626 
00627 VOID
00628 CONSOLE_SetStyledText(
00629     IN SHORT x,
00630     IN SHORT y,
00631     IN INT Flags,
00632     IN LPCSTR Text)
00633 {
00634     COORD coPos;
00635     DWORD Length;
00636 
00637     coPos.X = x;
00638     coPos.Y = y;
00639 
00640     Length = (ULONG)strlen(Text);
00641 
00642     if (Flags & TEXT_TYPE_STATUS)
00643     {
00644         coPos.X = x;
00645         coPos.Y = yScreen - 1;
00646     }
00647     else /* TEXT_TYPE_REGULAR (Default) */
00648     {
00649         coPos.X = x;
00650         coPos.Y = y;
00651     }
00652 
00653     if (Flags & TEXT_ALIGN_CENTER)
00654     {
00655         coPos.X = (xScreen - Length) /2; 
00656     }
00657     else if(Flags & TEXT_ALIGN_RIGHT)
00658     {
00659         coPos.X = coPos.X - Length; 
00660 
00661         if (Flags & TEXT_PADDING_SMALL)
00662         {
00663             coPos.X -= 1;
00664         }
00665         else if (Flags & TEXT_PADDING_MEDIUM)
00666         {
00667             coPos.X -= 2; 
00668         }
00669         else if (Flags & TEXT_PADDING_BIG)
00670         {
00671             coPos.X -= 3;
00672         }
00673     }
00674     else /* TEXT_ALIGN_LEFT (Default) */
00675     {
00676         if (Flags & TEXT_PADDING_SMALL)
00677         {
00678             coPos.X += 1;
00679         }
00680         else if (Flags & TEXT_PADDING_MEDIUM)
00681         {
00682             coPos.X += 2; 
00683         }       
00684         else if (Flags & TEXT_PADDING_BIG)
00685         {
00686             coPos.X += 3;
00687         }
00688     }
00689 
00690     if (Flags & TEXT_TYPE_STATUS)
00691     {
00692         CONSOLE_SetStatusTextX(coPos.X, Text);
00693     }
00694     else /* TEXT_TYPE_REGULAR (Default) */
00695     {
00696         if (Flags & TEXT_STYLE_HIGHLIGHT)
00697         {
00698             CONSOLE_SetHighlightedTextXY(coPos.X, coPos.Y, Text);
00699         }
00700         else if (Flags & TEXT_STYLE_UNDERLINE)
00701         {
00702             CONSOLE_SetUnderlinedTextXY(coPos.X, coPos.Y, Text);
00703         }
00704         else /* TEXT_STYLE_NORMAL (Default) */
00705         {
00706             CONSOLE_SetTextXY(coPos.X, coPos.Y, Text);
00707         }
00708     }
00709 }
00710 
00711 
00712 VOID
00713 CONSOLE_ClearStyledText(IN SHORT x,
00714                         IN SHORT y,
00715                         IN INT Flags,
00716                         IN SHORT Length)
00717 {
00718     COORD coPos;
00719 
00720     coPos.X = x;
00721     coPos.Y = y;
00722 
00723     if (Flags & TEXT_TYPE_STATUS)
00724     {
00725         coPos.X = x;
00726         coPos.Y = yScreen - 1;
00727     }
00728     else /* TEXT_TYPE_REGULAR (Default) */
00729     {
00730         coPos.X = x;
00731         coPos.Y = y;
00732     }
00733 
00734     if (Flags & TEXT_ALIGN_CENTER)
00735     {
00736         coPos.X = (xScreen - Length) /2;
00737     }
00738     else if(Flags & TEXT_ALIGN_RIGHT)
00739     {
00740         coPos.X = coPos.X - Length;
00741 
00742         if (Flags & TEXT_PADDING_SMALL)
00743         {
00744             coPos.X -= 1;
00745         }
00746         else if (Flags & TEXT_PADDING_MEDIUM)
00747         {
00748             coPos.X -= 2;
00749         }
00750         else if (Flags & TEXT_PADDING_BIG)
00751         {
00752             coPos.X -= 3;
00753         }
00754     }
00755     else /* TEXT_ALIGN_LEFT (Default) */
00756     {
00757         if (Flags & TEXT_PADDING_SMALL)
00758         {
00759             coPos.X += 1;
00760         }
00761         else if (Flags & TEXT_PADDING_MEDIUM)
00762         {
00763             coPos.X += 2;
00764         }
00765         else if (Flags & TEXT_PADDING_BIG)
00766         {
00767             coPos.X += 3;
00768         }
00769     }
00770 
00771     if (Flags & TEXT_TYPE_STATUS)
00772     {
00773         CONSOLE_ClearStatusTextX(coPos.X, Length);
00774     }
00775     else /* TEXT_TYPE_REGULAR (Default) */
00776     {
00777         CONSOLE_ClearTextXY(coPos.X, coPos.Y, Length);
00778     }
00779 }
00780 
00781 /* EOF */

Generated on Sat May 26 2012 04:16:54 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.