ShellPkg/[hex]edit: use SimpleTextInEx to read console
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=682 Edit and HexEdit commands assume that SimpleTxtIn translates Ctrl+<Alpha-Key> key combinations into Unicode control characters (0x1-0x1A). Such translation does not seem to be required by the UEFI spec. Shell should not rely on implementation specific behavior. It should instead use SimpleTextInEx to read Ctrl+<Alpha-Key> key combinations. The patch changes edit and hexedit to only consumes SimpleTextInEx so that the implementation specific behavior dependency is removed. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reported-by: Felix <felixp@mail.ru> Cc: Felix <felixp@mail.ru> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
implements menubar interface functions.
|
||||
|
||||
Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>
|
||||
Copyright (c) 2005 - 2018, 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
|
||||
@ -165,7 +165,7 @@ MenuBarDispatchFunctionKey (
|
||||
/**
|
||||
Function to dispatch the correct function based on a control-based key (ctrl+o...)
|
||||
|
||||
@param[in] Key The pressed key.
|
||||
@param[in] KeyData The pressed key.
|
||||
|
||||
@retval EFI_NOT_FOUND The key was not a valid control-based key
|
||||
(an error was sent to the status bar).
|
||||
@ -173,17 +173,41 @@ MenuBarDispatchFunctionKey (
|
||||
**/
|
||||
EFI_STATUS
|
||||
MenuBarDispatchControlHotKey (
|
||||
IN CONST EFI_INPUT_KEY *Key
|
||||
IN CONST EFI_KEY_DATA *KeyData
|
||||
)
|
||||
{
|
||||
|
||||
if ((SCAN_CONTROL_Z < Key->UnicodeChar)
|
||||
||(NULL == ControlBasedMenuFunctions[Key->UnicodeChar]))
|
||||
UINT16 ControlIndex;
|
||||
|
||||
//
|
||||
// Set to invalid value first.
|
||||
//
|
||||
ControlIndex = MAX_UINT16;
|
||||
|
||||
if ((KeyData->KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) == 0) {
|
||||
//
|
||||
// For those console devices that cannot report the CONTROL state,
|
||||
// Ctrl+A is translated to 1 (UnicodeChar).
|
||||
//
|
||||
ControlIndex = KeyData->Key.UnicodeChar;
|
||||
} else if (((KeyData->KeyState.KeyShiftState & (EFI_RIGHT_CONTROL_PRESSED | EFI_LEFT_CONTROL_PRESSED)) != 0) &&
|
||||
((KeyData->KeyState.KeyShiftState & ~(EFI_SHIFT_STATE_VALID | EFI_RIGHT_CONTROL_PRESSED | EFI_LEFT_CONTROL_PRESSED)) == 0)) {
|
||||
//
|
||||
// For those console devices that can report the CONTROL state,
|
||||
// make sure only CONTROL is pressed.
|
||||
//
|
||||
if ((KeyData->Key.UnicodeChar >= L'A') && (KeyData->Key.UnicodeChar <= L'Z')) {
|
||||
ControlIndex = KeyData->Key.UnicodeChar - L'A' + 1;
|
||||
} else if ((KeyData->Key.UnicodeChar >= L'a') && (KeyData->Key.UnicodeChar <= L'z')) {
|
||||
ControlIndex = KeyData->Key.UnicodeChar - L'a' + 1;
|
||||
}
|
||||
}
|
||||
if ((SCAN_CONTROL_Z < ControlIndex)
|
||||
||(NULL == ControlBasedMenuFunctions[ControlIndex]))
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
ControlBasedMenuFunctions[Key->UnicodeChar]();
|
||||
ControlBasedMenuFunctions[ControlIndex]();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user