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.
31 UnixSimpleTextOutScrollScreen (
32 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
37 UnixSimpleTextOutPutChar (
38 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
44 UnixSimpleTextOutSetAttribute (
45 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
50 UnixSimpleTextOutSetMode (
51 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
56 // Modeule Global for Simple Text Out Mode.
58 #define MAX_SIMPLE_TEXT_OUT_MODE \
59 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))
61 UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes
[] = {
73 UnixSimpleTextOutReset (
74 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
75 IN BOOLEAN ExtendedVerification
81 TODO: Add function description
85 This - TODO: add argument description
86 ExtendedVerification - TODO: add argument description
90 EFI_SUCCESS - TODO: Add description for return value
94 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
96 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
98 UnixSimpleTextOutSetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BACKGROUND_BLACK
));
100 UnixSimpleTextOutSetMode (This
, 0);
106 UnixSimpleTextOutOutputString (
107 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
114 TODO: Add function description
118 This - TODO: add argument description
119 String - TODO: add argument description
123 EFI_SUCCESS - TODO: Add description for return value
127 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
130 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
132 for (Str
= String
; *Str
!= '\0'; Str
++) {
136 if (Private
->Position
.Y
== (Private
->MaxScreenSize
.Y
- 1)) {
137 UnixSimpleTextOutScrollScreen (Private
);
140 if (Private
->Position
.Y
< (Private
->MaxScreenSize
.Y
- 1)) {
141 Private
->Position
.Y
++;
142 This
->Mode
->CursorRow
++;
147 Private
->Position
.X
= 0;
148 This
->Mode
->CursorColumn
= 0;
152 if (Private
->Position
.X
> 0) {
153 Private
->Position
.X
--;
154 This
->Mode
->CursorColumn
--;
160 UnixSimpleTextOutPutChar (Private
, *Str
);
168 UnixSimpleTextOutPutChar (
169 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
176 TODO: Add function description
180 Console - TODO: add argument description
181 Char - TODO: add argument description
185 TODO: add return values
190 Console
->UnixThunk
->Write (1, &c
, 1);
195 UnixSimpleTextOutScrollScreen (
196 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
202 TODO: Add function description
206 Console - TODO: add argument description
210 TODO: add return values
220 UnixSimpleTextOutTestString (
221 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
228 TODO: Add function description
232 This - TODO: add argument description
233 String - TODO: add argument description
237 EFI_SUCCESS - TODO: Add description for return value
241 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
243 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
246 // BugBug: The correct answer would be a function of what code pages
247 // are currently loaded? For now we will just return success.
254 UnixSimpleTextOutQueryMode (
255 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
264 TODO: Add function description
268 This - TODO: add argument description
269 ModeNumber - TODO: add argument description
270 Columns - TODO: add argument description
271 Rows - TODO: add argument description
275 EFI_INVALID_PARAMETER - TODO: Add description for return value
276 EFI_SUCCESS - TODO: Add description for return value
280 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
282 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
284 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
285 return EFI_INVALID_PARAMETER
;
288 *Columns
= mUnixSimpleTextOutSupportedModes
[ModeNumber
].ColumnsX
;
289 *Rows
= mUnixSimpleTextOutSupportedModes
[ModeNumber
].RowsY
;
296 UnixSimpleTextOutSetMode (
297 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
304 TODO: Add function description
308 This - TODO: add argument description
309 ModeNumber - TODO: add argument description
313 EFI_INVALID_PARAMETER - TODO: Add description for return value
314 EFI_SUCCESS - TODO: Add description for return value
318 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
320 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
322 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
323 return EFI_INVALID_PARAMETER
;
327 This
->Mode
->Mode
= (INT32
) ModeNumber
;
329 This
->EnableCursor (This
, TRUE
);
330 This
->ClearScreen (This
);
336 UnixSimpleTextOutSetAttribute (
337 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
344 TODO: Add function description
348 This - TODO: add argument description
349 Attribute - TODO: add argument description
353 EFI_SUCCESS - TODO: Add description for return value
357 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
359 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
362 Private
->Attribute
= (WORD
) Attribute
;
364 This
->Mode
->Attribute
= (INT32
) Attribute
;
371 UnixSimpleTextOutClearScreen (
372 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
378 TODO: Add function description
382 This - TODO: add argument description
386 EFI_SUCCESS - TODO: Add description for return value
390 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
391 // DWORD ConsoleWindow;
393 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
395 This
->SetCursorPosition (This
, 0, 0);
396 Private
->UnixThunk
->Write (1, "\e[2J", 4);
400 Private
->UnixThunk
->FillConsoleOutputCharacter (
401 Private
->NtOutHandle
,
403 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
407 Private
->UnixThunk
->FillConsoleOutputAttribute (
408 Private
->NtOutHandle
,
410 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
421 UnixSimpleTextOutSetCursorPosition (
422 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
430 TODO: Add function description
434 This - TODO: add argument description
435 Column - TODO: add argument description
436 Row - TODO: add argument description
440 EFI_SUCCESS - TODO: Add description for return value
445 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
447 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
450 Private
->Position
.X
= (WORD
) Column
;
452 This
->Mode
->CursorColumn
= (INT32
) Column
;
455 Private
->Position
.Y
= (WORD
) Row
;
457 This
->Mode
->CursorRow
= (INT32
) Row
;
459 Private
->UnixThunk
->SetConsoleCursorPosition (Private
->NtOutHandle
, Private
->Possition
);
464 buf
[2] = '0' + ((Row
/ 100) % 10);
465 buf
[3] = '0' + ((Row
/ 10) % 10);
466 buf
[4] = '0' + ((Row
/ 1) % 10);
468 buf
[6] = '0' + ((Column
/ 100) % 10);
469 buf
[7] = '0' + ((Column
/ 10) % 10);
470 buf
[8] = '0' + ((Column
/ 1) % 10);
472 Private
->UnixThunk
->Write (1, buf
, 10);
479 UnixSimpleTextOutEnableCursor (
480 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
487 TODO: Add function description
491 This - TODO: add argument description
492 Enable - TODO: add argument description
496 EFI_SUCCESS - TODO: Add description for return value
500 UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
502 CONSOLE_CURSOR_INFO Info
;
505 Private
= UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
506 Private
->CursorEnable
= Enable
;
507 This
->Mode
->CursorVisible
= Enable
;
510 Private
->UnixThunk
->GetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
511 Info
.bVisible
= Enable
;
512 Private
->UnixThunk
->SetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
519 UnixSimpleTextOutOpenWindow (
520 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Private
526 TODO: Add function description
530 Private - TODO: add argument description
534 TODO: add return values
538 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*SimpleTextOut
;
541 //WindowName = Private->UnixIo->EnvString;
543 Private
->Attribute
= FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
| FOREGROUND_INTENSITY
;
544 if (*WindowName
== '?') {
545 Private
->Attribute
= BACKGROUND_RED
| FOREGROUND_INTENSITY
| FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
;
546 WindowName
= L
"EFI Emulator Error Console";
549 WindowName
= L
"EFI Emulator Error Console";
553 gUnixConsoleComponentName
.SupportedLanguages
,
554 &Private
->ControllerNameTable
,
559 // Fill in protocol member functions
561 SimpleTextOut
= &Private
->SimpleTextOut
;
562 SimpleTextOut
->Reset
= UnixSimpleTextOutReset
;
563 SimpleTextOut
->OutputString
= UnixSimpleTextOutOutputString
;
564 SimpleTextOut
->TestString
= UnixSimpleTextOutTestString
;
565 SimpleTextOut
->QueryMode
= UnixSimpleTextOutQueryMode
;
566 SimpleTextOut
->SetMode
= UnixSimpleTextOutSetMode
;
567 SimpleTextOut
->SetAttribute
= UnixSimpleTextOutSetAttribute
;
568 SimpleTextOut
->ClearScreen
= UnixSimpleTextOutClearScreen
;
569 SimpleTextOut
->SetCursorPosition
= UnixSimpleTextOutSetCursorPosition
;
570 SimpleTextOut
->EnableCursor
= UnixSimpleTextOutEnableCursor
;
573 // Initialize SimpleTextOut protocol mode structure
575 SimpleTextOut
->Mode
= &Private
->SimpleTextOutMode
;
576 SimpleTextOut
->Mode
->MaxMode
= MAX_SIMPLE_TEXT_OUT_MODE
;
577 SimpleTextOut
->Mode
->Attribute
= 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
581 // Open the window an initialize it!
583 Private
->NtOutHandle
= Private
->UnixThunk
->CreateConsoleScreenBuffer (
584 GENERIC_WRITE
| GENERIC_READ
,
585 FILE_SHARE_WRITE
| FILE_SHARE_READ
,
587 CONSOLE_TEXTMODE_BUFFER
,
590 Private
->UnixThunk
->SetConsoleTitle (WindowName
);
593 return SimpleTextOut
->SetMode (SimpleTextOut
, 0);
597 UnixSimpleTextOutCloseWindow (
598 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA
*Console
604 TODO: Add function description
608 Console - TODO: add argument description
612 EFI_SUCCESS - TODO: Add description for return value
617 Console
->UnixThunk
->CloseHandle (Console
->NtOutHandle
);