ShellPkg/[hex]edit: use SimpleTextInEx to read console
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / EditInputBar.c
index 26f70d7..6c6fc70 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implements inputbar interface functions.\r
 \r
-  Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>\r
+  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
 CHAR16  *mPrompt;        // Input bar mPrompt string.\r
 CHAR16  *mReturnString;  // The returned string.\r
 UINTN   StringSize;      // Size of mReturnString space size.\r
+EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *mTextInEx;\r
 \r
 /**\r
   Initialize the input bar.\r
+\r
+  @param[in] TextInEx  Pointer to SimpleTextInEx instance in System Table.\r
 **/\r
 VOID\r
 InputBarInit (\r
-  VOID\r
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx\r
   )\r
 {\r
   mPrompt       = NULL;\r
   mReturnString = NULL;\r
   StringSize    = 0;\r
+  mTextInEx     = TextInEx;\r
 }\r
 \r
 /**\r
@@ -125,7 +129,7 @@ InputBarRefresh (
 {\r
   INPUT_BAR_COLOR_UNION   Orig;\r
   INPUT_BAR_COLOR_UNION   New;\r
-  EFI_INPUT_KEY           Key;\r
+  EFI_KEY_DATA            KeyData;\r
   UINTN                   Size;\r
   EFI_STATUS              Status;\r
   BOOLEAN                 NoDisplay;\r
@@ -174,15 +178,25 @@ InputBarRefresh (
   // wait for user input\r
   //\r
   for (;;) {\r
-    gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
-    Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+    Status = gBS->WaitForEvent (1, &mTextInEx->WaitForKeyEx, &EventIndex);\r
+    if (EFI_ERROR (Status) || (EventIndex != 0)) {\r
+      continue;\r
+    }\r
+    Status = mTextInEx->ReadKeyStrokeEx (mTextInEx, &KeyData);\r
     if (EFI_ERROR (Status)) {\r
       continue;\r
     }\r
+    if (((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) != 0) &&\r
+        (KeyData.KeyState.KeyShiftState != EFI_SHIFT_STATE_VALID)) {\r
+      //\r
+      // Shift key pressed.\r
+      //\r
+      continue;\r
+    }\r
     //\r
     // pressed ESC\r
     //\r
-    if (Key.ScanCode == SCAN_ESC) {\r
+    if (KeyData.Key.ScanCode == SCAN_ESC) {\r
       Size    = 0;\r
       Status  = EFI_NOT_READY;\r
       break;\r
@@ -190,9 +204,9 @@ InputBarRefresh (
     //\r
     // return pressed\r
     //\r
-    if (Key.UnicodeChar == CHAR_LINEFEED || Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
+    if (KeyData.Key.UnicodeChar == CHAR_LINEFEED || KeyData.Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
       break;\r
-    } else if (Key.UnicodeChar == CHAR_BACKSPACE) {\r
+    } else if (KeyData.Key.UnicodeChar == CHAR_BACKSPACE) {\r
       //\r
       // backspace\r
       //\r
@@ -205,11 +219,11 @@ InputBarRefresh (
 \r
         }\r
       }\r
-    } else if (Key.UnicodeChar <= 127 && Key.UnicodeChar >= 32) {\r
+    } else if (KeyData.Key.UnicodeChar <= 127 && KeyData.Key.UnicodeChar >= 32) {\r
       //\r
       // VALID ASCII char pressed\r
       //\r
-      mReturnString[Size] = Key.UnicodeChar;\r
+      mReturnString[Size] = KeyData.Key.UnicodeChar;\r
 \r
       //\r
       // should be less than specified length\r