public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Felix Poludov <Felixp@ami.com>
To: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: [PATCH 1/2] MdePkg: UiLib library. Add UiLib. Update UefiLib.
Date: Wed, 9 Nov 2016 15:44:16 +0000	[thread overview]
Message-ID: <9333E191E0D52B4999CE63A99BA663A00270FF9988@atlms1.us.megatrends.com> (raw)

1. New UiLib library class is added to MdePkg.
The library is intended for functions that produce UI elements.
The patch introduces two functions that produce a popup window:
UiCreatePopUp and UiCreatePopUpVaList.
2. An instance of UiLib library class is added to MdePkg.
Popup implementation is copied from UefiLib
(CreatePopUp function in UefiLib/Console.c).
3. MdePkg/UefiLib library is updated to implement CreatePopUp
by calling UiCreatePopUpVaList.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Felix Polyudov <felixp@ami.com>
---
MdePkg/Include/Library/UiLib.h           |  71 +++++++
MdePkg/Library/UefiLib/Console.c         | 252 +----------------------
MdePkg/Library/UefiLib/UefiLib.inf       |   1 +
MdePkg/Library/UefiLib/UefiLibInternal.h |   1 +
MdePkg/Library/UiLib/UiLib.c             | 334 +++++++++++++++++++++++++++++++
MdePkg/Library/UiLib/UiLib.inf           |  38 ++++
MdePkg/Library/UiLib/UiLib.uni           |  21 ++
MdePkg/MdePkg.dec                        |   3 +
8 files changed, 470 insertions(+), 251 deletions(-)
create mode 100644 MdePkg/Include/Library/UiLib.h
create mode 100644 MdePkg/Library/UiLib/UiLib.c
create mode 100644 MdePkg/Library/UiLib/UiLib.inf
create mode 100644 MdePkg/Library/UiLib/UiLib.uni

diff --git a/MdePkg/Include/Library/UiLib.h b/MdePkg/Include/Library/UiLib.h
new file mode 100644
index 0000000..0f6b687
--- /dev/null
+++ b/MdePkg/Include/Library/UiLib.h
@@ -0,0 +1,71 @@
+/** @file
+  Provides library functions to construct UI elements.
+
+Copyright (c) 2016, American Megatrends, Inc. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that 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.
+
+**/
+
+#ifndef __UI_LIB_H__
+#define __UI_LIB_H__
+
+/**
+  Draws a dialog box to the console output device specified by
+  ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
+  from the console input device specified by ConIn defined in the
+  EFI_SYSTEM_TABLE.
+
+  If there are no strings in the variable argument list, then ASSERT().
+  If all the strings in the variable argument list are empty, then ASSERT().
+
+  @param[in]   Attribute  Specifies the foreground and background color of the popup.
+  @param[out]  Key        A pointer to the EFI_KEY value of the key that was
+                          pressed.  This is an optional parameter that may be NULL.
+                          If it is NULL then no wait for a keypress will be performed.
+  @param[in]  ...         The variable argument list that contains pointers to Null-
+                          terminated Unicode strings to display in the dialog box.
+                          The variable argument list is terminated by a NULL.
+
+**/
+VOID
+EFIAPI
+UiCreatePopUp (
+  IN  UINTN          Attribute,
+  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
+  ...
+  );
+
+/**
+  Draws a dialog box to the console output device specified by
+  ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
+  from the console input device specified by ConIn defined in the
+  EFI_SYSTEM_TABLE.
+
+  If there are no strings in the variable argument list, then ASSERT().
+  If all the strings in the variable argument list are empty, then ASSERT().
+
+  @param[in]   Attribute  Specifies the foreground and background color of the popup.
+  @param[out]  Key        A pointer to the EFI_KEY value of the key that was
+                          pressed.  This is an optional parameter that may be NULL.
+                          If it is NULL then no wait for a keypress will be performed.
+  @param[in]  Args        VA_LIST marker for the variable argument list that contains
+                          pointers to Null-terminated Unicode strings to display
+                                                                                          in the dialog box.
+                          The variable argument list is terminated by a NULL.
+
+**/
+VOID
+EFIAPI
+UiCreatePopUpVaList (
+  IN  UINTN          Attribute,
+  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
+  IN VA_LIST         Args
+  );
+
+#endif
diff --git a/MdePkg/Library/UefiLib/Console.c b/MdePkg/Library/UefiLib/Console.c
index ecaf425..8e7e986 100644
--- a/MdePkg/Library/UefiLib/Console.c
+++ b/MdePkg/Library/UefiLib/Console.c
@@ -22,9 +22,6 @@ typedef struct {
   UINT32  Width;
} UNICODE_WIDTH_ENTRY;
-#define NARROW_CHAR         0xFFF0
-#define WIDE_CHAR           0xFFF1
-
GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //
   // General script area
@@ -292,89 +289,6 @@ UnicodeStringDisplayLength (
}
 /**
-  Count the storage space of a Unicode string.
-
-  This function handles the Unicode string with NARROW_CHAR
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR
-  does not count in the resultant output. If a WIDE_CHAR is
-  hit, then 2 Unicode character will consume an output storage
-  space with size of CHAR16 till a NARROW_CHAR is hit.
-
-  @param String          The input string to be counted.
-  @param LimitLen        Whether need to limit the string length.
-  @param MaxWidth        The max length this function supported.
-  @param Offset          The max index of the string can be show out.
-
-  @return Storage space for the input string.
-
-**/
-UINTN
-UefiLibGetStringWidth (
-  IN  CHAR16               *String,
-  IN  BOOLEAN              LimitLen,
-  IN  UINTN                MaxWidth,
-  OUT UINTN                *Offset
-  )
-{
-  UINTN Index;
-  UINTN Count;
-  UINTN IncrementValue;
-
-  if (String == NULL) {
-    return 0;
-  }
-
-  Index           = 0;
-  Count           = 0;
-  IncrementValue  = 1;
-
-  do {
-    //
-    // Advance to the null-terminator or to the first width directive
-    //
-    for (;(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0); Index++) {
-      Count = Count + IncrementValue;
-
-      if (LimitLen && Count > MaxWidth) {
-        break;
-      }
-    }
-
-    //
-    // We hit the null-terminator, we now have a count
-    //
-    if (String[Index] == 0) {
-      break;
-    }
-
-    if (LimitLen && Count > MaxWidth) {
-      *Offset = Index;
-      break;
-    }
-
-    //
-    // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed
-    // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)
-    //
-    if (String[Index] == NARROW_CHAR) {
-      //
-      // Skip to the next character
-      //
-      Index++;
-      IncrementValue = 1;
-    } else {
-      //
-      // Skip to the next character
-      //
-      Index++;
-      IncrementValue = 2;
-    }
-  } while (String[Index] != 0);
-
-  return Count * sizeof (CHAR16);
-}
-
-/**
   Draws a dialog box to the console output device specified by
   ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
   from the console input device specified by ConIn defined in the
@@ -400,173 +314,9 @@ CreatePopUp (
   ...
   )
{
-  EFI_STATUS                       Status;
   VA_LIST                          Args;
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;
-  EFI_SIMPLE_TEXT_OUTPUT_MODE      SavedConsoleMode;
-  UINTN                            Columns;
-  UINTN                            Rows;
-  UINTN                            Column;
-  UINTN                            Row;
-  UINTN                            NumberOfLines;
-  UINTN                            MaxLength;
-  CHAR16                           *String;
-  UINTN                            Length;
-  CHAR16                           *Line;
-  UINTN                            EventIndex;
-  CHAR16                           *TmpString;
-
-  //
-  // Determine the length of the longest line in the popup and the the total
-  // number of lines in the popup
-  //
-  VA_START (Args, Key);
-  MaxLength = 0;
-  NumberOfLines = 0;
-  while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {
-    MaxLength = MAX (MaxLength, UefiLibGetStringWidth (String, FALSE, 0, NULL) / 2);
-    NumberOfLines++;
-  }
-  VA_END (Args);
-
-  //
-  // If the total number of lines in the popup is zero, then ASSERT()
-  //
-  ASSERT (NumberOfLines != 0);
-
-  //
-  // If the maximum length of all the strings is zero, then ASSERT()
-  //
-  ASSERT (MaxLength != 0);
-
-  //
-  // Cache a pointer to the Simple Text Output Protocol in the EFI System Table
-  //
-  ConOut = gST->ConOut;
-
-  //
-  // Save the current console cursor position and attributes
-  //
-  CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));
-
-  //
-  // Retrieve the number of columns and rows in the current console mode
-  //
-  ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);
-
-  //
-  // Disable cursor and set the foreground and background colors specified by Attribute
-  //
-  ConOut->EnableCursor (ConOut, FALSE);
-  ConOut->SetAttribute (ConOut, Attribute);
-
-  //
-  // Limit NumberOfLines to height of the screen minus 3 rows for the box itself
-  //
-  NumberOfLines = MIN (NumberOfLines, Rows - 3);
-
-  //
-  // Limit MaxLength to width of the screen minus 2 columns for the box itself
-  //
-  MaxLength = MIN (MaxLength, Columns - 2);
-
-  //
-  // Compute the starting row and starting column for the popup
-  //
-  Row    = (Rows - (NumberOfLines + 3)) / 2;
-  Column = (Columns - (MaxLength + 2)) / 2;
-
-  //
-  // Allocate a buffer for a single line of the popup with borders and a Null-terminator
-  //
-  Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));
-  ASSERT (Line != NULL);
-  //
-  // Draw top of popup box
-  //
-  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
-  Line[0]             = BOXDRAW_DOWN_RIGHT;
-  Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;
-  Line[MaxLength + 2] = L'\0';
-  ConOut->SetCursorPosition (ConOut, Column, Row++);
-  ConOut->OutputString (ConOut, Line);
-
-  //
-  // Draw middle of the popup with strings
-  //
   VA_START (Args, Key);
-  while ((String = VA_ARG (Args, CHAR16 *)) != NULL && NumberOfLines > 0) {
-    SetMem16 (Line, (MaxLength + 2) * 2, L' ');
-    Line[0]             = BOXDRAW_VERTICAL;
-    Line[MaxLength + 1] = BOXDRAW_VERTICAL;
-    Line[MaxLength + 2] = L'\0';
-    ConOut->SetCursorPosition (ConOut, Column, Row);
-    ConOut->OutputString (ConOut, Line);
-    Length = UefiLibGetStringWidth (String, FALSE, 0, NULL) / 2;
-    if (Length <= MaxLength) {
-      //
-      // Length <= MaxLength
-      //
-      ConOut->SetCursorPosition (ConOut, Column + 1 + (MaxLength - Length) / 2, Row++);
-      ConOut->OutputString (ConOut, String);
-    } else {
-      //
-      // Length > MaxLength
-      //
-      UefiLibGetStringWidth (String, TRUE, MaxLength, &Length);
-      TmpString = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));
-      ASSERT (TmpString != NULL);
-      StrnCpyS (TmpString, Length + 1, String, Length - 3);
-      StrCatS (TmpString, Length + 1, L"...");
-
-      ConOut->SetCursorPosition (ConOut, Column + 1, Row++);
-      ConOut->OutputString (ConOut, TmpString);
-      FreePool (TmpString);
-    }
-    NumberOfLines--;
-  }
+  UiCreatePopUpVaList(Attribute, Key, Args);
   VA_END (Args);
-
-  //
-  // Draw bottom of popup box
-  //
-  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
-  Line[0]             = BOXDRAW_UP_RIGHT;
-  Line[MaxLength + 1] = BOXDRAW_UP_LEFT;
-  Line[MaxLength + 2] = L'\0';
-  ConOut->SetCursorPosition (ConOut, Column, Row++);
-  ConOut->OutputString (ConOut, Line);
-
-  //
-  // Free the allocated line buffer
-  //
-  FreePool (Line);
-
-  //
-  // Restore the cursor visibility, position, and attributes
-  //
-  ConOut->EnableCursor      (ConOut, SavedConsoleMode.CursorVisible);
-  ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);
-  ConOut->SetAttribute      (ConOut, SavedConsoleMode.Attribute);
-
-  //
-  // Wait for a keystroke
-  //
-  if (Key != NULL) {
-    while (TRUE) {
-      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
-      if (!EFI_ERROR (Status)) {
-        break;
-      }
-
-      //
-      // If we encounter error, continue to read another key in.
-      //
-      if (Status != EFI_NOT_READY) {
-        continue;
-      }
-      gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
-    }
-  }
}
diff --git a/MdePkg/Library/UefiLib/UefiLib.inf b/MdePkg/Library/UefiLib/UefiLib.inf
index 8284dc5..0767aff 100644
--- a/MdePkg/Library/UefiLib/UefiLib.inf
+++ b/MdePkg/Library/UefiLib/UefiLib.inf
@@ -57,6 +57,7 @@
   UefiBootServicesTableLib
   DevicePathLib
   UefiRuntimeServicesTableLib
+  UiLib

 [Guids]
   gEfiEventReadyToBootGuid                      ## SOMETIMES_CONSUMES  ## Event
diff --git a/MdePkg/Library/UefiLib/UefiLibInternal.h b/MdePkg/Library/UefiLib/UefiLibInternal.h
index 2311f27..96c6e88 100644
--- a/MdePkg/Library/UefiLib/UefiLibInternal.h
+++ b/MdePkg/Library/UefiLib/UefiLibInternal.h
@@ -40,6 +40,7 @@
#include <Library/PcdLib.h>
#include <Library/PrintLib.h>
#include <Library/DevicePathLib.h>
+#include <Library/UiLib.h>
 /**
   An empty function to pass error checking of CreateEventEx ().
diff --git a/MdePkg/Library/UiLib/UiLib.c b/MdePkg/Library/UiLib/UiLib.c
new file mode 100644
index 0000000..823dd0a
--- /dev/null
+++ b/MdePkg/Library/UiLib/UiLib.c
@@ -0,0 +1,334 @@
+/** @file
+  The UI Library provides functions that are used to construct UI elements.
+
+  Copyright (c) 2016, American Megatrends, Inc. All rights reserved.<BR>
+  Copyright (c) 2006 - 2015, 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 <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextOut.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#define NARROW_CHAR         0xFFF0
+#define WIDE_CHAR           0xFFF1
+
+/**
+  Count the storage space of a Unicode string.
+
+  This function handles the Unicode string with NARROW_CHAR
+  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR
+  does not count in the resultant output. If a WIDE_CHAR is
+  hit, then 2 Unicode character will consume an output storage
+  space with size of CHAR16 till a NARROW_CHAR is hit.
+
+  @param String          The input string to be counted.
+  @param LimitLen        Whether need to limit the string length.
+  @param MaxWidth        The max length this function supported.
+  @param Offset          The max index of the string can be show out.
+
+  @return Storage space for the input string.
+
+**/
+UINTN
+UefiLibGetStringWidth (
+  IN  CHAR16               *String,
+  IN  BOOLEAN              LimitLen,
+  IN  UINTN                MaxWidth,
+  OUT UINTN                *Offset
+  )
+{
+  UINTN Index;
+  UINTN Count;
+  UINTN IncrementValue;
+
+  if (String == NULL) {
+    return 0;
+  }
+
+  Index           = 0;
+  Count           = 0;
+  IncrementValue  = 1;
+
+  do {
+    //
+    // Advance to the null-terminator or to the first width directive
+    //
+    for (;(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0); Index++) {
+      Count = Count + IncrementValue;
+
+      if (LimitLen && Count > MaxWidth) {
+        break;
+      }
+    }
+
+    //
+    // We hit the null-terminator, we now have a count
+    //
+    if (String[Index] == 0) {
+      break;
+    }
+
+    if (LimitLen && Count > MaxWidth) {
+      *Offset = Index;
+      break;
+    }
+
+    //
+    // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed
+    // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)
+    //
+    if (String[Index] == NARROW_CHAR) {
+      //
+      // Skip to the next character
+      //
+      Index++;
+      IncrementValue = 1;
+    } else {
+      //
+      // Skip to the next character
+      //
+      Index++;
+      IncrementValue = 2;
+    }
+  } while (String[Index] != 0);
+
+  return Count * sizeof (CHAR16);
+}
+
+/**
+  Draws a dialog box to the console output device specified by
+  ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
+  from the console input device specified by ConIn defined in the
+  EFI_SYSTEM_TABLE.
+
+  If there are no strings in the variable argument list, then ASSERT().
+  If all the strings in the variable argument list are empty, then ASSERT().
+
+  @param[in]   Attribute  Specifies the foreground and background color of the popup.
+  @param[out]  Key        A pointer to the EFI_KEY value of the key that was
+                          pressed.  This is an optional parameter that may be NULL.
+                          If it is NULL then no wait for a keypress will be performed.
+  @param[in]  Args        VA_LIST marker for the variable argument list that contains
+                          pointers to Null-terminated Unicode strings to display
+                                                                                          in the dialog box.
+                          The variable argument list is terminated by a NULL.
+
+**/
+VOID
+EFIAPI
+UiCreatePopUpVaList (
+  IN  UINTN          Attribute,
+  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
+  IN VA_LIST         Args
+  )
+{
+  EFI_STATUS                       Status;
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;
+  EFI_SIMPLE_TEXT_OUTPUT_MODE      SavedConsoleMode;
+  UINTN                            Columns;
+  UINTN                            Rows;
+  UINTN                            Column;
+  UINTN                            Row;
+  UINTN                            NumberOfLines;
+  UINTN                            MaxLength;
+  CHAR16                           *String;
+  UINTN                            Length;
+  CHAR16                           *Line;
+  UINTN                            EventIndex;
+  CHAR16                           *TmpString;
+
+  //
+  // Determine the length of the longest line in the popup and the the total
+  // number of lines in the popup
+  //
+  MaxLength = 0;
+  NumberOfLines = 0;
+  while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {
+    MaxLength = MAX (MaxLength, UefiLibGetStringWidth (String, FALSE, 0, NULL) / 2);
+    NumberOfLines++;
+  }
+
+  //
+  // If the total number of lines in the popup is zero, then ASSERT()
+  //
+  ASSERT (NumberOfLines != 0);
+
+  //
+  // If the maximum length of all the strings is zero, then ASSERT()
+  //
+  ASSERT (MaxLength != 0);
+
+  //
+  // Cache a pointer to the Simple Text Output Protocol in the EFI System Table
+  //
+  ConOut = gST->ConOut;
+
+  //
+  // Save the current console cursor position and attributes
+  //
+  CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));
+
+  //
+  // Retrieve the number of columns and rows in the current console mode
+  //
+  ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);
+
+  //
+  // Disable cursor and set the foreground and background colors specified by Attribute
+  //
+  ConOut->EnableCursor (ConOut, FALSE);
+  ConOut->SetAttribute (ConOut, Attribute);
+
+  //
+  // Limit NumberOfLines to height of the screen minus 3 rows for the box itself
+  //
+  NumberOfLines = MIN (NumberOfLines, Rows - 3);
+
+  //
+  // Limit MaxLength to width of the screen minus 2 columns for the box itself
+  //
+  MaxLength = MIN (MaxLength, Columns - 2);
+
+  //
+  // Compute the starting row and starting column for the popup
+  //
+  Row    = (Rows - (NumberOfLines + 3)) / 2;
+  Column = (Columns - (MaxLength + 2)) / 2;
+
+  //
+  // Allocate a buffer for a single line of the popup with borders and a Null-terminator
+  //
+  Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));
+  ASSERT (Line != NULL);
+
+  //
+  // Draw top of popup box
+  //
+  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
+  Line[0]             = BOXDRAW_DOWN_RIGHT;
+  Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;
+  Line[MaxLength + 2] = L'\0';
+  ConOut->SetCursorPosition (ConOut, Column, Row++);
+  ConOut->OutputString (ConOut, Line);
+
+  //
+  // Draw middle of the popup with strings
+  //
+  while ((String = VA_ARG (Args, CHAR16 *)) != NULL && NumberOfLines > 0) {
+    SetMem16 (Line, (MaxLength + 2) * 2, L' ');
+    Line[0]             = BOXDRAW_VERTICAL;
+    Line[MaxLength + 1] = BOXDRAW_VERTICAL;
+    Line[MaxLength + 2] = L'\0';
+    ConOut->SetCursorPosition (ConOut, Column, Row);
+    ConOut->OutputString (ConOut, Line);
+    Length = UefiLibGetStringWidth (String, FALSE, 0, NULL) / 2;
+    if (Length <= MaxLength) {
+      //
+      // Length <= MaxLength
+      //
+      ConOut->SetCursorPosition (ConOut, Column + 1 + (MaxLength - Length) / 2, Row++);
+      ConOut->OutputString (ConOut, String);
+    } else {
+      //
+      // Length > MaxLength
+      //
+      UefiLibGetStringWidth (String, TRUE, MaxLength, &Length);
+      TmpString = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));
+      ASSERT (TmpString != NULL);
+      StrnCpyS (TmpString, Length + 1, String, Length - 3);
+      StrCatS (TmpString, Length + 1, L"...");
+
+      ConOut->SetCursorPosition (ConOut, Column + 1, Row++);
+      ConOut->OutputString (ConOut, TmpString);
+      FreePool (TmpString);
+    }
+    NumberOfLines--;
+  }
+
+  //
+  // Draw bottom of popup box
+  //
+  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
+  Line[0]             = BOXDRAW_UP_RIGHT;
+  Line[MaxLength + 1] = BOXDRAW_UP_LEFT;
+  Line[MaxLength + 2] = L'\0';
+  ConOut->SetCursorPosition (ConOut, Column, Row++);
+  ConOut->OutputString (ConOut, Line);
+
+  //
+  // Free the allocated line buffer
+  //
+  FreePool (Line);
+
+  //
+  // Restore the cursor visibility, position, and attributes
+  //
+  ConOut->EnableCursor      (ConOut, SavedConsoleMode.CursorVisible);
+  ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);
+  ConOut->SetAttribute      (ConOut, SavedConsoleMode.Attribute);
+
+  //
+  // Wait for a keystroke
+  //
+  if (Key != NULL) {
+    while (TRUE) {
+      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
+      if (!EFI_ERROR (Status)) {
+        break;
+      }
+
+      //
+      // If we encounter error, continue to read another key in.
+      //
+      if (Status != EFI_NOT_READY) {
+        continue;
+      }
+      gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
+    }
+  }
+}
+
+/**
+  Draws a dialog box to the console output device specified by
+  ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
+  from the console input device specified by ConIn defined in the
+  EFI_SYSTEM_TABLE.
+
+  If there are no strings in the variable argument list, then ASSERT().
+  If all the strings in the variable argument list are empty, then ASSERT().
+
+  @param[in]   Attribute  Specifies the foreground and background color of the popup.
+  @param[out]  Key        A pointer to the EFI_KEY value of the key that was
+                          pressed.  This is an optional parameter that may be NULL.
+                          If it is NULL then no wait for a keypress will be performed.
+  @param[in]  ...         The variable argument list that contains pointers to Null-
+                          terminated Unicode strings to display in the dialog box.
+                          The variable argument list is terminated by a NULL.
+
+**/
+VOID
+EFIAPI
+UiCreatePopUp (
+  IN  UINTN          Attribute,
+  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
+  ...
+  )
+{
+  VA_LIST                          Args;
+
+  VA_START (Args, Key);
+  UiCreatePopUpVaList(Attribute, Key, Args);
+  VA_END (Args);
+}
diff --git a/MdePkg/Library/UiLib/UiLib.inf b/MdePkg/Library/UiLib/UiLib.inf
new file mode 100644
index 0000000..056b9bf
--- /dev/null
+++ b/MdePkg/Library/UiLib/UiLib.inf
@@ -0,0 +1,38 @@
+## @file
+# Instance of UI Library.
+#
+# The UI Library provides functions that are used to construct UI elements.
+#
+# Copyright (c) 2016, American Megatrends, Inc. 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.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = UiLib
+  MODULE_UNI_FILE                = UiLib.uni
+  FILE_GUID                      = ffea9b78-9bb6-4ed8-bc61-bcd0a07c3e83
+  MODULE_TYPE                    = UEFI_DRIVER
+  LIBRARY_CLASS                  = UiLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE
+
+
+[Sources]
+  UiLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  MemoryAllocationLib
+  DebugLib
+  BaseMemoryLib
+  UefiLib
+  UefiBootServicesTableLib
diff --git a/MdePkg/Library/UiLib/UiLib.uni b/MdePkg/Library/UiLib/UiLib.uni
new file mode 100644
index 0000000..87089e7
--- /dev/null
+++ b/MdePkg/Library/UiLib/UiLib.uni
@@ -0,0 +1,21 @@
+// /** @file
+// Instance of UI Library.
+//
+// The UI Library provides functions that are used to construct UI elements.
+//
+// Copyright (c) 2016, American Megatrends, Inc. 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.
+//
+// **/
+
+
+#string STR_MODULE_ABSTRACT             #language en-US "Instance of UI Library"
+
+#string STR_MODULE_DESCRIPTION          #language en-US "The UI Library provides functions that are used to construct UI elements."
+
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 3e08bed..a8a0a0f 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -233,6 +233,9 @@
   ##  @libraryclass  provides EFI_FILE_HANDLE services
   FileHandleLib|Include/Library/FileHandleLib.h
+  ##  @libraryclass  provides functions to construct UI elements.
+  UiLib|Include/Library/CustomizedUiLib.h
+
[LibraryClasses.IA32, LibraryClasses.X64]
   ##  @libraryclass  Abstracts both S/W SMI generation and detection.
   ##
--
2.10.0.windows.1



Please consider the environment before printing this email.

The information contained in this message may be confidential and proprietary to American Megatrends, Inc.  This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited.  Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.


                 reply	other threads:[~2016-11-09 15:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9333E191E0D52B4999CE63A99BA663A00270FF9988@atlms1.us.megatrends.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox