mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 06:52:16 +00:00 
			
		
		
		
	Add CreatePopUp API into UefiLib
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8016 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									b71870c014
								
							
						
					
					
						commit
						db2ef756ba
					
				@ -716,6 +716,31 @@ GetBestLanguage (
 | 
			
		||||
  ...
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  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
 | 
			
		||||
CreatePopUp (
 | 
			
		||||
  IN  UINTN          Attribute,                
 | 
			
		||||
  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
 | 
			
		||||
  ...
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Retrieves the width of a Unicode character.
 | 
			
		||||
 | 
			
		||||
@ -287,3 +287,176 @@ UnicodeStringDisplayLength (
 | 
			
		||||
 | 
			
		||||
  return Length;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  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
 | 
			
		||||
CreatePopUp (
 | 
			
		||||
  IN  UINTN          Attribute,                
 | 
			
		||||
  OUT EFI_INPUT_KEY  *Key,      OPTIONAL
 | 
			
		||||
  ...
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // 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, StrLen (String));
 | 
			
		||||
    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));
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // 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) {
 | 
			
		||||
    Length = StrLen (String);
 | 
			
		||||
    SetMem16 (Line, (MaxLength + 2) * 2, L' ');
 | 
			
		||||
    if (Length <= MaxLength) {
 | 
			
		||||
      //
 | 
			
		||||
      // Length <= MaxLength
 | 
			
		||||
      //
 | 
			
		||||
      CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));
 | 
			
		||||
    } else {
 | 
			
		||||
      //
 | 
			
		||||
      // Length > MaxLength
 | 
			
		||||
      //
 | 
			
		||||
      CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));
 | 
			
		||||
    }
 | 
			
		||||
    Line[0]             = BOXDRAW_VERTICAL;
 | 
			
		||||
    Line[MaxLength + 1] = BOXDRAW_VERTICAL;
 | 
			
		||||
    Line[MaxLength + 2] = L'\0';
 | 
			
		||||
    ConOut->SetCursorPosition (ConOut, Column, Row++);
 | 
			
		||||
    ConOut->OutputString (ConOut, Line);
 | 
			
		||||
    NumberOfLines--;
 | 
			
		||||
  }
 | 
			
		||||
  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) {
 | 
			
		||||
    gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
 | 
			
		||||
    gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user