From: Tapan Shah Date: Fri, 23 Sep 2016 16:03:16 +0000 (-0700) Subject: ShellPkg: Enhance 'cls' command to change the background and foreground colors X-Git-Tag: edk2-stable201903~5724 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=7188b4557a607c667175e026b60c6648a438e829 ShellPkg: Enhance 'cls' command to change the background and foreground colors As per ECR 1416 change in UEFI Shell Specification 2.2, enhancing 'cls' command to change the background color as well as foreground color. Also add support to display current settings using 'cls -sfo' command. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Tapan Shah Reviewed-by: Jaben Carsey --- diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c index 61b9ef854e..de79b825db 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c @@ -1,6 +1,7 @@ /** @file Main file for attrib shell level 2 function. + (C) Copyright 2016 Hewlett Packard Enterprise Development LP
(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials @@ -15,6 +16,11 @@ #include "UefiShellLevel3CommandsLib.h" +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + {L"-sfo", TypeFlag}, + {NULL, TypeMax} + }; + /** Function for 'cls' command. @@ -31,10 +37,11 @@ ShellCommandRunCls ( EFI_STATUS Status; LIST_ENTRY *Package; UINTN Background; - UINTN ForeColor; + UINTN Foreground; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; - CONST CHAR16 *Param1; + CONST CHAR16 *BackColorStr; + CONST CHAR16 *ForeColorStr; // // Initialize variables @@ -42,6 +49,7 @@ ShellCommandRunCls ( ShellStatus = SHELL_SUCCESS; ProblemParam = NULL; Background = 0; + Foreground = 0; // // initialize the shell lib (we must be in non-auto-init...) @@ -52,7 +60,7 @@ ShellCommandRunCls ( // // parse the command line // - Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"cls", ProblemParam); @@ -67,55 +75,143 @@ ShellCommandRunCls ( // if (ShellCommandLineGetFlag(Package, L"-?")) { ASSERT(FALSE); + } else if (ShellCommandLineGetFlag (Package, L"-sfo")) { + if (ShellCommandLineGetCount (Package) > 1) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + Background = (gST->ConOut->Mode->Attribute >> 4) & 0x7; + Foreground = gST->ConOut->Mode->Attribute & 0x0F; + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_CLS_OUTPUT_SFO), + gShellLevel3HiiHandle, + gST->ConOut->Mode->Attribute, + Foreground, + Background + ); + } } else { // // If there are 0 value parameters, clear sceen // - Param1 = ShellCommandLineGetRawValue(Package, 1); - if (Param1 == NULL) { + BackColorStr = ShellCommandLineGetRawValue (Package, 1); + ForeColorStr = ShellCommandLineGetRawValue (Package, 2); + + if (BackColorStr == NULL && ForeColorStr == NULL) { // // clear screen // gST->ConOut->ClearScreen (gST->ConOut); - } else if (ShellCommandLineGetCount(Package) > 2) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + } else if (ShellCommandLineGetCount (Package) > 3) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); ShellStatus = SHELL_INVALID_PARAMETER; } else { - if (ShellStrToUintn(Param1) > 7 || StrLen(Param1) > 1 || !ShellIsDecimalDigitCharacter(*Param1)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", Param1); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - switch (ShellStrToUintn(Param1)) { - case 0: - Background = EFI_BACKGROUND_BLACK; - break; - case 1: - Background = EFI_BACKGROUND_BLUE; - break; - case 2: - Background = EFI_BACKGROUND_GREEN; - break; - case 3: - Background = EFI_BACKGROUND_CYAN; - break; - case 4: - Background = EFI_BACKGROUND_RED; - break; - case 5: - Background = EFI_BACKGROUND_MAGENTA; - break; - case 6: - Background = EFI_BACKGROUND_BROWN; - break; - case 7: - Background = EFI_BACKGROUND_LIGHTGRAY; - break; + if (BackColorStr != NULL) { + if ((ShellStrToUintn (BackColorStr) > 7) || (StrLen (BackColorStr) > 1) || (!ShellIsDecimalDigitCharacter (*BackColorStr))) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", BackColorStr); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + switch (ShellStrToUintn (BackColorStr)) { + case 0: + Background = EFI_BACKGROUND_BLACK; + break; + case 1: + Background = EFI_BACKGROUND_BLUE; + break; + case 2: + Background = EFI_BACKGROUND_GREEN; + break; + case 3: + Background = EFI_BACKGROUND_CYAN; + break; + case 4: + Background = EFI_BACKGROUND_RED; + break; + case 5: + Background = EFI_BACKGROUND_MAGENTA; + break; + case 6: + Background = EFI_BACKGROUND_BROWN; + break; + case 7: + Background = EFI_BACKGROUND_LIGHTGRAY; + break; + } + + if (ForeColorStr != NULL) { + if ((ShellStrToUintn (ForeColorStr) > 15) || (StrLen (ForeColorStr) > 2) || (!ShellIsDecimalDigitCharacter (*ForeColorStr))) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", ForeColorStr); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + switch (ShellStrToUintn (ForeColorStr)) { + case 0: + Foreground = EFI_BLACK; + break; + case 1: + Foreground = EFI_BLUE; + break; + case 2: + Foreground = EFI_GREEN; + break; + case 3: + Foreground = EFI_CYAN; + break; + case 4: + Foreground = EFI_RED; + break; + case 5: + Foreground = EFI_MAGENTA; + break; + case 6: + Foreground = EFI_BROWN; + break; + case 7: + Foreground = EFI_LIGHTGRAY; + break; + case 8: + Foreground = EFI_DARKGRAY; + break; + case 9: + Foreground = EFI_LIGHTBLUE; + break; + case 10: + Foreground = EFI_LIGHTGREEN; + break; + case 11: + Foreground = EFI_LIGHTCYAN; + break; + case 12: + Foreground = EFI_LIGHTRED; + break; + case 13: + Foreground = EFI_LIGHTMAGENTA; + break; + case 14: + Foreground = EFI_YELLOW; + break; + case 15: + Foreground = EFI_WHITE; + break; + } + } + } else { + // + // Since foreground color is not modified, so retain + // existing foreground color without any change to it. + // + Foreground = gST->ConOut->Mode->Attribute & 0x0F; + } + + if (ShellStatus == SHELL_SUCCESS) { + Status = gST->ConOut->SetAttribute (gST->ConOut, (Foreground | Background) & 0x7F); + ASSERT_EFI_ERROR (Status); + Status = gST->ConOut->ClearScreen (gST->ConOut); + ASSERT_EFI_ERROR (Status); + } } - ForeColor = (~ShellStrToUintn(Param1)) & 0xF; - Status = gST->ConOut->SetAttribute (gST->ConOut, (ForeColor | Background) & 0x7F ); - ASSERT_EFI_ERROR(Status); - Status = gST->ConOut->ClearScreen (gST->ConOut); - ASSERT_EFI_ERROR(Status); } } } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni b/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni index fc9c5d447c..bbcb752ac0 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni @@ -1,5 +1,6 @@ // /** // +// (C) Copyright 2016 Hewlett Packard Enterprise Development LP
// (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
// Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.
// This program and the accompanying materials @@ -82,6 +83,7 @@ #string STR_ALIAS_OUTPUT #language en-US "%1c %10s:%s\r\n" #string STR_GET_MTC_OUTPUT #language en-US "%016Lx\r\n" +#string STR_CLS_OUTPUT_SFO #language en-US "ConOutAttribInfo,"%d","%d","%d"\r\n" #string STR_GET_HELP_HELP #language en-US "" ".TH help 0 "Displays help information from the UEFI Shell."\r\n" @@ -201,38 +203,62 @@ #string STR_GET_HELP_CLS #language en-US "" ".TH cls 0 "clear screen"\r\n" ".SH NAME\r\n" -"Clears standard output and optionally changes background color.\r\n" +"Clears the console output and optionally changes the background and foreground color.\r\n" ".SH SYNOPSIS\r\n" " \r\n" -"CLS [color]\r\n" +"CLS [background] [foreground] | [-sfo]\r\n" ".SH OPTIONS\r\n" " \r\n" -" color - Sets a new background color:\r\n" -" 0 - Black\r\n" -" 1 - Blue\r\n" -" 2 - Green\r\n" -" 3 - Cyan\r\n" -" 4 - Red\r\n" -" 5 - Magenta\r\n" -" 6 - Yellow\r\n" -" 7 - Light gray\r\n" +" background - Sets a new background color:\r\n" +" 0 - Black\r\n" +" 1 - Blue\r\n" +" 2 - Green\r\n" +" 3 - Cyan\r\n" +" 4 - Red\r\n" +" 5 - Magenta\r\n" +" 6 - Yellow\r\n" +" 7 - Light gray\r\n" +" foreground - Sets a new foreground color:\r\n" +" 0 - Black\r\n" +" 1 - Blue\r\n" +" 2 - Green\r\n" +" 3 - Cyan\r\n" +" 4 - Red\r\n" +" 5 - Magenta\r\n" +" 6 - Yellow\r\n" +" 7 - Light gray\r\n" +" 8 - Dark gray\r\n" +" 9 - Light blue\r\n" +" 10 - Light green\r\n" +" 11 - Light cyan\r\n" +" 12 - Light red\r\n" +" 13 - Light magenta\r\n" +" 14 - Yellow\r\n" +" 15 - White\r\n" +" -sfo - Displays current console color settings in Standard Format\r\n" +" Output.\r\n" ".SH DESCRIPTION\r\n" " \r\n" "NOTES:\r\n" " 1. This command clears the standard output device with an optional\r\n" -" background color attribute. If a color is not specified, then the\r\n" -" background color does not change.\r\n" +" background and foreground color attribute.\r\n" +" 2. If background color is not specified, or if background and foreground\r\n" +" colors are not specified, then the colors do not change.\r\n" +" 3. When -sfo flag is used, console output is not cleared and instead it\r\n" +" displays current console foreground and background attribute settings.\r\n" ".SH EXAMPLES\r\n" " \r\n" "EXAMPLES:\r\n" -" * To clear standard output without changing the background color:\r\n" +" * To clear standard output without changing the background or foreground\r\n" +" color:\r\n" " fs0:\> cls\r\n" " \r\n" " * To clear standard output and change the background color to cyan:\r\n" " fs0:\> cls 3\r\n" " \r\n" -" * To clear standard output and change the background to the default color:\r\n" -" fs0:\> cls 0\r\n" +" * To clear standard output and change the background to black and foreground\r\n" +" to white:\r\n" +" fs0:\> cls 0 15\r\n" ".SH RETURNVALUES\r\n" " \r\n" "RETURN VALUES:\r\n"