From: Tapan Shah <tapandshah@hpe.com>
To: edk2-devel@lists.01.org
Cc: jaben.carsey@intel.com, Tapan Shah <tapandshah@hpe.com>
Subject: [PATCH] ShellPkg: Enhance 'cls' command to change the background and foreground colors
Date: Fri, 23 Sep 2016 11:03:16 -0500 [thread overview]
Message-ID: <1474646596-12260-1-git-send-email-tapandshah@hpe.com> (raw)
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 <tapandshah@hpe.com>
---
ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c | 178 ++++++++++++++++-----
.../UefiShellLevel3CommandsLib.uni | 58 +++++--
2 files changed, 179 insertions(+), 57 deletions(-)
diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c
index 61b9ef8..08ae96c 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<BR>
(C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
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 fc9c5d4..bbcb752 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<BR>
// (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
// Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved. <BR>
// 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"
--
1.9.5.msysgit.0
next reply other threads:[~2016-09-23 16:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-23 16:03 Tapan Shah [this message]
2016-09-26 20:10 ` [PATCH] ShellPkg: Enhance 'cls' command to change the background and foreground colors Carsey, Jaben
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=1474646596-12260-1-git-send-email-tapandshah@hpe.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