Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenconsup.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
1.7.6.1
|