]> git.proxmox.com Git - mirror_edk2.git/blame - UnixPkg/UnixConsoleDxe/ConsoleOut.c
Integrate patch from Andrew Fish to make it run on OS X.
[mirror_edk2.git] / UnixPkg / UnixConsoleDxe / ConsoleOut.c
CommitLineData
804405e7 1/*++\r
2\r
3Copyright (c) 2004, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 ConsoleOut.c\r
15\r
16Abstract:\r
17\r
18 Console based on Posix APIs. \r
19\r
20 This file creates an Posix window and attaches a SimpleTextOut protocol.\r
21\r
22--*/\r
23\r
24#include "Console.h"\r
25//\r
26// Private worker functions.\r
27//\r
28\r
ccd55824 29#if 0\r
804405e7 30VOID\r
31UnixSimpleTextOutScrollScreen (\r
32 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
33 );\r
34\r
ccd55824 35#endif\r
804405e7 36VOID\r
37UnixSimpleTextOutPutChar (\r
38 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
39 IN CHAR16 Char\r
40 );\r
41\r
804405e7 42EFI_STATUS\r
43EFIAPI\r
44UnixSimpleTextOutSetAttribute (\r
45 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
46 IN UINTN Attribute\r
47 );\r
804405e7 48EFI_STATUS\r
49EFIAPI\r
50UnixSimpleTextOutSetMode (\r
51 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
52 IN UINTN ModeNumber\r
53 );\r
ccd55824 54\r
804405e7 55//\r
56// Modeule Global for Simple Text Out Mode.\r
57//\r
58#define MAX_SIMPLE_TEXT_OUT_MODE \\r
59 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))\r
60\r
7492c63d 61UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {\r
804405e7 62 { 80, 25 }, \r
ccd55824 63#if 0\r
804405e7 64 { 80, 50 }, \r
65 { 80, 43 }, \r
66 { 100, 100 }, \r
67 { 100, 999 } \r
ccd55824 68#endif\r
804405e7 69};\r
70\r
804405e7 71EFI_STATUS\r
72EFIAPI\r
73UnixSimpleTextOutReset (\r
74 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
75 IN BOOLEAN ExtendedVerification\r
76 )\r
77/*++\r
78\r
79Routine Description:\r
80\r
81 TODO: Add function description\r
82\r
83Arguments:\r
84\r
85 This - TODO: add argument description\r
86 ExtendedVerification - TODO: add argument description\r
87\r
88Returns:\r
89\r
90 EFI_SUCCESS - TODO: Add description for return value\r
91\r
92--*/\r
93{\r
94 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
95\r
96 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
97\r
98 UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
99\r
100 UnixSimpleTextOutSetMode (This, 0);\r
101 return EFI_SUCCESS;\r
102}\r
103\r
804405e7 104EFI_STATUS\r
105EFIAPI\r
106UnixSimpleTextOutOutputString (\r
107 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
108 IN CHAR16 *String\r
109 )\r
110/*++\r
111\r
112Routine Description:\r
113\r
114 TODO: Add function description\r
115\r
116Arguments:\r
117\r
118 This - TODO: add argument description\r
119 String - TODO: add argument description\r
120\r
121Returns:\r
122\r
123 EFI_SUCCESS - TODO: Add description for return value\r
124\r
125--*/\r
126{\r
127 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
128 CHAR16 *Str;\r
129\r
130 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
131\r
132 for (Str = String; *Str != '\0'; Str++) {\r
133 switch (*Str) {\r
ccd55824 134#if 0\r
804405e7 135 case '\n':\r
136 if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) {\r
137 UnixSimpleTextOutScrollScreen (Private);\r
138 }\r
139\r
140 if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) {\r
141 Private->Position.Y++;\r
142 This->Mode->CursorRow++;\r
143 }\r
144 break;\r
145\r
146 case '\r':\r
147 Private->Position.X = 0;\r
148 This->Mode->CursorColumn = 0;\r
149 break;\r
150\r
151 case '\b':\r
152 if (Private->Position.X > 0) {\r
153 Private->Position.X--;\r
154 This->Mode->CursorColumn--;\r
155 }\r
156 break;\r
157\r
ccd55824 158#endif\r
804405e7 159 default:\r
160 UnixSimpleTextOutPutChar (Private, *Str);\r
161 }\r
162 }\r
163\r
164 return EFI_SUCCESS;\r
165}\r
166\r
804405e7 167VOID\r
168UnixSimpleTextOutPutChar (\r
169 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
170 IN CHAR16 Char\r
171 )\r
172/*++\r
173\r
174Routine Description:\r
175\r
176 TODO: Add function description\r
177\r
178Arguments:\r
179\r
180 Console - TODO: add argument description\r
181 Char - TODO: add argument description\r
182\r
183Returns:\r
184\r
185 TODO: add return values\r
186\r
187--*/\r
188{\r
ccd55824 189 char c = Char;\r
190 Console->UnixThunk->Write (1, &c, 1);\r
804405e7 191}\r
192\r
ccd55824 193#if 0\r
804405e7 194VOID\r
195UnixSimpleTextOutScrollScreen (\r
196 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
197 )\r
198/*++\r
199\r
200Routine Description:\r
201\r
202 TODO: Add function description\r
203\r
204Arguments:\r
205\r
206 Console - TODO: add argument description\r
207\r
208Returns:\r
209\r
210 TODO: add return values\r
211\r
212--*/\r
213{\r
214}\r
ccd55824 215#endif\r
216\r
804405e7 217\r
804405e7 218EFI_STATUS\r
219EFIAPI\r
220UnixSimpleTextOutTestString (\r
221 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
222 IN CHAR16 *String\r
223 )\r
224/*++\r
225\r
226Routine Description:\r
227\r
228 TODO: Add function description\r
229\r
230Arguments:\r
231\r
232 This - TODO: add argument description\r
233 String - TODO: add argument description\r
234\r
235Returns:\r
236\r
237 EFI_SUCCESS - TODO: Add description for return value\r
238\r
239--*/\r
240{\r
241 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
242\r
243 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
244\r
245 //\r
246 // BugBug: The correct answer would be a function of what code pages\r
247 // are currently loaded? For now we will just return success.\r
248 //\r
249 return EFI_SUCCESS;\r
250}\r
251\r
804405e7 252EFI_STATUS\r
253EFIAPI\r
254UnixSimpleTextOutQueryMode (\r
255 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
256 IN UINTN ModeNumber,\r
257 OUT UINTN *Columns,\r
258 OUT UINTN *Rows\r
259 )\r
260/*++\r
261\r
262Routine Description:\r
263\r
264 TODO: Add function description\r
265\r
266Arguments:\r
267\r
268 This - TODO: add argument description\r
269 ModeNumber - TODO: add argument description\r
270 Columns - TODO: add argument description\r
271 Rows - TODO: add argument description\r
272\r
273Returns:\r
274\r
275 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
276 EFI_SUCCESS - TODO: Add description for return value\r
277\r
278--*/\r
279{\r
280 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
281\r
282 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
283\r
284 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
285 return EFI_INVALID_PARAMETER;\r
286 }\r
287\r
288 *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
289 *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
290\r
291 return EFI_SUCCESS;\r
292}\r
293\r
804405e7 294EFI_STATUS\r
295EFIAPI\r
296UnixSimpleTextOutSetMode (\r
297 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
298 IN UINTN ModeNumber\r
299 )\r
300/*++\r
301\r
302Routine Description:\r
303\r
304 TODO: Add function description\r
305\r
306Arguments:\r
307\r
308 This - TODO: add argument description\r
309 ModeNumber - TODO: add argument description\r
310\r
311Returns:\r
312\r
313 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
314 EFI_SUCCESS - TODO: Add description for return value\r
315\r
316--*/\r
317{\r
318 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
319\r
320 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
321\r
322 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
323 return EFI_INVALID_PARAMETER;\r
324 }\r
325\r
326\r
327 This->Mode->Mode = (INT32) ModeNumber;\r
328\r
329 This->EnableCursor (This, TRUE);\r
330 This->ClearScreen (This);\r
331 return EFI_SUCCESS;\r
332}\r
333\r
804405e7 334EFI_STATUS\r
335EFIAPI\r
336UnixSimpleTextOutSetAttribute (\r
337 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
338 IN UINTN Attribute\r
339 )\r
340/*++\r
341\r
342Routine Description:\r
343\r
344 TODO: Add function description\r
345\r
346Arguments:\r
347\r
348 This - TODO: add argument description\r
349 Attribute - TODO: add argument description\r
350\r
351Returns:\r
352\r
353 EFI_SUCCESS - TODO: Add description for return value\r
354\r
355--*/\r
356{\r
357 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
358\r
359 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
360\r
ccd55824 361#if 0\r
804405e7 362 Private->Attribute = (WORD) Attribute;\r
ccd55824 363#endif\r
804405e7 364 This->Mode->Attribute = (INT32) Attribute;\r
365\r
366 return EFI_SUCCESS;\r
367}\r
368\r
804405e7 369EFI_STATUS\r
370EFIAPI\r
371UnixSimpleTextOutClearScreen (\r
372 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
373 )\r
374/*++\r
375\r
376Routine Description:\r
377\r
378 TODO: Add function description\r
379\r
380Arguments:\r
381\r
382 This - TODO: add argument description\r
383\r
384Returns:\r
385\r
386 EFI_SUCCESS - TODO: Add description for return value\r
387\r
388--*/\r
389{\r
390 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
391 // DWORD ConsoleWindow;\r
392\r
393 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
394\r
395 This->SetCursorPosition (This, 0, 0);\r
ccd55824 396 Private->UnixThunk->Write (1, "\e[2J", 4);\r
804405e7 397\r
ccd55824 398\r
399#if 0\r
804405e7 400 Private->UnixThunk->FillConsoleOutputCharacter (\r
401 Private->NtOutHandle,\r
402 ' ',\r
403 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
404 Private->Possition,\r
405 &ConsoleWindow\r
406 );\r
407 Private->UnixThunk->FillConsoleOutputAttribute (\r
408 Private->NtOutHandle,\r
409 Private->Attribute,\r
410 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
411 Private->Possition,\r
412 &ConsoleWindow\r
413 );\r
ccd55824 414#endif\r
804405e7 415\r
416 return EFI_SUCCESS;\r
417}\r
418\r
804405e7 419EFI_STATUS\r
420EFIAPI\r
421UnixSimpleTextOutSetCursorPosition (\r
422 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
423 IN UINTN Column,\r
424 IN UINTN Row\r
425 )\r
426/*++\r
427\r
428Routine Description:\r
429\r
430 TODO: Add function description\r
431\r
432Arguments:\r
433\r
434 This - TODO: add argument description\r
435 Column - TODO: add argument description\r
436 Row - TODO: add argument description\r
437\r
438Returns:\r
439\r
440 EFI_SUCCESS - TODO: Add description for return value\r
441\r
442--*/\r
443{\r
ccd55824 444 char buf[12];\r
804405e7 445 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
446\r
447 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
448\r
ccd55824 449#if 0\r
804405e7 450 Private->Position.X = (WORD) Column;\r
ccd55824 451#endif\r
804405e7 452 This->Mode->CursorColumn = (INT32) Column;\r
453\r
ccd55824 454#if 0\r
804405e7 455 Private->Position.Y = (WORD) Row;\r
ccd55824 456#endif\r
804405e7 457 This->Mode->CursorRow = (INT32) Row;\r
ccd55824 458#if 0\r
804405e7 459 Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);\r
ccd55824 460#endif\r
461\r
462 buf[0] = '\e';\r
463 buf[1] = '[';\r
464 buf[2] = '0' + ((Row / 100) % 10);\r
465 buf[3] = '0' + ((Row / 10) % 10);\r
466 buf[4] = '0' + ((Row / 1) % 10);\r
467 buf[5] = ';';\r
468 buf[6] = '0' + ((Column / 100) % 10);\r
469 buf[7] = '0' + ((Column / 10) % 10);\r
470 buf[8] = '0' + ((Column / 1) % 10);\r
471 buf[9] = 'H';\r
472 Private->UnixThunk->Write (1, buf, 10);\r
473\r
804405e7 474 return EFI_SUCCESS;\r
475}\r
476\r
804405e7 477EFI_STATUS\r
478EFIAPI\r
479UnixSimpleTextOutEnableCursor (\r
480 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
481 IN BOOLEAN Enable\r
482 )\r
483/*++\r
484\r
485Routine Description:\r
486\r
487 TODO: Add function description\r
488\r
489Arguments:\r
490\r
491 This - TODO: add argument description\r
492 Enable - TODO: add argument description\r
493\r
494Returns:\r
495\r
496 EFI_SUCCESS - TODO: Add description for return value\r
497\r
498--*/\r
499{\r
500 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
ccd55824 501#if 0\r
804405e7 502 CONSOLE_CURSOR_INFO Info;\r
ccd55824 503#endif\r
804405e7 504\r
505 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
506 Private->CursorEnable = Enable;\r
507 This->Mode->CursorVisible = Enable;\r
508\r
ccd55824 509#if 0\r
804405e7 510 Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
511 Info.bVisible = Enable;\r
512 Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
ccd55824 513#endif\r
804405e7 514\r
515 return EFI_SUCCESS;\r
516}\r
517\r
518EFI_STATUS\r
519UnixSimpleTextOutOpenWindow (\r
520 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private\r
521 )\r
522/*++\r
523\r
524Routine Description:\r
525\r
526 TODO: Add function description\r
527\r
528Arguments:\r
529\r
530 Private - TODO: add argument description\r
531\r
532Returns:\r
533\r
534 TODO: add return values\r
535\r
536--*/\r
537{\r
538 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
539 CHAR16 *WindowName;\r
540\r
541 //WindowName = Private->UnixIo->EnvString;\r
ccd55824 542#if 0\r
804405e7 543 Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
544 if (*WindowName == '?') {\r
545 Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;\r
546 WindowName = L"EFI Emulator Error Console";\r
547 }\r
ccd55824 548#endif\r
804405e7 549 WindowName = L"EFI Emulator Error Console";\r
550\r
551 AddUnicodeString (\r
552 "eng",\r
553 gUnixConsoleComponentName.SupportedLanguages,\r
554 &Private->ControllerNameTable,\r
555 WindowName\r
556 );\r
557\r
558 //\r
559 // Fill in protocol member functions\r
560 //\r
561 SimpleTextOut = &Private->SimpleTextOut;\r
562 SimpleTextOut->Reset = UnixSimpleTextOutReset;\r
563 SimpleTextOut->OutputString = UnixSimpleTextOutOutputString;\r
564 SimpleTextOut->TestString = UnixSimpleTextOutTestString;\r
565 SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode;\r
566 SimpleTextOut->SetMode = UnixSimpleTextOutSetMode;\r
567 SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute;\r
568 SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen;\r
569 SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition;\r
570 SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor;\r
571\r
572 //\r
573 // Initialize SimpleTextOut protocol mode structure\r
574 //\r
575 SimpleTextOut->Mode = &Private->SimpleTextOutMode;\r
576 SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;\r
577 SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
578\r
ccd55824 579#if 0\r
804405e7 580 //\r
581 // Open the window an initialize it!\r
582 //\r
583 Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer (\r
584 GENERIC_WRITE | GENERIC_READ,\r
585 FILE_SHARE_WRITE | FILE_SHARE_READ,\r
586 NULL,\r
587 CONSOLE_TEXTMODE_BUFFER,\r
588 NULL\r
589 );\r
590 Private->UnixThunk->SetConsoleTitle (WindowName);\r
ccd55824 591#endif\r
804405e7 592\r
593 return SimpleTextOut->SetMode (SimpleTextOut, 0);\r
594}\r
595\r
596EFI_STATUS\r
597UnixSimpleTextOutCloseWindow (\r
598 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
599 )\r
600/*++\r
601\r
602Routine Description:\r
603\r
604 TODO: Add function description\r
605\r
606Arguments:\r
607\r
608 Console - TODO: add argument description\r
609\r
610Returns:\r
611\r
612 EFI_SUCCESS - TODO: Add description for return value\r
613\r
614--*/\r
615{\r
ccd55824 616#if 0\r
804405e7 617 Console->UnixThunk->CloseHandle (Console->NtOutHandle);\r
ccd55824 618#endif\r
804405e7 619 return EFI_SUCCESS;\r
620}\r