mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-29 12:35:53 +01:00
231 lines
5.1 KiB
C
231 lines
5.1 KiB
C
|
/** @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
|
||
|
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);
|
||
|
}
|