mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
Enhance Shell 2.0 to not depend on keyboard driver implementation to fix the "CTRL+s" pause malfunction issue.
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Carsey Jaben <jaben.carsey@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15052 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
de4ebdcfcd
commit
31c2a2c7c0
@ -2,7 +2,7 @@
|
|||||||
Provides interface to shell console logger.
|
Provides interface to shell console logger.
|
||||||
|
|
||||||
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
|
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
|
||||||
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2009 - 2013, 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
|
||||||
@ -819,22 +819,41 @@ ConsoleLoggerOutputString (
|
|||||||
IN CHAR16 *WString
|
IN CHAR16 *WString
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_INPUT_KEY Key;
|
EFI_STATUS Status;
|
||||||
UINTN EventIndex;
|
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx;
|
||||||
CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;
|
EFI_KEY_DATA KeyData;
|
||||||
|
UINTN EventIndex;
|
||||||
|
CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;
|
||||||
|
|
||||||
ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);
|
ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);
|
||||||
if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {
|
if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {
|
||||||
return (EFI_UNSUPPORTED);
|
return (EFI_UNSUPPORTED);
|
||||||
}
|
}
|
||||||
ASSERT(ShellInfoObject.ConsoleInfo == ConsoleInfo);
|
ASSERT(ShellInfoObject.ConsoleInfo == ConsoleInfo);
|
||||||
if (ShellInfoObject.HaltOutput) {
|
|
||||||
//
|
Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx);
|
||||||
// just get some key
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
while (ShellInfoObject.HaltOutput) {
|
||||||
gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
|
|
||||||
gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
ShellInfoObject.HaltOutput = FALSE;
|
||||||
ShellInfoObject.HaltOutput = FALSE;
|
//
|
||||||
|
// just get some key
|
||||||
|
//
|
||||||
|
Status = gBS->WaitForEvent (1, &TxtInEx->WaitForKeyEx, &EventIndex);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
if ((KeyData.Key.UnicodeChar == L's') && (KeyData.Key.ScanCode == SCAN_NULL) &&
|
||||||
|
((KeyData.KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED)) ||
|
||||||
|
(KeyData.KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID | EFI_RIGHT_CONTROL_PRESSED))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
ShellInfoObject.HaltOutput = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ShellInfoObject.ConsoleInfo->Enabled) {
|
if (!ShellInfoObject.ConsoleInfo->Enabled) {
|
||||||
return (EFI_DEVICE_ERROR);
|
return (EFI_DEVICE_ERROR);
|
||||||
} else if (ShellInfoObject.PageBreakEnabled) {
|
} else if (ShellInfoObject.PageBreakEnabled) {
|
||||||
|
@ -3297,7 +3297,6 @@ NotificationFunction(
|
|||||||
IN EFI_KEY_DATA *KeyData
|
IN EFI_KEY_DATA *KeyData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_INPUT_KEY Key;
|
|
||||||
if ( ((KeyData->Key.UnicodeChar == L'c') &&
|
if ( ((KeyData->Key.UnicodeChar == L'c') &&
|
||||||
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))) ||
|
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))) ||
|
||||||
(KeyData->Key.UnicodeChar == 3)
|
(KeyData->Key.UnicodeChar == 3)
|
||||||
@ -3310,12 +3309,6 @@ NotificationFunction(
|
|||||||
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))
|
(KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))
|
||||||
){
|
){
|
||||||
ShellInfoObject.HaltOutput = TRUE;
|
ShellInfoObject.HaltOutput = TRUE;
|
||||||
|
|
||||||
//
|
|
||||||
// Make sure that there are no pending keystrokes to pervent the pause.
|
|
||||||
//
|
|
||||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
|
||||||
while (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key)==EFI_SUCCESS);
|
|
||||||
}
|
}
|
||||||
return (EFI_SUCCESS);
|
return (EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user