3 Copyright (c) 2004, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Console based on Posix APIs.
20 This file creates an Posix window and attaches a SimpleTextOut protocol.
26 // Private worker functions.
32 UnixSimpleTextOutScrollScreen (
33 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
39 UnixSimpleTextOutPutChar (
40 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
47 UnixSimpleTextOutSetAttribute (
48 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
54 UnixSimpleTextOutSetMode (
55 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
60 // Modeule Global for Simple Text Out Mode.
62 #define MAX_SIMPLE_TEXT_OUT_MODE \
63 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))
65 STATIC UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes
[] = {
78 UnixSimpleTextOutReset (
79 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
80 IN BOOLEAN ExtendedVerification
86 TODO: Add function description
90 This - TODO: add argument description
91 ExtendedVerification - TODO: add argument description
95 EFI_SUCCESS - TODO: Add description for return value
99 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
101 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
103 UnixSimpleTextOutSetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BACKGROUND_BLACK
));
105 UnixSimpleTextOutSetMode (This
, 0);
112 UnixSimpleTextOutOutputString (
113 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
120 TODO: Add function description
124 This - TODO: add argument description
125 String - TODO: add argument description
129 EFI_SUCCESS - TODO: Add description for return value
133 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
136 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
138 for (Str
= String
; *Str
!= '\0'; Str
++) {
142 if (Private
->Position
.Y
== (Private
->MaxScreenSize
.Y
- 1)) {
143 UnixSimpleTextOutScrollScreen (Private
);
146 if (Private
->Position
.Y
< (Private
->MaxScreenSize
.Y
- 1)) {
147 Private
->Position
.Y
++;
148 This
->Mode
->CursorRow
++;
153 Private
->Position
.X
= 0;
154 This
->Mode
->CursorColumn
= 0;
158 if (Private
->Position
.X
> 0) {
159 Private
->Position
.X
--;
160 This
->Mode
->CursorColumn
--;
166 UnixSimpleTextOutPutChar (Private
, *Str
);
175 UnixSimpleTextOutPutChar (
176 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
183 TODO: Add function description
187 Console - TODO: add argument description
188 Char - TODO: add argument description
192 TODO: add return values
197 Console
->UnixThunk
->Write (1, &c
, 1);
203 UnixSimpleTextOutScrollScreen (
204 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
210 TODO: Add function description
214 Console - TODO: add argument description
218 TODO: add return values
229 UnixSimpleTextOutTestString (
230 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
237 TODO: Add function description
241 This - TODO: add argument description
242 String - TODO: add argument description
246 EFI_SUCCESS - TODO: Add description for return value
250 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
252 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
255 // BugBug: The correct answer would be a function of what code pages
256 // are currently loaded? For now we will just return success.
264 UnixSimpleTextOutQueryMode (
265 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
274 TODO: Add function description
278 This - TODO: add argument description
279 ModeNumber - TODO: add argument description
280 Columns - TODO: add argument description
281 Rows - TODO: add argument description
285 EFI_INVALID_PARAMETER - TODO: Add description for return value
286 EFI_SUCCESS - TODO: Add description for return value
290 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
292 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
294 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
295 return EFI_INVALID_PARAMETER
;
298 *Columns
= mUnixSimpleTextOutSupportedModes
[ModeNumber
].ColumnsX
;
299 *Rows
= mUnixSimpleTextOutSupportedModes
[ModeNumber
].RowsY
;
307 UnixSimpleTextOutSetMode (
308 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
315 TODO: Add function description
319 This - TODO: add argument description
320 ModeNumber - TODO: add argument description
324 EFI_INVALID_PARAMETER - TODO: Add description for return value
325 EFI_SUCCESS - TODO: Add description for return value
329 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
331 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
333 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
334 return EFI_INVALID_PARAMETER
;
338 This
->Mode
->Mode
= (INT32
) ModeNumber
;
340 This
->EnableCursor (This
, TRUE
);
341 This
->ClearScreen (This
);
348 UnixSimpleTextOutSetAttribute (
349 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
356 TODO: Add function description
360 This - TODO: add argument description
361 Attribute - TODO: add argument description
365 EFI_SUCCESS - TODO: Add description for return value
369 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
371 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
374 Private
->Attribute
= (WORD
) Attribute
;
376 This
->Mode
->Attribute
= (INT32
) Attribute
;
384 UnixSimpleTextOutClearScreen (
385 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
391 TODO: Add function description
395 This - TODO: add argument description
399 EFI_SUCCESS - TODO: Add description for return value
403 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
404 // DWORD ConsoleWindow;
406 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
408 This
->SetCursorPosition (This
, 0, 0);
409 Private
->UnixThunk
->Write (1, "\e[2J", 4);
413 Private
->UnixThunk
->FillConsoleOutputCharacter (
414 Private
->NtOutHandle
,
416 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
420 Private
->UnixThunk
->FillConsoleOutputAttribute (
421 Private
->NtOutHandle
,
423 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
435 UnixSimpleTextOutSetCursorPosition (
436 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
444 TODO: Add function description
448 This - TODO: add argument description
449 Column - TODO: add argument description
450 Row - TODO: add argument description
454 EFI_SUCCESS - TODO: Add description for return value
459 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
461 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
464 Private
->Position
.X
= (WORD
) Column
;
466 This
->Mode
->CursorColumn
= (INT32
) Column
;
469 Private
->Position
.Y
= (WORD
) Row
;
471 This
->Mode
->CursorRow
= (INT32
) Row
;
473 Private
->UnixThunk
->SetConsoleCursorPosition (Private
->NtOutHandle
, Private
->Possition
);
478 buf
[2] = '0' + ((Row
/ 100) % 10);
479 buf
[3] = '0' + ((Row
/ 10) % 10);
480 buf
[4] = '0' + ((Row
/ 1) % 10);
482 buf
[6] = '0' + ((Column
/ 100) % 10);
483 buf
[7] = '0' + ((Column
/ 10) % 10);
484 buf
[8] = '0' + ((Column
/ 1) % 10);
486 Private
->UnixThunk
->Write (1, buf
, 10);
494 UnixSimpleTextOutEnableCursor (
495 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
502 TODO: Add function description
506 This - TODO: add argument description
507 Enable - TODO: add argument description
511 EFI_SUCCESS - TODO: Add description for return value
515 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
517 CONSOLE_CURSOR_INFO Info
;
520 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
521 Private
->CursorEnable
= Enable
;
522 This
->Mode
->CursorVisible
= Enable
;
525 Private
->UnixThunk
->GetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
526 Info
.bVisible
= Enable
;
527 Private
->UnixThunk
->SetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
534 UnixSimpleTextOutOpenWindow (
535 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
541 TODO: Add function description
545 Private - TODO: add argument description
549 TODO: add return values
553 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*SimpleTextOut
;
556 //WindowName = Private->UnixIo->EnvString;
558 Private
->Attribute
= FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
| FOREGROUND_INTENSITY
;
559 if (*WindowName
== '?') {
560 Private
->Attribute
= BACKGROUND_RED
| FOREGROUND_INTENSITY
| FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
;
561 WindowName
= L
"EFI Emulator Error Console";
564 WindowName
= L
"EFI Emulator Error Console";
568 gUnixConsoleComponentName
.SupportedLanguages
,
569 &Private
->ControllerNameTable
,
574 // Fill in protocol member functions
576 SimpleTextOut
= &Private
->SimpleTextOut
;
577 SimpleTextOut
->Reset
= UnixSimpleTextOutReset
;
578 SimpleTextOut
->OutputString
= UnixSimpleTextOutOutputString
;
579 SimpleTextOut
->TestString
= UnixSimpleTextOutTestString
;
580 SimpleTextOut
->QueryMode
= UnixSimpleTextOutQueryMode
;
581 SimpleTextOut
->SetMode
= UnixSimpleTextOutSetMode
;
582 SimpleTextOut
->SetAttribute
= UnixSimpleTextOutSetAttribute
;
583 SimpleTextOut
->ClearScreen
= UnixSimpleTextOutClearScreen
;
584 SimpleTextOut
->SetCursorPosition
= UnixSimpleTextOutSetCursorPosition
;
585 SimpleTextOut
->EnableCursor
= UnixSimpleTextOutEnableCursor
;
588 // Initialize SimpleTextOut protocol mode structure
590 SimpleTextOut
->Mode
= &Private
->SimpleTextOutMode
;
591 SimpleTextOut
->Mode
->MaxMode
= MAX_SIMPLE_TEXT_OUT_MODE
;
592 SimpleTextOut
->Mode
->Attribute
= 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
596 // Open the window an initialize it!
598 Private
->NtOutHandle
= Private
->UnixThunk
->CreateConsoleScreenBuffer (
599 GENERIC_WRITE
| GENERIC_READ
,
600 FILE_SHARE_WRITE
| FILE_SHARE_READ
,
602 CONSOLE_TEXTMODE_BUFFER
,
605 Private
->UnixThunk
->SetConsoleTitle (WindowName
);
608 return SimpleTextOut
->SetMode (SimpleTextOut
, 0);
612 UnixSimpleTextOutCloseWindow (
613 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
619 TODO: Add function description
623 Console - TODO: add argument description
627 EFI_SUCCESS - TODO: Add description for return value
632 Console
->UnixThunk
->CloseHandle (Console
->NtOutHandle
);