1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
/** @file
Implements statusbar interface functions.
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#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
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
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
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
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 *
StatusBarGetString (
VOID
)
{
return (StatusString);
}
/**
Function to set the need refresh boolean to TRUE.
**/
VOID
StatusBarSetRefresh (
VOID
)
{
StatusBarNeedRefresh = TRUE;
}
/**
Function to get the need refresh boolean to TRUE.
@retval TRUE The status bar needs to be refreshed.
**/
BOOLEAN
StatusBarGetRefresh (
VOID
)
{
return (StatusBarNeedRefresh);
}
|