\r
#include "Terminal.h"\r
\r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+ IN OUT LIST_ENTRY *ListHead\r
+ ); \r
+\r
//\r
// Globals\r
//\r
NULL, \r
INPUT_STATE_DEFAULT,\r
RESET_STATE_DEFAULT,\r
- FALSE\r
+ FALSE,\r
+ { // SimpleTextInputEx\r
+ TerminalConInResetEx,\r
+ TerminalConInReadKeyStrokeEx,\r
+ NULL,\r
+ TerminalConInSetState,\r
+ TerminalConInRegisterKeyNotify,\r
+ TerminalConInUnregisterKeyNotify,\r
+ },\r
+ {\r
+ NULL,\r
+ NULL,\r
+ }\r
};\r
\r
\r
TerminalDevice->TerminalType = TerminalType;\r
TerminalDevice->SerialIo = SerialIo;\r
\r
+ InitializeListHead (&TerminalDevice->NotifyList);\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ TerminalConInWaitForKeyEx,\r
+ &TerminalDevice->SimpleInputEx,\r
+ &TerminalDevice->SimpleInputEx.WaitForKeyEx\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
+\r
+\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
if (EFI_ERROR (Status)) {\r
goto Error;\r
}\r
-\r
//\r
// initialize the FIFO buffer used for accommodating\r
// the pre-read pending characters\r
// keystroke response performance issue\r
//\r
Mode = TerminalDevice->SerialIo->Mode;\r
+\r
SerialInTimeOut = 0;\r
if (Mode->BaudRate != 0) {\r
SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;\r
TerminalDevice->DevicePath,\r
&gEfiSimpleTextInProtocolGuid,\r
&TerminalDevice->SimpleInput,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ &TerminalDevice->SimpleInputEx,\r
&gEfiSimpleTextOutProtocolGuid,\r
&TerminalDevice->SimpleTextOutput,\r
NULL\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
}\r
\r
+ if (TerminalDevice->SimpleInputEx.WaitForKeyEx != NULL) {\r
+ gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+ }\r
+\r
+ TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
+\r
if (TerminalDevice->ControllerNameTable != NULL) {\r
FreeUnicodeStringTable (TerminalDevice->ControllerNameTable);\r
}\r
ChildHandleBuffer[Index],\r
&gEfiSimpleTextInProtocolGuid,\r
&TerminalDevice->SimpleInput,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ &TerminalDevice->SimpleInputEx,\r
&gEfiSimpleTextOutProtocolGuid,\r
&TerminalDevice->SimpleTextOutput,\r
&gEfiDevicePathProtocolGuid,\r
\r
gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut);\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
+ gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+ TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
FreePool (TerminalDevice->DevicePath);\r
FreePool (TerminalDevice);\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+ IN OUT LIST_ENTRY *ListHead\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+ ListHead - The list head\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - Free the notify list successfully\r
+ EFI_INVALID_PARAMETER - ListHead is invalid.\r
+\r
+--*/\r
+{\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
+\r
+ if (ListHead == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ while (!IsListEmpty (ListHead)) {\r
+ NotifyNode = CR (\r
+ ListHead->ForwardLink, \r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY, \r
+ NotifyEntry, \r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
+ );\r
+ RemoveEntryList (ListHead->ForwardLink);\r
+ gBS->FreePool (NotifyNode);\r
+ }\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
VOID\r
TerminalUpdateConsoleDevVariable (\r
IN CHAR16 *VariableName,\r