mirror of https://github.com/acidanthera/audk.git
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:
parent
0a54cd4431
commit
5563281fa2
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Implements editor interface functions.
|
Implements editor interface functions.
|
||||||
|
|
||||||
Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved. <BR>
|
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -1362,7 +1362,9 @@ MainCommandDisplayHelp (
|
||||||
{
|
{
|
||||||
INT32 CurrentLine;
|
INT32 CurrentLine;
|
||||||
CHAR16 *InfoString;
|
CHAR16 *InfoString;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_KEY_DATA KeyData;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN EventIndex;
|
||||||
|
|
||||||
//
|
//
|
||||||
// print helpInfo
|
// print helpInfo
|
||||||
|
@ -1375,10 +1377,35 @@ MainCommandDisplayHelp (
|
||||||
//
|
//
|
||||||
// scan for ctrl+w
|
// scan for ctrl+w
|
||||||
//
|
//
|
||||||
do {
|
while (TRUE) {
|
||||||
gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
Status = gBS->WaitForEvent (1, &MainEditor.TextInputEx->WaitForKeyEx, &EventIndex);
|
||||||
} while(SCAN_CONTROL_W != Key.UnicodeChar);
|
if (EFI_ERROR (Status) || (EventIndex != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Status = MainEditor.TextInputEx->ReadKeyStrokeEx (MainEditor.TextInputEx, &KeyData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) == 0) {
|
||||||
|
//
|
||||||
|
// For consoles that don't support shift state reporting,
|
||||||
|
// CTRL+W is translated to L'W' - L'A' + 1.
|
||||||
|
//
|
||||||
|
if (KeyData.Key.UnicodeChar == L'W' - L'A' + 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) &&
|
||||||
|
((KeyData.KeyState.KeyShiftState & ~(EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) == 0)) {
|
||||||
|
//
|
||||||
|
// For consoles that supports shift state reporting,
|
||||||
|
// make sure that only CONTROL shift key is pressed.
|
||||||
|
//
|
||||||
|
if ((KeyData.Key.UnicodeChar == 'w') || (KeyData.Key.UnicodeChar == 'W')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// update screen with file buffer's info
|
// update screen with file buffer's info
|
||||||
//
|
//
|
||||||
|
@ -1407,6 +1434,7 @@ EFI_EDITOR_GLOBAL_EDITOR MainEditorConst = {
|
||||||
0
|
0
|
||||||
},
|
},
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -1452,6 +1480,19 @@ MainEditorInit (
|
||||||
&(MainEditor.ScreenSize.Row)
|
&(MainEditor.ScreenSize.Row)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find TextInEx in System Table ConsoleInHandle
|
||||||
|
// Per UEFI Spec, TextInEx is required for a console capable platform.
|
||||||
|
//
|
||||||
|
Status = gBS->HandleProtocol (
|
||||||
|
gST->ConsoleInHandle,
|
||||||
|
&gEfiSimpleTextInputExProtocolGuid,
|
||||||
|
(VOID**)&MainEditor.TextInputEx
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find mouse in System Table ConsoleInHandle
|
// Find mouse in System Table ConsoleInHandle
|
||||||
//
|
//
|
||||||
|
@ -1521,7 +1562,7 @@ MainEditorInit (
|
||||||
return EFI_LOAD_ERROR;
|
return EFI_LOAD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBarInit ();
|
InputBarInit (MainEditor.TextInputEx);
|
||||||
|
|
||||||
Status = FileBufferInit ();
|
Status = FileBufferInit ();
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
@ -1794,9 +1835,11 @@ MainEditorKeyInput (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_INPUT_KEY Key;
|
EFI_KEY_DATA KeyData;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SIMPLE_POINTER_STATE MouseState;
|
EFI_SIMPLE_POINTER_STATE MouseState;
|
||||||
|
UINTN EventIndex;
|
||||||
|
BOOLEAN NoShiftState;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
|
@ -1831,46 +1874,52 @@ MainEditorKeyInput (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
Status = gBS->WaitForEvent (1, &MainEditor.TextInputEx->WaitForKeyEx, &EventIndex);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status) && EventIndex == 0) {
|
||||||
//
|
Status = MainEditor.TextInputEx->ReadKeyStrokeEx (MainEditor.TextInputEx, &KeyData);
|
||||||
// dispatch to different components' key handling function
|
if (!EFI_ERROR (Status)) {
|
||||||
// so not everywhere has to set this variable
|
|
||||||
//
|
|
||||||
FileBufferMouseNeedRefresh = TRUE;
|
|
||||||
//
|
|
||||||
// clear previous status string
|
|
||||||
//
|
|
||||||
StatusBarSetRefresh();
|
|
||||||
|
|
||||||
//
|
|
||||||
// dispatch to different components' key handling function
|
|
||||||
//
|
|
||||||
if (EFI_NOT_FOUND != MenuBarDispatchControlHotKey(&Key)) {
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
} else if ((Key.ScanCode == SCAN_NULL) || ((Key.ScanCode >= SCAN_UP) && (Key.ScanCode <= SCAN_PAGE_DOWN))) {
|
|
||||||
Status = FileBufferHandleInput (&Key);
|
|
||||||
} else if ((Key.ScanCode >= SCAN_F1) && (Key.ScanCode <= SCAN_F12)) {
|
|
||||||
Status = MenuBarDispatchFunctionKey (&Key);
|
|
||||||
} else {
|
|
||||||
StatusBarSetStatusString (L"Unknown Command");
|
|
||||||
FileBufferMouseNeedRefresh = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Status != EFI_SUCCESS && Status != EFI_OUT_OF_RESOURCES) {
|
|
||||||
//
|
//
|
||||||
// not already has some error status
|
// dispatch to different components' key handling function
|
||||||
|
// so not everywhere has to set this variable
|
||||||
//
|
//
|
||||||
if (StatusBarGetString() != NULL && StrCmp (L"", StatusBarGetString()) == 0) {
|
FileBufferMouseNeedRefresh = TRUE;
|
||||||
StatusBarSetStatusString (L"Disk Error. Try Again");
|
//
|
||||||
|
// clear previous status string
|
||||||
|
//
|
||||||
|
StatusBarSetRefresh();
|
||||||
|
//
|
||||||
|
// NoShiftState: TRUE when no shift key is pressed.
|
||||||
|
//
|
||||||
|
NoShiftState = ((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) == 0) || (KeyData.KeyState.KeyShiftState == EFI_SHIFT_STATE_VALID);
|
||||||
|
//
|
||||||
|
// dispatch to different components' key handling function
|
||||||
|
//
|
||||||
|
if (EFI_NOT_FOUND != MenuBarDispatchControlHotKey(&KeyData)) {
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
} else if (NoShiftState && ((KeyData.Key.ScanCode == SCAN_NULL) || ((KeyData.Key.ScanCode >= SCAN_UP) && (KeyData.Key.ScanCode <= SCAN_PAGE_DOWN)))) {
|
||||||
|
Status = FileBufferHandleInput (&KeyData.Key);
|
||||||
|
} else if (NoShiftState && (KeyData.Key.ScanCode >= SCAN_F1) && (KeyData.Key.ScanCode <= SCAN_F12)) {
|
||||||
|
Status = MenuBarDispatchFunctionKey (&KeyData.Key);
|
||||||
|
} else {
|
||||||
|
StatusBarSetStatusString (L"Unknown Command");
|
||||||
|
FileBufferMouseNeedRefresh = FALSE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
if (Status != EFI_SUCCESS && Status != EFI_OUT_OF_RESOURCES) {
|
||||||
|
//
|
||||||
|
// not already has some error status
|
||||||
|
//
|
||||||
|
if (StatusBarGetString() != NULL && StrCmp (L"", StatusBarGetString()) == 0) {
|
||||||
|
StatusBarSetStatusString (L"Disk Error. Try Again");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// after handling, refresh editor
|
||||||
|
//
|
||||||
|
MainEditorRefresh ();
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// after handling, refresh editor
|
|
||||||
//
|
|
||||||
MainEditorRefresh ();
|
|
||||||
|
|
||||||
} while (Status != EFI_OUT_OF_RESOURCES && !EditorExit);
|
} while (Status != EFI_OUT_OF_RESOURCES && !EditorExit);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Declares editor types.
|
Declares editor types.
|
||||||
|
|
||||||
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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -87,15 +87,16 @@ typedef struct {
|
||||||
} EFI_EDITOR_FILE_BUFFER;
|
} EFI_EDITOR_FILE_BUFFER;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_EDITOR_FILE_BUFFER *FileBuffer;
|
EFI_EDITOR_FILE_BUFFER *FileBuffer;
|
||||||
|
|
||||||
EFI_EDITOR_COLOR_UNION ColorAttributes;
|
EFI_EDITOR_COLOR_UNION ColorAttributes;
|
||||||
EFI_EDITOR_POSITION ScreenSize; // row number and column number
|
EFI_EDITOR_POSITION ScreenSize; // row number and column number
|
||||||
EFI_EDITOR_LINE *CutLine; // clip board
|
EFI_EDITOR_LINE *CutLine; // clip board
|
||||||
BOOLEAN MouseSupported;
|
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
|
||||||
EFI_SIMPLE_POINTER_PROTOCOL *MouseInterface;
|
BOOLEAN MouseSupported;
|
||||||
INT32 MouseAccumulatorX;
|
EFI_SIMPLE_POINTER_PROTOCOL *MouseInterface;
|
||||||
INT32 MouseAccumulatorY;
|
INT32 MouseAccumulatorX;
|
||||||
|
INT32 MouseAccumulatorY;
|
||||||
|
|
||||||
} EFI_EDITOR_GLOBAL_EDITOR;
|
} EFI_EDITOR_GLOBAL_EDITOR;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Implements inputbar interface functions.
|
Implements inputbar interface functions.
|
||||||
|
|
||||||
Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>
|
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -18,18 +18,22 @@
|
||||||
CHAR16 *mPrompt; // Input bar mPrompt string.
|
CHAR16 *mPrompt; // Input bar mPrompt string.
|
||||||
CHAR16 *mReturnString; // The returned string.
|
CHAR16 *mReturnString; // The returned string.
|
||||||
UINTN StringSize; // Size of mReturnString space size.
|
UINTN StringSize; // Size of mReturnString space size.
|
||||||
|
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *mTextInEx;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the input bar.
|
Initialize the input bar.
|
||||||
|
|
||||||
|
@param[in] TextInEx Pointer to SimpleTextInEx instance in System Table.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
InputBarInit (
|
InputBarInit (
|
||||||
VOID
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
mPrompt = NULL;
|
mPrompt = NULL;
|
||||||
mReturnString = NULL;
|
mReturnString = NULL;
|
||||||
StringSize = 0;
|
StringSize = 0;
|
||||||
|
mTextInEx = TextInEx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -125,7 +129,7 @@ InputBarRefresh (
|
||||||
{
|
{
|
||||||
INPUT_BAR_COLOR_UNION Orig;
|
INPUT_BAR_COLOR_UNION Orig;
|
||||||
INPUT_BAR_COLOR_UNION New;
|
INPUT_BAR_COLOR_UNION New;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_KEY_DATA KeyData;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
BOOLEAN NoDisplay;
|
BOOLEAN NoDisplay;
|
||||||
|
@ -174,15 +178,25 @@ InputBarRefresh (
|
||||||
// wait for user input
|
// wait for user input
|
||||||
//
|
//
|
||||||
for (;;) {
|
for (;;) {
|
||||||
gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
|
Status = gBS->WaitForEvent (1, &mTextInEx->WaitForKeyEx, &EventIndex);
|
||||||
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
if (EFI_ERROR (Status) || (EventIndex != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Status = mTextInEx->ReadKeyStrokeEx (mTextInEx, &KeyData);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) != 0) &&
|
||||||
|
(KeyData.KeyState.KeyShiftState != EFI_SHIFT_STATE_VALID)) {
|
||||||
|
//
|
||||||
|
// Shift key pressed.
|
||||||
|
//
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// pressed ESC
|
// pressed ESC
|
||||||
//
|
//
|
||||||
if (Key.ScanCode == SCAN_ESC) {
|
if (KeyData.Key.ScanCode == SCAN_ESC) {
|
||||||
Size = 0;
|
Size = 0;
|
||||||
Status = EFI_NOT_READY;
|
Status = EFI_NOT_READY;
|
||||||
break;
|
break;
|
||||||
|
@ -190,9 +204,9 @@ InputBarRefresh (
|
||||||
//
|
//
|
||||||
// return pressed
|
// return pressed
|
||||||
//
|
//
|
||||||
if (Key.UnicodeChar == CHAR_LINEFEED || Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
|
if (KeyData.Key.UnicodeChar == CHAR_LINEFEED || KeyData.Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
|
||||||
break;
|
break;
|
||||||
} else if (Key.UnicodeChar == CHAR_BACKSPACE) {
|
} else if (KeyData.Key.UnicodeChar == CHAR_BACKSPACE) {
|
||||||
//
|
//
|
||||||
// backspace
|
// backspace
|
||||||
//
|
//
|
||||||
|
@ -205,11 +219,11 @@ InputBarRefresh (
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (Key.UnicodeChar <= 127 && Key.UnicodeChar >= 32) {
|
} else if (KeyData.Key.UnicodeChar <= 127 && KeyData.Key.UnicodeChar >= 32) {
|
||||||
//
|
//
|
||||||
// VALID ASCII char pressed
|
// VALID ASCII char pressed
|
||||||
//
|
//
|
||||||
mReturnString[Size] = Key.UnicodeChar;
|
mReturnString[Size] = KeyData.Key.UnicodeChar;
|
||||||
|
|
||||||
//
|
//
|
||||||
// should be less than specified length
|
// should be less than specified length
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Declares imputbar interface functions.
|
Declares imputbar 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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -17,10 +17,12 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the input bar.
|
Initialize the input bar.
|
||||||
|
|
||||||
|
@param[in] TextInEx Pointer to SimpleTextInEx instance in System Table.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
InputBarInit (
|
InputBarInit (
|
||||||
VOID
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
implements menubar interface functions.
|
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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
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...)
|
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
|
@retval EFI_NOT_FOUND The key was not a valid control-based key
|
||||||
(an error was sent to the status bar).
|
(an error was sent to the status bar).
|
||||||
|
@ -173,17 +173,41 @@ MenuBarDispatchFunctionKey (
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MenuBarDispatchControlHotKey (
|
MenuBarDispatchControlHotKey (
|
||||||
IN CONST EFI_INPUT_KEY *Key
|
IN CONST EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
UINT16 ControlIndex;
|
||||||
|
|
||||||
if ((SCAN_CONTROL_Z < Key->UnicodeChar)
|
//
|
||||||
||(NULL == ControlBasedMenuFunctions[Key->UnicodeChar]))
|
// 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;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlBasedMenuFunctions[Key->UnicodeChar]();
|
ControlBasedMenuFunctions[ControlIndex]();
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Declares menubar interface functions.
|
Declares 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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -105,7 +105,7 @@ MenuBarDispatchFunctionKey (
|
||||||
/**
|
/**
|
||||||
Function to dispatch the correct function based on a control-based key (ctrl+o...)
|
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
|
@retval EFI_NOT_FOUND The key was not a valid control-based key
|
||||||
(an error was sent to the status bar).
|
(an error was sent to the status bar).
|
||||||
|
@ -113,7 +113,7 @@ MenuBarDispatchFunctionKey (
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MenuBarDispatchControlHotKey (
|
MenuBarDispatchControlHotKey (
|
||||||
IN CONST EFI_INPUT_KEY *Key
|
IN CONST EFI_KEY_DATA *KeyData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
data types that are used by editor
|
data types that are used by editor
|
||||||
|
|
||||||
Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved. <BR>
|
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -109,17 +109,18 @@ typedef struct {
|
||||||
} HEFI_EDITOR_BUFFER_IMAGE;
|
} HEFI_EDITOR_BUFFER_IMAGE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HEFI_EDITOR_BUFFER_IMAGE *BufferImage;
|
HEFI_EDITOR_BUFFER_IMAGE *BufferImage;
|
||||||
|
|
||||||
HEFI_EDITOR_COLOR_UNION ColorAttributes;
|
HEFI_EDITOR_COLOR_UNION ColorAttributes;
|
||||||
HEFI_EDITOR_POSITION ScreenSize; // row number and column number
|
HEFI_EDITOR_POSITION ScreenSize; // row number and column number
|
||||||
BOOLEAN MouseSupported;
|
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
|
||||||
EFI_SIMPLE_POINTER_PROTOCOL *MouseInterface;
|
BOOLEAN MouseSupported;
|
||||||
INT32 MouseAccumulatorX;
|
EFI_SIMPLE_POINTER_PROTOCOL *MouseInterface;
|
||||||
INT32 MouseAccumulatorY;
|
INT32 MouseAccumulatorX;
|
||||||
|
INT32 MouseAccumulatorY;
|
||||||
|
|
||||||
UINTN SelectStart; // starting from 1
|
UINTN SelectStart; // starting from 1
|
||||||
UINTN SelectEnd; // starting from 1
|
UINTN SelectEnd; // starting from 1
|
||||||
} HEFI_EDITOR_GLOBAL_EDITOR;
|
} HEFI_EDITOR_GLOBAL_EDITOR;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
- Instances of the other objects of the editor
|
- Instances of the other objects of the editor
|
||||||
- Main Interfaces
|
- Main Interfaces
|
||||||
|
|
||||||
Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved. <BR>
|
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -56,6 +56,7 @@ HEFI_EDITOR_GLOBAL_EDITOR HMainEditorConst = {
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
},
|
},
|
||||||
|
NULL,
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL,
|
NULL,
|
||||||
0,
|
0,
|
||||||
|
@ -105,22 +106,53 @@ HMainCommandDisplayHelp (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INT32 CurrentLine;
|
INT32 CurrentLine;
|
||||||
CHAR16 * InfoString;
|
CHAR16 *InfoString;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_KEY_DATA KeyData;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN EventIndex;
|
||||||
|
|
||||||
CurrentLine = 0;
|
//
|
||||||
// print helpInfo
|
// print helpInfo
|
||||||
|
//
|
||||||
for (CurrentLine = 0; 0 != HexMainMenuHelpInfo[CurrentLine]; CurrentLine++) {
|
for (CurrentLine = 0; 0 != HexMainMenuHelpInfo[CurrentLine]; CurrentLine++) {
|
||||||
InfoString = HiiGetString(gShellDebug1HiiHandle, HexMainMenuHelpInfo[CurrentLine]
|
InfoString = HiiGetString(gShellDebug1HiiHandle, HexMainMenuHelpInfo[CurrentLine]
|
||||||
, NULL);
|
, NULL);
|
||||||
ShellPrintEx (0,CurrentLine+1,L"%E%s%N",InfoString);
|
ShellPrintEx (0,CurrentLine+1,L"%E%s%N",InfoString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
// scan for ctrl+w
|
// scan for ctrl+w
|
||||||
do {
|
//
|
||||||
gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
while (TRUE) {
|
||||||
} while(SCAN_CONTROL_W != Key.UnicodeChar);
|
Status = gBS->WaitForEvent (1, &HMainEditor.TextInputEx->WaitForKeyEx, &EventIndex);
|
||||||
|
if (EFI_ERROR (Status) || (EventIndex != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Status = HMainEditor.TextInputEx->ReadKeyStrokeEx (HMainEditor.TextInputEx, &KeyData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) == 0) {
|
||||||
|
//
|
||||||
|
// For consoles that don't support shift state reporting,
|
||||||
|
// CTRL+W is translated to L'W' - L'A' + 1.
|
||||||
|
//
|
||||||
|
if (KeyData.Key.UnicodeChar == L'W' - L'A' + 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) &&
|
||||||
|
((KeyData.KeyState.KeyShiftState & ~(EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) == 0)) {
|
||||||
|
//
|
||||||
|
// For consoles that supports shift state reporting,
|
||||||
|
// make sure that only CONTROL shift key is pressed.
|
||||||
|
//
|
||||||
|
if ((KeyData.Key.UnicodeChar == 'w') || (KeyData.Key.UnicodeChar == 'W')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// update screen with buffer's info
|
// update screen with buffer's info
|
||||||
HBufferImageNeedRefresh = TRUE;
|
HBufferImageNeedRefresh = TRUE;
|
||||||
|
@ -1633,6 +1665,19 @@ HMainEditorInit (
|
||||||
&(HMainEditor.ScreenSize.Row)
|
&(HMainEditor.ScreenSize.Row)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find TextInEx in System Table ConsoleInHandle
|
||||||
|
// Per UEFI Spec, TextInEx is required for a console capable platform.
|
||||||
|
//
|
||||||
|
Status = gBS->HandleProtocol (
|
||||||
|
gST->ConsoleInHandle,
|
||||||
|
&gEfiSimpleTextInputExProtocolGuid,
|
||||||
|
(VOID**)&HMainEditor.TextInputEx
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find mouse in System Table ConsoleInHandle
|
// Find mouse in System Table ConsoleInHandle
|
||||||
//
|
//
|
||||||
|
@ -1706,7 +1751,7 @@ HMainEditorInit (
|
||||||
return EFI_LOAD_ERROR;
|
return EFI_LOAD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBarInit ();
|
InputBarInit (HMainEditor.TextInputEx);
|
||||||
|
|
||||||
Status = HBufferImageInit ();
|
Status = HBufferImageInit ();
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
@ -2058,9 +2103,11 @@ HMainEditorKeyInput (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_INPUT_KEY Key;
|
EFI_KEY_DATA KeyData;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SIMPLE_POINTER_STATE MouseState;
|
EFI_SIMPLE_POINTER_STATE MouseState;
|
||||||
|
UINTN EventIndex;
|
||||||
|
BOOLEAN NoShiftState;
|
||||||
BOOLEAN LengthChange;
|
BOOLEAN LengthChange;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
UINTN OldSize;
|
UINTN OldSize;
|
||||||
|
@ -2219,84 +2266,94 @@ HMainEditorKeyInput (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
Status = gBS->WaitForEvent (1, &HMainEditor.TextInputEx->WaitForKeyEx, &EventIndex);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status) && EventIndex == 0) {
|
||||||
//
|
Status = HMainEditor.TextInputEx->ReadKeyStrokeEx (HMainEditor.TextInputEx, &KeyData);
|
||||||
// dispatch to different components' key handling function
|
if (!EFI_ERROR (Status)) {
|
||||||
// so not everywhere has to set this variable
|
|
||||||
//
|
|
||||||
HBufferImageMouseNeedRefresh = TRUE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// clear previous status string
|
|
||||||
//
|
|
||||||
StatusBarSetRefresh();
|
|
||||||
if (EFI_SUCCESS == MenuBarDispatchControlHotKey(&Key)) {
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
} else if (Key.ScanCode == SCAN_NULL) {
|
|
||||||
Status = HBufferImageHandleInput (&Key);
|
|
||||||
} else if (((Key.ScanCode >= SCAN_UP) && (Key.ScanCode <= SCAN_PAGE_DOWN))) {
|
|
||||||
Status = HBufferImageHandleInput (&Key);
|
|
||||||
} else if (((Key.ScanCode >= SCAN_F1) && Key.ScanCode <= (SCAN_F12))) {
|
|
||||||
Status = MenuBarDispatchFunctionKey (&Key);
|
|
||||||
} else {
|
|
||||||
StatusBarSetStatusString (L"Unknown Command");
|
|
||||||
|
|
||||||
HBufferImageMouseNeedRefresh = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Status != EFI_SUCCESS && Status != EFI_OUT_OF_RESOURCES) {
|
|
||||||
//
|
//
|
||||||
// not already has some error status
|
// dispatch to different components' key handling function
|
||||||
|
// so not everywhere has to set this variable
|
||||||
//
|
//
|
||||||
if (StrCmp (L"", StatusBarGetString()) == 0) {
|
HBufferImageMouseNeedRefresh = TRUE;
|
||||||
StatusBarSetStatusString (L"Disk Error. Try Again");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// decide if has to set length warning
|
|
||||||
//
|
|
||||||
if (HBufferImage.BufferType != HBufferImageBackupVar.BufferType) {
|
|
||||||
LengthChange = FALSE;
|
|
||||||
} else {
|
|
||||||
//
|
|
||||||
// still the old buffer
|
|
||||||
//
|
|
||||||
if (HBufferImage.BufferType != FileTypeFileBuffer) {
|
|
||||||
Size = HBufferImageGetTotalSize ();
|
|
||||||
|
|
||||||
switch (HBufferImage.BufferType) {
|
//
|
||||||
case FileTypeDiskBuffer:
|
// clear previous status string
|
||||||
OldSize = HBufferImage.DiskImage->Size * HBufferImage.DiskImage->BlockSize;
|
//
|
||||||
break;
|
StatusBarSetRefresh();
|
||||||
|
//
|
||||||
|
// NoShiftState: TRUE when no shift key is pressed.
|
||||||
|
//
|
||||||
|
NoShiftState = ((KeyData.KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) == 0) || (KeyData.KeyState.KeyShiftState == EFI_SHIFT_STATE_VALID);
|
||||||
|
//
|
||||||
|
// dispatch to different components' key handling function
|
||||||
|
//
|
||||||
|
if (EFI_SUCCESS == MenuBarDispatchControlHotKey(&KeyData)) {
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
} else if (NoShiftState && KeyData.Key.ScanCode == SCAN_NULL) {
|
||||||
|
Status = HBufferImageHandleInput (&KeyData.Key);
|
||||||
|
} else if (NoShiftState && ((KeyData.Key.ScanCode >= SCAN_UP) && (KeyData.Key.ScanCode <= SCAN_PAGE_DOWN))) {
|
||||||
|
Status = HBufferImageHandleInput (&KeyData.Key);
|
||||||
|
} else if (NoShiftState && ((KeyData.Key.ScanCode >= SCAN_F1) && KeyData.Key.ScanCode <= SCAN_F12)) {
|
||||||
|
Status = MenuBarDispatchFunctionKey (&KeyData.Key);
|
||||||
|
} else {
|
||||||
|
StatusBarSetStatusString (L"Unknown Command");
|
||||||
|
|
||||||
case FileTypeMemBuffer:
|
HBufferImageMouseNeedRefresh = FALSE;
|
||||||
OldSize = HBufferImage.MemImage->Size;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
OldSize = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LengthChange) {
|
if (Status != EFI_SUCCESS && Status != EFI_OUT_OF_RESOURCES) {
|
||||||
if (OldSize != Size) {
|
//
|
||||||
StatusBarSetStatusString (L"Disk/Mem Buffer Length should not be changed");
|
// not already has some error status
|
||||||
|
//
|
||||||
|
if (StrCmp (L"", StatusBarGetString()) == 0) {
|
||||||
|
StatusBarSetStatusString (L"Disk Error. Try Again");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// decide if has to set length warning
|
||||||
|
//
|
||||||
|
if (HBufferImage.BufferType != HBufferImageBackupVar.BufferType) {
|
||||||
|
LengthChange = FALSE;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// still the old buffer
|
||||||
|
//
|
||||||
|
if (HBufferImage.BufferType != FileTypeFileBuffer) {
|
||||||
|
Size = HBufferImageGetTotalSize ();
|
||||||
|
|
||||||
if (OldSize != Size) {
|
switch (HBufferImage.BufferType) {
|
||||||
LengthChange = TRUE;
|
case FileTypeDiskBuffer:
|
||||||
} else {
|
OldSize = HBufferImage.DiskImage->Size * HBufferImage.DiskImage->BlockSize;
|
||||||
LengthChange = FALSE;
|
break;
|
||||||
|
|
||||||
|
case FileTypeMemBuffer:
|
||||||
|
OldSize = HBufferImage.MemImage->Size;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
OldSize = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LengthChange) {
|
||||||
|
if (OldSize != Size) {
|
||||||
|
StatusBarSetStatusString (L"Disk/Mem Buffer Length should not be changed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OldSize != Size) {
|
||||||
|
LengthChange = TRUE;
|
||||||
|
} else {
|
||||||
|
LengthChange = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
// after handling, refresh editor
|
||||||
|
//
|
||||||
|
HMainEditorRefresh ();
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// after handling, refresh editor
|
|
||||||
//
|
|
||||||
HMainEditorRefresh ();
|
|
||||||
|
|
||||||
} while (Status != EFI_OUT_OF_RESOURCES && !HEditorExit);
|
} while (Status != EFI_OUT_OF_RESOURCES && !HEditorExit);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue