Home | History | Annotate | Download | only in UefiShellDebug1CommandsLib
      1 /** @file
      2   Implements statusbar interface functions.
      3 
      4   Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "EditStatusBar.h"
     16 #include "UefiShellDebug1CommandsLib.h"
     17 
     18 CHAR16  *StatusString;
     19 BOOLEAN StatusBarNeedRefresh;
     20 BOOLEAN StatusStringChanged;
     21 
     22 /**
     23   Initialization function for Status Bar.
     24 
     25   @retval EFI_SUCCESS           The operation was successful.
     26   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
     27   @sa StatusBarSetStatusString
     28 **/
     29 EFI_STATUS
     30 StatusBarInit (
     31   VOID
     32   )
     33 {
     34   //
     35   // initialize the statusbar
     36   //
     37   StatusString         = NULL;
     38   StatusBarNeedRefresh = TRUE;
     39   StatusStringChanged  = FALSE;
     40 
     41   //
     42   // status string set to ""
     43   //
     44   return (StatusBarSetStatusString (L""));
     45 }
     46 
     47 /**
     48   Cleanup function for the status bar.
     49 **/
     50 VOID
     51 StatusBarCleanup (
     52   VOID
     53   )
     54 {
     55   //
     56   // free the status string and backvar's status string
     57   //
     58   SHELL_FREE_NON_NULL (StatusString);
     59 }
     60 
     61 typedef struct {
     62   UINT32  Foreground : 4;
     63   UINT32  Background : 3;
     64 } STATUS_BAR_COLOR_ATTRIBUTES;
     65 
     66 typedef union {
     67   STATUS_BAR_COLOR_ATTRIBUTES  Colors;
     68   UINTN                       Data;
     69 } STATUS_BAR_COLOR_UNION;
     70 
     71 /**
     72   Cause the status bar to refresh it's printing on the screen.
     73 
     74   @param[in] EditorFirst      TRUE to indicate the first launch of the editor.
     75                               FALSE otherwise.
     76   @param[in] LastRow          LastPrintable row.
     77   @param[in] LastCol          Last printable column.
     78   @param[in] FileRow          Row in the file.
     79   @param[in] FileCol          Column in the file.
     80   @param[in] InsertMode       TRUE to indicate InsertMode.  FALSE otherwise.
     81 
     82   @retval EFI_SUCCESS         The operation was successful.
     83 **/
     84 EFI_STATUS
     85 StatusBarRefresh (
     86   IN BOOLEAN  EditorFirst,
     87   IN UINTN    LastRow,
     88   IN UINTN    LastCol,
     89   IN UINTN    FileRow,
     90   IN UINTN    FileCol,
     91   IN BOOLEAN  InsertMode
     92   )
     93 {
     94   STATUS_BAR_COLOR_UNION  Orig;
     95   STATUS_BAR_COLOR_UNION  New;
     96 
     97   if (!StatusStringChanged && StatusBarNeedRefresh) {
     98     StatusBarSetStatusString (L"\0");
     99   }
    100   //
    101   // when it's called first time after editor launch, so refresh is mandatory
    102   //
    103   if (!StatusBarNeedRefresh && !StatusStringChanged) {
    104     return EFI_SUCCESS;
    105   }
    106 
    107   //
    108   // back up the screen attributes
    109   //
    110   Orig.Data             = gST->ConOut->Mode->Attribute;
    111   New.Data              = 0;
    112   New.Colors.Foreground = Orig.Colors.Background & 0xF;
    113   New.Colors.Background = Orig.Colors.Foreground & 0x7;
    114 
    115   gST->ConOut->EnableCursor (gST->ConOut, FALSE);
    116   gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);
    117 
    118   //
    119   // clear status bar
    120   //
    121   EditorClearLine (LastRow, LastCol, LastRow);
    122 
    123   //
    124   // print row, column fields
    125   //
    126   if (FileRow != (UINTN)(-1) && FileCol != (UINTN)(-1)) {
    127     ShellPrintEx (
    128       0,
    129       (INT32)(LastRow) - 1,
    130       L" %d,%d       %s",
    131       FileRow,
    132       FileCol,
    133       StatusString
    134       );
    135   } else {
    136     ShellPrintEx (
    137       0,
    138       (INT32)(LastRow) - 1,
    139       L"  %s",
    140       StatusString
    141       );
    142   }
    143 
    144   //
    145   // print insert mode field
    146   //
    147   if (InsertMode) {
    148     ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s|   Help: Ctrl-E", L"INS");
    149   } else {
    150     ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s|   Help: Ctrl-E", L"OVR");
    151   }
    152   //
    153   // restore the old screen attributes
    154   //
    155   gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);
    156 
    157   //
    158   // restore position in edit area
    159   //
    160   gST->ConOut->EnableCursor (gST->ConOut, TRUE);
    161 
    162   StatusBarNeedRefresh  = FALSE;
    163   StatusStringChanged   = FALSE;
    164 
    165   return EFI_SUCCESS;
    166 }
    167 
    168 /**
    169   Set the status string text part.
    170 
    171   @param[in] Str                The string to use.
    172 
    173   @retval EFI_SUCCESS           The operation was successful.
    174   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
    175 **/
    176 EFI_STATUS
    177 StatusBarSetStatusString (
    178   IN CHAR16 *Str
    179   )
    180 {
    181   StatusStringChanged = TRUE;
    182 
    183   //
    184   // free the old status string
    185   //
    186   SHELL_FREE_NON_NULL (StatusString);
    187   StatusString = CatSPrint (NULL, L"%s", Str);
    188   if (StatusString == NULL) {
    189     return EFI_OUT_OF_RESOURCES;
    190   }
    191 
    192   return EFI_SUCCESS;
    193 }
    194 
    195 /**
    196   Function to retrieve the current status string.
    197 
    198   @return The string that is used.
    199 **/
    200 CONST CHAR16*
    201 StatusBarGetString (
    202   VOID
    203   )
    204 {
    205   return (StatusString);
    206 }
    207 
    208 /**
    209   Function to set the need refresh boolean to TRUE.
    210 **/
    211 VOID
    212 StatusBarSetRefresh(
    213   VOID
    214   )
    215 {
    216   StatusBarNeedRefresh = TRUE;
    217 }
    218 
    219 /**
    220   Function to get the need refresh boolean to TRUE.
    221 
    222   @retval TRUE    The status bar needs to be refreshed.
    223 **/
    224 BOOLEAN
    225 StatusBarGetRefresh(
    226   VOID
    227   )
    228 {
    229   return (StatusBarNeedRefresh);
    230 }
    231