Synchronize with trunk.
[reactos.git] / base / setup / usetup / interface / consup.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2002 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19 /*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: subsys/system/usetup/console.c
23 * PURPOSE: Console support functions
24 * PROGRAMMER: Eric Kohl
25 */
26
27 /* INCLUDES ******************************************************************/
28
29 #include <usetup.h>
30
31 #define NDEBUG
32 #include <debug.h>
33
34 /* GLOBALS ******************************************************************/
35
36 HANDLE StdInput = INVALID_HANDLE_VALUE;
37 HANDLE StdOutput = INVALID_HANDLE_VALUE;
38
39 SHORT xScreen = 0;
40 SHORT yScreen = 0;
41
42 /* FUNCTIONS *****************************************************************/
43
44 BOOLEAN
45 CONSOLE_Init(
46 VOID)
47 {
48 CONSOLE_SCREEN_BUFFER_INFO csbi;
49 if (!HOST_InitConsole())
50 return FALSE;
51
52 StdInput = GetStdHandle(STD_INPUT_HANDLE);
53 StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
54 if (!GetConsoleScreenBufferInfo(StdOutput, &csbi))
55 return FALSE;
56 xScreen = csbi.dwSize.X;
57 yScreen = 50;//csbi.dwSize.Y;
58 return TRUE;
59 }
60
61 VOID
62 CONSOLE_ConInKey(
63 OUT PINPUT_RECORD Buffer)
64 {
65 DWORD Read;
66
67 while (TRUE)
68 {
69 ReadConsoleInput(StdInput, Buffer, 1, &Read);
70
71 if ((Buffer->EventType == KEY_EVENT)
72 && (Buffer->Event.KeyEvent.bKeyDown == TRUE))
73 break;
74 }
75 }
76
77 VOID
78 CONSOLE_ConOutChar(
79 IN CHAR c)
80 {
81 DWORD Written;
82
83 WriteConsole(
84 StdOutput,
85 &c,
86 1,
87 &Written,
88 NULL);
89 }
90
91 VOID
92 CONSOLE_ConOutPuts(
93 IN LPCSTR szText)
94 {
95 DWORD Written;
96
97 WriteConsole(
98 StdOutput,
99 szText,
100 (ULONG)strlen(szText),
101 &Written,
102 NULL);
103 WriteConsole(
104 StdOutput,
105 "\n",
106 1,
107 &Written,
108 NULL);
109 }
110
111 VOID
112 CONSOLE_ConOutPrintf(
113 IN LPCSTR szFormat, ...)
114 {
115 CHAR szOut[256];
116 DWORD dwWritten;
117 va_list arg_ptr;
118
119 va_start(arg_ptr, szFormat);
120 vsprintf(szOut, szFormat, arg_ptr);
121 va_end(arg_ptr);
122
123 WriteConsole(
124 StdOutput,
125 szOut,
126 (ULONG)strlen(szOut),
127 &dwWritten,
128 NULL);
129 }
130
131 BOOL
132 CONSOLE_Flush(VOID)
133 {
134 return FlushConsoleInputBuffer(StdInput);
135 }
136
137 SHORT
138 CONSOLE_GetCursorX(VOID)
139 {
140 CONSOLE_SCREEN_BUFFER_INFO csbi;
141
142 GetConsoleScreenBufferInfo(StdOutput, &csbi);
143
144 return csbi.dwCursorPosition.X;
145 }
146
147 SHORT
148 CONSOLE_GetCursorY(VOID)
149 {
150 CONSOLE_SCREEN_BUFFER_INFO csbi;
151
152 GetConsoleScreenBufferInfo(StdOutput, &csbi);
153
154 return csbi.dwCursorPosition.Y;
155 }
156
157 VOID
158 CONSOLE_SetCursorType(
159 IN BOOL bInsert,
160 IN BOOL bVisible)
161 {
162 CONSOLE_CURSOR_INFO cci;
163
164 cci.dwSize = bInsert ? 10 : 99;
165 cci.bVisible = bVisible;
166
167 SetConsoleCursorInfo(StdOutput, &cci);
168 }
169
170 VOID
171 CONSOLE_SetCursorXY(
172 IN SHORT x,
173 IN SHORT y)
174 {
175 COORD coPos;
176
177 coPos.X = x;
178 coPos.Y = y;
179 SetConsoleCursorPosition(StdOutput, coPos);
180 }
181
182 VOID
183 CONSOLE_ClearScreen(VOID)
184 {
185 COORD coPos;
186 DWORD Written;
187
188 coPos.X = 0;
189 coPos.Y = 0;
190
191 FillConsoleOutputAttribute(
192 StdOutput,
193 FOREGROUND_WHITE | BACKGROUND_BLUE,
194 xScreen * yScreen,
195 coPos,
196 &Written);
197
198 FillConsoleOutputCharacterA(
199 StdOutput,
200 ' ',
201 xScreen * yScreen,
202 coPos,
203 &Written);
204 }
205
206 VOID
207 CONSOLE_InvertTextXY(
208 IN SHORT x,
209 IN SHORT y,
210 IN SHORT col,
211 IN SHORT row)
212 {
213 COORD coPos;
214 DWORD Written;
215
216 for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
217 {
218 coPos.X = x;
219
220 FillConsoleOutputAttribute(
221 StdOutput,
222 FOREGROUND_BLUE | BACKGROUND_WHITE,
223 col,
224 coPos,
225 &Written);
226 }
227 }
228
229 VOID
230 CONSOLE_NormalTextXY(
231 IN SHORT x,
232 IN SHORT y,
233 IN SHORT col,
234 IN SHORT row)
235 {
236 COORD coPos;
237 DWORD Written;
238
239 for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
240 {
241 coPos.X = x;
242
243 FillConsoleOutputAttribute(
244 StdOutput,
245 FOREGROUND_WHITE | BACKGROUND_BLUE,
246 col,
247 coPos,
248 &Written);
249 }
250 }
251
252 VOID
253 CONSOLE_SetTextXY(
254 IN SHORT x,
255 IN SHORT y,
256 IN LPCSTR Text)
257 {
258 COORD coPos;
259 DWORD Written;
260
261 coPos.X = x;
262 coPos.Y = y;
263
264 WriteConsoleOutputCharacterA(
265 StdOutput,
266 Text,
267 (ULONG)strlen(Text),
268 coPos,
269 &Written);
270 }
271
272 static
273 VOID
274 CONSOLE_ClearTextXY(IN SHORT x,
275 IN SHORT y,
276 IN SHORT Length)
277 {
278 COORD coPos;
279 DWORD Written;
280
281 coPos.X = x;
282 coPos.Y = y;
283
284 FillConsoleOutputCharacterA(StdOutput,
285 ' ',
286 Length,
287 coPos,
288 &Written);
289 }
290
291 VOID
292 CONSOLE_SetInputTextXY(
293 IN SHORT x,
294 IN SHORT y,
295 IN SHORT len,
296 IN LPCWSTR Text)
297 {
298 COORD coPos;
299 SHORT Length;
300 DWORD Written;
301
302 coPos.X = x;
303 coPos.Y = y;
304
305 Length = (SHORT)wcslen(Text);
306 if (Length > len - 1)
307 Length = len - 1;
308
309 FillConsoleOutputAttribute(
310 StdOutput,
311 BACKGROUND_WHITE,
312 len,
313 coPos,
314 &Written);
315
316 WriteConsoleOutputCharacterW(
317 StdOutput,
318 Text,
319 (ULONG)Length,
320 coPos,
321 &Written);
322
323 coPos.X += Length;
324 FillConsoleOutputCharacterA(
325 StdOutput,
326 '_',
327 1,
328 coPos,
329 &Written);
330
331 if (len > Length + 1)
332 {
333 coPos.X++;
334 FillConsoleOutputCharacterA(
335 StdOutput,
336 ' ',
337 len - Length - 1,
338 coPos,
339 &Written);
340 }
341 }
342
343 VOID
344 CONSOLE_SetUnderlinedTextXY(
345 IN SHORT x,
346 IN SHORT y,
347 IN LPCSTR Text)
348 {
349 COORD coPos;
350 DWORD Length;
351 DWORD Written;
352
353 coPos.X = x;
354 coPos.Y = y;
355
356 Length = (ULONG)strlen(Text);
357
358 WriteConsoleOutputCharacterA(
359 StdOutput,
360 Text,
361 Length,
362 coPos,
363 &Written);
364
365 coPos.Y++;
366 FillConsoleOutputCharacterA(
367 StdOutput,
368 0xCD,
369 Length,
370 coPos,
371 &Written);
372 }
373
374 VOID
375 CONSOLE_SetStatusText(
376 IN LPCSTR fmt, ...)
377 {
378 CHAR Buffer[128];
379 va_list ap;
380 COORD coPos;
381 DWORD Written;
382
383 va_start(ap, fmt);
384 vsprintf(Buffer, fmt, ap);
385 va_end(ap);
386
387 coPos.X = 0;
388 coPos.Y = yScreen - 1;
389
390 FillConsoleOutputAttribute(
391 StdOutput,
392 BACKGROUND_WHITE,
393 xScreen,
394 coPos,
395 &Written);
396
397 FillConsoleOutputCharacterA(
398 StdOutput,
399 ' ',
400 xScreen,
401 coPos,
402 &Written);
403
404 WriteConsoleOutputCharacterA(
405 StdOutput,
406 Buffer,
407 (ULONG)strlen(Buffer),
408 coPos,
409 &Written);
410 }
411
412 VOID
413 CONSOLE_SetStatusTextX(
414 IN SHORT x,
415 IN LPCSTR fmt, ...)
416 {
417 CHAR Buffer[128];
418 va_list ap;
419 COORD coPos;
420 DWORD Written;
421
422 va_start(ap, fmt);
423 vsprintf(Buffer, fmt, ap);
424 va_end(ap);
425
426 coPos.X = 0;
427 coPos.Y = yScreen - 1;
428
429 FillConsoleOutputAttribute(
430 StdOutput,
431 BACKGROUND_WHITE,
432 xScreen,
433 coPos,
434 &Written);
435
436 FillConsoleOutputCharacterA(
437 StdOutput,
438 ' ',
439 xScreen,
440 coPos,
441 &Written);
442
443 coPos.X = x;
444
445 WriteConsoleOutputCharacterA(
446 StdOutput,
447 Buffer,
448 (ULONG)strlen(Buffer),
449 coPos,
450 &Written);
451 }
452
453 static
454 VOID
455 CONSOLE_ClearStatusTextX(IN SHORT x,
456 IN SHORT Length)
457 {
458 COORD coPos;
459 DWORD Written;
460
461 coPos.X = x;
462 coPos.Y = yScreen - 1;
463
464 FillConsoleOutputCharacterA(StdOutput,
465 ' ',
466 Length,
467 coPos,
468 &Written);
469 }
470
471
472 VOID
473 CONSOLE_SetStatusTextAutoFitX(
474 IN SHORT x,
475 IN LPCSTR fmt, ...)
476 {
477 CHAR Buffer[128];
478 DWORD Length;
479 va_list ap;
480
481 va_start(ap, fmt);
482 vsprintf(Buffer, fmt, ap);
483 va_end(ap);
484
485 Length = (ULONG)strlen(Buffer);
486
487 if (Length + x <= 79)
488 {
489 CONSOLE_SetStatusTextX (x , Buffer);
490 }
491 else
492 {
493 CONSOLE_SetStatusTextX (79 - Length , Buffer);
494 }
495 }
496
497 VOID
498 CONSOLE_SetInvertedTextXY(
499 IN SHORT x,
500 IN SHORT y,
501 IN LPCSTR Text)
502 {
503 COORD coPos;
504 DWORD Length;
505 DWORD Written;
506
507 coPos.X = x;
508 coPos.Y = y;
509
510 Length = (ULONG)strlen(Text);
511
512 FillConsoleOutputAttribute(
513 StdOutput,
514 FOREGROUND_BLUE | BACKGROUND_WHITE,
515 Length,
516 coPos,
517 &Written);
518
519 WriteConsoleOutputCharacterA(
520 StdOutput,
521 Text,
522 Length,
523 coPos,
524 &Written);
525 }
526
527 VOID
528 CONSOLE_SetHighlightedTextXY(
529 IN SHORT x,
530 IN SHORT y,
531 IN LPCSTR Text)
532 {
533 COORD coPos;
534 DWORD Length;
535 DWORD Written;
536
537 coPos.X = x;
538 coPos.Y = y;
539
540 Length = (ULONG)strlen(Text);
541
542 FillConsoleOutputAttribute(
543 StdOutput,
544 FOREGROUND_WHITE | FOREGROUND_INTENSITY | BACKGROUND_BLUE,
545 Length,
546 coPos,
547 &Written);
548
549 WriteConsoleOutputCharacterA(
550 StdOutput,
551 Text,
552 Length,
553 coPos,
554 &Written);
555 }
556
557 VOID
558 CONSOLE_PrintTextXY(
559 IN SHORT x,
560 IN SHORT y,
561 IN LPCSTR fmt, ...)
562 {
563 CHAR buffer[512];
564 va_list ap;
565 COORD coPos;
566 DWORD Written;
567
568 va_start(ap, fmt);
569 vsprintf(buffer, fmt, ap);
570 va_end(ap);
571
572 coPos.X = x;
573 coPos.Y = y;
574
575 WriteConsoleOutputCharacterA(
576 StdOutput,
577 buffer,
578 (ULONG)strlen(buffer),
579 coPos,
580 &Written);
581 }
582
583 VOID
584 CONSOLE_PrintTextXYN(
585 IN SHORT x,
586 IN SHORT y,
587 IN SHORT len,
588 IN LPCSTR fmt, ...)
589 {
590 CHAR buffer[512];
591 va_list ap;
592 COORD coPos;
593 SHORT Length;
594 DWORD Written;
595
596 va_start(ap, fmt);
597 vsprintf(buffer, fmt, ap);
598 va_end(ap);
599
600 coPos.X = x;
601 coPos.Y = y;
602
603 Length = (SHORT)strlen(buffer);
604 if (Length > len - 1)
605 Length = len - 1;
606
607 WriteConsoleOutputCharacterA(
608 StdOutput,
609 buffer,
610 Length,
611 coPos,
612 &Written);
613
614 coPos.X += Length;
615
616 if (len > Length)
617 {
618 FillConsoleOutputCharacterA(
619 StdOutput,
620 ' ',
621 len - Length,
622 coPos,
623 &Written);
624 }
625 }
626
627 VOID
628 CONSOLE_SetStyledText(
629 IN SHORT x,
630 IN SHORT y,
631 IN INT Flags,
632 IN LPCSTR Text)
633 {
634 COORD coPos;
635 DWORD Length;
636
637 coPos.X = x;
638 coPos.Y = y;
639
640 Length = (ULONG)strlen(Text);
641
642 if (Flags & TEXT_TYPE_STATUS)
643 {
644 coPos.X = x;
645 coPos.Y = yScreen - 1;
646 }
647 else /* TEXT_TYPE_REGULAR (Default) */
648 {
649 coPos.X = x;
650 coPos.Y = y;
651 }
652
653 if (Flags & TEXT_ALIGN_CENTER)
654 {
655 coPos.X = (xScreen - Length) /2;
656 }
657 else if(Flags & TEXT_ALIGN_RIGHT)
658 {
659 coPos.X = coPos.X - Length;
660
661 if (Flags & TEXT_PADDING_SMALL)
662 {
663 coPos.X -= 1;
664 }
665 else if (Flags & TEXT_PADDING_MEDIUM)
666 {
667 coPos.X -= 2;
668 }
669 else if (Flags & TEXT_PADDING_BIG)
670 {
671 coPos.X -= 3;
672 }
673 }
674 else /* TEXT_ALIGN_LEFT (Default) */
675 {
676 if (Flags & TEXT_PADDING_SMALL)
677 {
678 coPos.X += 1;
679 }
680 else if (Flags & TEXT_PADDING_MEDIUM)
681 {
682 coPos.X += 2;
683 }
684 else if (Flags & TEXT_PADDING_BIG)
685 {
686 coPos.X += 3;
687 }
688 }
689
690 if (Flags & TEXT_TYPE_STATUS)
691 {
692 CONSOLE_SetStatusTextX(coPos.X, Text);
693 }
694 else /* TEXT_TYPE_REGULAR (Default) */
695 {
696 if (Flags & TEXT_STYLE_HIGHLIGHT)
697 {
698 CONSOLE_SetHighlightedTextXY(coPos.X, coPos.Y, Text);
699 }
700 else if (Flags & TEXT_STYLE_UNDERLINE)
701 {
702 CONSOLE_SetUnderlinedTextXY(coPos.X, coPos.Y, Text);
703 }
704 else /* TEXT_STYLE_NORMAL (Default) */
705 {
706 CONSOLE_SetTextXY(coPos.X, coPos.Y, Text);
707 }
708 }
709 }
710
711
712 VOID
713 CONSOLE_ClearStyledText(IN SHORT x,
714 IN SHORT y,
715 IN INT Flags,
716 IN SHORT Length)
717 {
718 COORD coPos;
719
720 coPos.X = x;
721 coPos.Y = y;
722
723 if (Flags & TEXT_TYPE_STATUS)
724 {
725 coPos.X = x;
726 coPos.Y = yScreen - 1;
727 }
728 else /* TEXT_TYPE_REGULAR (Default) */
729 {
730 coPos.X = x;
731 coPos.Y = y;
732 }
733
734 if (Flags & TEXT_ALIGN_CENTER)
735 {
736 coPos.X = (xScreen - Length) /2;
737 }
738 else if(Flags & TEXT_ALIGN_RIGHT)
739 {
740 coPos.X = coPos.X - Length;
741
742 if (Flags & TEXT_PADDING_SMALL)
743 {
744 coPos.X -= 1;
745 }
746 else if (Flags & TEXT_PADDING_MEDIUM)
747 {
748 coPos.X -= 2;
749 }
750 else if (Flags & TEXT_PADDING_BIG)
751 {
752 coPos.X -= 3;
753 }
754 }
755 else /* TEXT_ALIGN_LEFT (Default) */
756 {
757 if (Flags & TEXT_PADDING_SMALL)
758 {
759 coPos.X += 1;
760 }
761 else if (Flags & TEXT_PADDING_MEDIUM)
762 {
763 coPos.X += 2;
764 }
765 else if (Flags & TEXT_PADDING_BIG)
766 {
767 coPos.X += 3;
768 }
769 }
770
771 if (Flags & TEXT_TYPE_STATUS)
772 {
773 CONSOLE_ClearStatusTextX(coPos.X, Length);
774 }
775 else /* TEXT_TYPE_REGULAR (Default) */
776 {
777 CONSOLE_ClearTextXY(coPos.X, coPos.Y, Length);
778 }
779 }
780
781 /* EOF */