]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c
MdeModulePkg UsbBusPei: Fix wrong buffer length used to read hub desc
[mirror_edk2.git] / MdeModulePkg / Library / CustomizedDisplayLib / CustomizedDisplayLib.c
index aa28146b0255405b8c846870e7d0fd53c4e824d2..e29892ff17f15152c4c68559212ae53e0daf5f4c 100644 (file)
@@ -2,7 +2,7 @@
 \r
   This library class defines a set of interfaces to customize Display module\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under \r
 the terms and conditions of the BSD License that accompanies this distribution.  \r
 The full text of the license may be found at\r
@@ -135,7 +135,6 @@ RefreshKeyHelp (
 {\r
   UINTN                  SecCol;\r
   UINTN                  ThdCol;\r
-  UINTN                  LeftColumnOfHelp;\r
   UINTN                  RightColumnOfHelp;\r
   UINTN                  TopRowOfHelp;\r
   UINTN                  BottomRowOfHelp;\r
@@ -144,6 +143,12 @@ RefreshKeyHelp (
   EFI_IFR_DATE           *DateOp;\r
   EFI_IFR_TIME           *TimeOp;\r
   BOOLEAN                HexDisplay;\r
+  UINTN                  ColumnWidth1;\r
+  UINTN                  ColumnWidth2;\r
+  UINTN                  ColumnWidth3;\r
+  CHAR16                 *ColumnStr1;\r
+  CHAR16                 *ColumnStr2;\r
+  CHAR16                 *ColumnStr3;\r
 \r
   ASSERT (FormData != NULL);\r
   if (FormData == NULL) {\r
@@ -159,19 +164,40 @@ RefreshKeyHelp (
   SecCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3;\r
   ThdCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2;\r
 \r
+  //\r
+  // + 2 means leave 1 space before the first hotkey info.\r
+  //\r
   StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
-  LeftColumnOfHelp  = gScreenDimensions.LeftColumn + 1;\r
-  RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\r
+  RightColumnOfHelp = gScreenDimensions.RightColumn - 1;\r
   TopRowOfHelp      = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
   BottomRowOfHelp   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
 \r
-  ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
+  ColumnWidth1      = SecCol - StartColumnOfHelp;\r
+  ColumnWidth2      = ThdCol - SecCol;\r
+  ColumnWidth3      = RightColumnOfHelp - ThdCol;\r
+  ColumnStr1        = gLibEmptyString;\r
+  ColumnStr2        = gLibEmptyString;\r
+  ColumnStr3        = gLibEmptyString;\r
+\r
+  //\r
+  // Clean the space at gScreenDimensions.LeftColumn + 1.\r
+  //\r
+  PrintStringAtWithWidth (StartColumnOfHelp - 1, BottomRowOfHelp, gLibEmptyString, 1);\r
+  PrintStringAtWithWidth (StartColumnOfHelp - 1, TopRowOfHelp, gLibEmptyString, 1);\r
+\r
   if (Statement == NULL) {\r
     //\r
     // Print Key for Form without showable statement.\r
     //\r
-    PrintHotKeyHelpString (FormData);\r
-    PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
+      ColumnStr3 = gEscapeString;\r
+    }\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
+\r
     return;\r
   }\r
 \r
@@ -196,16 +222,17 @@ RefreshKeyHelp (
   case EFI_IFR_TIME_OP:\r
   case EFI_IFR_DATE_OP:\r
     if (!Selected) {\r
-        PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
       if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
         PrintAt (\r
-          0\r
+          ColumnWidth1\r
           StartColumnOfHelp,\r
           BottomRowOfHelp,\r
           L"%c%c%c%c%s",\r
@@ -215,17 +242,19 @@ RefreshKeyHelp (
           ARROW_LEFT,\r
           gMoveHighlight\r
           );\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1);\r
       } else {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
         if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {\r
-          PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
-        } \r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+          ColumnStr1 = gAdjustNumber;\r
+        }\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
       }\r
     } else {\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2);\r
 \r
       //\r
       // If it is a selected numeric with manual input, display different message\r
@@ -233,33 +262,35 @@ RefreshKeyHelp (
       if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || \r
           (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        PrintStringAt (\r
-          SecCol,\r
-          TopRowOfHelp,\r
-          HexDisplay ? gHexNumericInput : gDecNumericInput\r
-          );\r
-      } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput;\r
+        PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+      } else {\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       }\r
 \r
       if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
+        ColumnStr1 = gPlusString;\r
+        ColumnStr3 = gMinusString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3);\r
+      PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2);\r
 \r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3);\r
     }\r
     break;\r
 \r
   case EFI_IFR_CHECKBOX_OP:\r
-    PrintHotKeyHelpString (FormData);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
 \r
     if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+      ColumnStr3 = gEscapeString;\r
     }\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-    PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
+    PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
     break;\r
 \r
   case EFI_IFR_REF_OP:\r
@@ -270,25 +301,29 @@ RefreshKeyHelp (
   case EFI_IFR_RESET_BUTTON_OP:\r
   case EFI_IFR_SUBTITLE_OP:\r
      if (!Selected) {\r
-      PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-      PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+      PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+        ColumnStr2 = gEnterString;\r
       }\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
     } else {\r
-      if (Statement->OpCode->OpCode  != EFI_IFR_REF_OP) {\r
-        PrintStringAt (\r
-          (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2,\r
-          BottomRowOfHelp,\r
-          gEnterCommitString\r
-          );\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
+        ColumnStr2 = gEnterCommitString;\r
+        ColumnStr3 = gEnterEscapeString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
     }\r
     break;\r
 \r
@@ -395,6 +430,7 @@ CreateDialog (
   UINTN   DimensionsWidth;\r
   UINTN   DimensionsHeight;\r
   UINTN   CurrentAttribute;\r
+  BOOLEAN CursorVisible;\r
 \r
   //\r
   // If screen dimension info is not ready, get it from console.\r
@@ -428,7 +464,8 @@ CreateDialog (
     LargestString = DimensionsWidth - 2;\r
   }\r
   \r
-  CurrentAttribute  = gST->ConOut->Mode->Attribute;  \r
+  CurrentAttribute  = gST->ConOut->Mode->Attribute;\r
+  CursorVisible     = gST->ConOut->Mode->CursorVisible;\r
   gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
   gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
 \r
@@ -510,7 +547,7 @@ CreateDialog (
   }\r
 \r
   gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
+  gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
 }\r
 \r
 /**\r
@@ -641,7 +678,7 @@ PrintStringAtWithWidth (
 }\r
 \r
 /**\r
-  Prints a chracter to the default console, at\r
+  Prints a character to the default console, at\r
   the supplied cursor position, using L"%c" format.\r
 \r
   @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r