| /** @file | |
| Implements statusbar interface functions. | |
| Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "EditStatusBar.h" | |
| #include "UefiShellDebug1CommandsLib.h" | |
| CHAR16 *StatusString; | |
| BOOLEAN StatusBarNeedRefresh; | |
| BOOLEAN StatusStringChanged; | |
| /** | |
| Initialization function for Status Bar. | |
| @retval EFI_SUCCESS The operation was successful. | |
| @retval EFI_OUT_OF_RESOURCES A memory allocation failed. | |
| @sa StatusBarSetStatusString | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| StatusBarInit ( | |
| VOID | |
| ) | |
| { | |
| // | |
| // initialize the statusbar | |
| // | |
| StatusString = NULL; | |
| StatusBarNeedRefresh = TRUE; | |
| StatusStringChanged = FALSE; | |
| // | |
| // status string set to "" | |
| // | |
| return (StatusBarSetStatusString (L"")); | |
| } | |
| /** | |
| Cleanup function for the status bar. | |
| **/ | |
| VOID | |
| EFIAPI | |
| StatusBarCleanup ( | |
| VOID | |
| ) | |
| { | |
| // | |
| // free the status string and backvar's status string | |
| // | |
| SHELL_FREE_NON_NULL (StatusString); | |
| } | |
| typedef struct { | |
| UINT32 Foreground : 4; | |
| UINT32 Background : 3; | |
| } STATUS_BAR_COLOR_ATTRIBUTES; | |
| typedef union { | |
| STATUS_BAR_COLOR_ATTRIBUTES Colors; | |
| UINTN Data; | |
| } STATUS_BAR_COLOR_UNION; | |
| /** | |
| Cause the status bar to refresh it's printing on the screen. | |
| @param[in] EditorFirst TRUE to indicate the first launch of the editor. | |
| FALSE otherwise. | |
| @param[in] LastRow LastPrintable row. | |
| @param[in] LastCol Last printable column. | |
| @param[in] FileRow Row in the file. | |
| @param[in] FileCol Column in the file. | |
| @param[in] InsertMode TRUE to indicate InsertMode. FALSE otherwise. | |
| @retval EFI_SUCCESS The operation was successful. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| StatusBarRefresh ( | |
| IN BOOLEAN EditorFirst, | |
| IN UINTN LastRow, | |
| IN UINTN LastCol, | |
| IN UINTN FileRow, | |
| IN UINTN FileCol, | |
| IN BOOLEAN InsertMode | |
| ) | |
| { | |
| STATUS_BAR_COLOR_UNION Orig; | |
| STATUS_BAR_COLOR_UNION New; | |
| if (!StatusStringChanged && StatusBarNeedRefresh) { | |
| StatusBarSetStatusString (L"\0"); | |
| } | |
| // | |
| // when it's called first time after editor launch, so refresh is mandatory | |
| // | |
| if (!StatusBarNeedRefresh && !StatusStringChanged) { | |
| return EFI_SUCCESS; | |
| } | |
| // | |
| // back up the screen attributes | |
| // | |
| Orig.Data = gST->ConOut->Mode->Attribute; | |
| New.Data = 0; | |
| New.Colors.Foreground = Orig.Colors.Background & 0xF; | |
| New.Colors.Background = Orig.Colors.Foreground & 0x7; | |
| gST->ConOut->EnableCursor (gST->ConOut, FALSE); | |
| gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F); | |
| // | |
| // clear status bar | |
| // | |
| EditorClearLine (LastRow, LastCol, LastRow); | |
| // | |
| // print row, column fields | |
| // | |
| if (FileRow != (UINTN)(-1) && FileCol != (UINTN)(-1)) { | |
| ShellPrintEx ( | |
| 0, | |
| (INT32)(LastRow) - 1, | |
| L" %d,%d %s", | |
| FileRow, | |
| FileCol, | |
| StatusString | |
| ); | |
| } else { | |
| ShellPrintEx ( | |
| 0, | |
| (INT32)(LastRow) - 1, | |
| L" %s", | |
| StatusString | |
| ); | |
| } | |
| // | |
| // print insert mode field | |
| // | |
| if (InsertMode) { | |
| ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s| Help: Ctrl-E", L"INS"); | |
| } else { | |
| ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s| Help: Ctrl-E", L"OVR"); | |
| } | |
| // | |
| // restore the old screen attributes | |
| // | |
| gST->ConOut->SetAttribute (gST->ConOut, Orig.Data); | |
| // | |
| // restore position in edit area | |
| // | |
| gST->ConOut->EnableCursor (gST->ConOut, TRUE); | |
| StatusBarNeedRefresh = FALSE; | |
| StatusStringChanged = FALSE; | |
| return EFI_SUCCESS; | |
| } | |
| /** | |
| Set the status string text part. | |
| @param[in] Str The string to use. | |
| @retval EFI_SUCCESS The operation was successful. | |
| @retval EFI_OUT_OF_RESOURCES A memory allocation failed. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| StatusBarSetStatusString ( | |
| IN CHAR16 *Str | |
| ) | |
| { | |
| StatusStringChanged = TRUE; | |
| // | |
| // free the old status string | |
| // | |
| SHELL_FREE_NON_NULL (StatusString); | |
| StatusString = CatSPrint (NULL, L"%s", Str); | |
| if (StatusString == NULL) { | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /** | |
| Function to retrieve the current status string. | |
| @return The string that is used. | |
| **/ | |
| CONST CHAR16* | |
| EFIAPI | |
| StatusBarGetString ( | |
| VOID | |
| ) | |
| { | |
| return (StatusString); | |
| } | |
| /** | |
| Function to set the need refresh boolean to TRUE. | |
| **/ | |
| VOID | |
| EFIAPI | |
| StatusBarSetRefresh( | |
| VOID | |
| ) | |
| { | |
| StatusBarNeedRefresh = TRUE; | |
| } | |
| /** | |
| Function to get the need refresh boolean to TRUE. | |
| @retval TRUE The status bar needs to be refreshed. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| StatusBarGetRefresh( | |
| VOID | |
| ) | |
| { | |
| return (StatusBarNeedRefresh); | |
| } |