EFI_HII_STRING_PROTOCOL *mHiiString;\r
EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting;\r
\r
+UINTN gBrowserContextCount = 0;\r
+LIST_ENTRY gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserContextList);\r
+\r
BANNER_DATA *gBannerData;\r
EFI_HII_HANDLE gFrontPageHandle;\r
UINTN gClassOfVfr;\r
EFI_HII_HANDLE gHiiHandle;\r
UINT16 gDirection;\r
EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-BOOLEAN gUpArrow;\r
-BOOLEAN gDownArrow;\r
\r
//\r
// Browser Global Strings\r
0xab368524, 0xb60c, 0x495b, {0xa0, 0x9, 0x12, 0xe8, 0x5b, 0x1a, 0xea, 0x32}\r
};\r
\r
-FORM_BROWSER_FORMSET *gOldFormSet = NULL;\r
+FORM_BROWSER_FORMSET *gOldFormSet;\r
\r
FUNCTIION_KEY_SETTING gFunctionKeySettingTable[] = {\r
//\r
UINTN Index;\r
FORM_BROWSER_FORMSET *FormSet;\r
\r
+ //\r
+ // Save globals used by SendForm()\r
+ //\r
+ SaveBrowserContext ();\r
+\r
Status = EFI_SUCCESS;\r
ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
\r
if ((gScreenDimensions.RightColumn < ScreenDimensions->RightColumn) ||\r
(gScreenDimensions.BottomRow < ScreenDimensions->BottomRow)\r
) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
} else {\r
//\r
// Local dimension validation.\r
) {\r
CopyMem (&gScreenDimensions, (VOID *) ScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
} else {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
}\r
}\r
Selection->FormId = FormId;\r
}\r
\r
+ gOldFormSet = NULL;\r
gNvUpdateRequired = FALSE;\r
\r
do {\r
gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
gST->ConOut->ClearScreen (gST->ConOut);\r
\r
+Done:\r
+ //\r
+ // Restore globals used by SendForm()\r
+ //\r
+ RestoreBrowserContext ();\r
+\r
return Status;\r
}\r
\r
\r
return Status;\r
}\r
+\r
+\r
+/**\r
+ Save globals used by previous call to SendForm(). SendForm() may be called from \r
+ HiiConfigAccess.Callback(), this will cause SendForm() be reentried.\r
+ So, save globals of previous call to SendForm() and restore them upon exit.\r
+\r
+**/\r
+VOID\r
+SaveBrowserContext (\r
+ VOID\r
+ )\r
+{\r
+ BROWSER_CONTEXT *Context;\r
+\r
+ gBrowserContextCount++;\r
+ if (gBrowserContextCount == 1) {\r
+ //\r
+ // This is not reentry of SendForm(), no context to save\r
+ //\r
+ return;\r
+ }\r
+\r
+ Context = AllocatePool (sizeof (BROWSER_CONTEXT));\r
+ ASSERT (Context != NULL);\r
+\r
+ Context->Signature = BROWSER_CONTEXT_SIGNATURE;\r
+\r
+ //\r
+ // Save FormBrowser context\r
+ //\r
+ Context->BannerData = gBannerData;\r
+ Context->ClassOfVfr = gClassOfVfr;\r
+ Context->FunctionKeySetting = gFunctionKeySetting;\r
+ Context->ResetRequired = gResetRequired;\r
+ Context->NvUpdateRequired = gNvUpdateRequired;\r
+ Context->Direction = gDirection;\r
+ Context->FunctionNineString = gFunctionNineString;\r
+ Context->FunctionTenString = gFunctionTenString;\r
+ Context->EnterString = gEnterString;\r
+ Context->EnterCommitString = gEnterCommitString;\r
+ Context->EnterEscapeString = gEnterEscapeString;\r
+ Context->EscapeString = gEscapeString;\r
+ Context->SaveFailed = gSaveFailed;\r
+ Context->MoveHighlight = gMoveHighlight;\r
+ Context->MakeSelection = gMakeSelection;\r
+ Context->DecNumericInput = gDecNumericInput;\r
+ Context->HexNumericInput = gHexNumericInput;\r
+ Context->ToggleCheckBox = gToggleCheckBox;\r
+ Context->PromptForData = gPromptForData;\r
+ Context->PromptForPassword = gPromptForPassword;\r
+ Context->PromptForNewPassword = gPromptForNewPassword;\r
+ Context->ConfirmPassword = gConfirmPassword;\r
+ Context->ConfirmError = gConfirmError;\r
+ Context->PassowordInvalid = gPassowordInvalid;\r
+ Context->PressEnter = gPressEnter;\r
+ Context->EmptyString = gEmptyString;\r
+ Context->AreYouSure = gAreYouSure;\r
+ Context->YesResponse = gYesResponse;\r
+ Context->NoResponse = gNoResponse;\r
+ Context->MiniString = gMiniString;\r
+ Context->PlusString = gPlusString;\r
+ Context->MinusString = gMinusString;\r
+ Context->AdjustNumber = gAdjustNumber;\r
+ Context->SaveChanges = gSaveChanges;\r
+ Context->OptionMismatch = gOptionMismatch;\r
+ Context->PromptBlockWidth = gPromptBlockWidth;\r
+ Context->OptionBlockWidth = gOptionBlockWidth;\r
+ Context->HelpBlockWidth = gHelpBlockWidth;\r
+ Context->OldFormSet = gOldFormSet;\r
+ Context->MenuRefreshHead = gMenuRefreshHead;\r
+\r
+ CopyMem (&Context->ScreenDimensions, &gScreenDimensions, sizeof (gScreenDimensions));\r
+ CopyMem (&Context->MenuOption, &gMenuOption, sizeof (gMenuOption));\r
+\r
+ //\r
+ // Insert to FormBrowser context list\r
+ //\r
+ InsertHeadList (&gBrowserContextList, &Context->Link);\r
+}\r
+\r
+\r
+/**\r
+ Restore globals used by previous call to SendForm().\r
+\r
+**/\r
+VOID\r
+RestoreBrowserContext (\r
+ VOID\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ BROWSER_CONTEXT *Context;\r
+\r
+ ASSERT (gBrowserContextCount != 0);\r
+ gBrowserContextCount--;\r
+ if (gBrowserContextCount == 0) {\r
+ //\r
+ // This is not reentry of SendForm(), no context to restore\r
+ //\r
+ return;\r
+ }\r
+\r
+ ASSERT (!IsListEmpty (&gBrowserContextList));\r
+\r
+ Link = GetFirstNode (&gBrowserContextList);\r
+ Context = BROWSER_CONTEXT_FROM_LINK (Link);\r
+\r
+ //\r
+ // Restore FormBrowser context\r
+ //\r
+ gBannerData = Context->BannerData;\r
+ gClassOfVfr = Context->ClassOfVfr;\r
+ gFunctionKeySetting = Context->FunctionKeySetting;\r
+ gResetRequired = Context->ResetRequired;\r
+ gNvUpdateRequired = Context->NvUpdateRequired;\r
+ gDirection = Context->Direction;\r
+ gFunctionNineString = Context->FunctionNineString;\r
+ gFunctionTenString = Context->FunctionTenString;\r
+ gEnterString = Context->EnterString;\r
+ gEnterCommitString = Context->EnterCommitString;\r
+ gEnterEscapeString = Context->EnterEscapeString;\r
+ gEscapeString = Context->EscapeString;\r
+ gSaveFailed = Context->SaveFailed;\r
+ gMoveHighlight = Context->MoveHighlight;\r
+ gMakeSelection = Context->MakeSelection;\r
+ gDecNumericInput = Context->DecNumericInput;\r
+ gHexNumericInput = Context->HexNumericInput;\r
+ gToggleCheckBox = Context->ToggleCheckBox;\r
+ gPromptForData = Context->PromptForData;\r
+ gPromptForPassword = Context->PromptForPassword;\r
+ gPromptForNewPassword = Context->PromptForNewPassword;\r
+ gConfirmPassword = Context->ConfirmPassword;\r
+ gConfirmError = Context->ConfirmError;\r
+ gPassowordInvalid = Context->PassowordInvalid;\r
+ gPressEnter = Context->PressEnter;\r
+ gEmptyString = Context->EmptyString;\r
+ gAreYouSure = Context->AreYouSure;\r
+ gYesResponse = Context->YesResponse;\r
+ gNoResponse = Context->NoResponse;\r
+ gMiniString = Context->MiniString;\r
+ gPlusString = Context->PlusString;\r
+ gMinusString = Context->MinusString;\r
+ gAdjustNumber = Context->AdjustNumber;\r
+ gSaveChanges = Context->SaveChanges;\r
+ gOptionMismatch = Context->OptionMismatch;\r
+ gPromptBlockWidth = Context->PromptBlockWidth;\r
+ gOptionBlockWidth = Context->OptionBlockWidth;\r
+ gHelpBlockWidth = Context->HelpBlockWidth;\r
+ gOldFormSet = Context->OldFormSet;\r
+ gMenuRefreshHead = Context->MenuRefreshHead;\r
+\r
+ CopyMem (&gScreenDimensions, &Context->ScreenDimensions, sizeof (gScreenDimensions));\r
+ CopyMem (&gMenuOption, &Context->MenuOption, sizeof (gMenuOption));\r
+\r
+ //\r
+ // Remove from FormBrowser context list\r
+ //\r
+ RemoveEntryList (&Context->Link);\r
+ gBS->FreePool (Context);\r
+}\r
LIST_ENTRY FormListHead; // Form list (FORM_BROWSER_FORM)\r
} FORM_BROWSER_FORMSET;\r
\r
+#define BROWSER_CONTEXT_SIGNATURE SIGNATURE_32 ('B', 'C', 'T', 'X')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ //\r
+ // Globals defined in Setup.c\r
+ //\r
+ BANNER_DATA *BannerData;\r
+ UINTN ClassOfVfr;\r
+ UINTN FunctionKeySetting;\r
+ BOOLEAN ResetRequired;\r
+ BOOLEAN NvUpdateRequired;\r
+ UINT16 Direction;\r
+ EFI_SCREEN_DESCRIPTOR ScreenDimensions;\r
+ CHAR16 *FunctionNineString;\r
+ CHAR16 *FunctionTenString;\r
+ CHAR16 *EnterString;\r
+ CHAR16 *EnterCommitString;\r
+ CHAR16 *EnterEscapeString;\r
+ CHAR16 *EscapeString;\r
+ CHAR16 *SaveFailed;\r
+ CHAR16 *MoveHighlight;\r
+ CHAR16 *MakeSelection;\r
+ CHAR16 *DecNumericInput;\r
+ CHAR16 *HexNumericInput;\r
+ CHAR16 *ToggleCheckBox;\r
+ CHAR16 *PromptForData;\r
+ CHAR16 *PromptForPassword;\r
+ CHAR16 *PromptForNewPassword;\r
+ CHAR16 *ConfirmPassword;\r
+ CHAR16 *ConfirmError;\r
+ CHAR16 *PassowordInvalid;\r
+ CHAR16 *PressEnter;\r
+ CHAR16 *EmptyString;\r
+ CHAR16 *AreYouSure;\r
+ CHAR16 *YesResponse;\r
+ CHAR16 *NoResponse;\r
+ CHAR16 *MiniString;\r
+ CHAR16 *PlusString;\r
+ CHAR16 *MinusString;\r
+ CHAR16 *AdjustNumber;\r
+ CHAR16 *SaveChanges;\r
+ CHAR16 *OptionMismatch;\r
+ CHAR16 PromptBlockWidth;\r
+ CHAR16 OptionBlockWidth;\r
+ CHAR16 HelpBlockWidth;\r
+ FORM_BROWSER_FORMSET *OldFormSet;\r
+\r
+ //\r
+ // Globals defined in Ui.c\r
+ //\r
+ LIST_ENTRY MenuOption;\r
+ VOID *MenuRefreshHead;\r
+} BROWSER_CONTEXT;\r
+\r
+#define BROWSER_CONTEXT_FROM_LINK(a) CR (a, BROWSER_CONTEXT, Link, BROWSER_CONTEXT_SIGNATURE)\r
\r
extern EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
extern EFI_HII_STRING_PROTOCOL *mHiiString;\r
extern EFI_HII_HANDLE gHiiHandle;\r
extern UINT16 gDirection;\r
extern EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-extern BOOLEAN gUpArrow;\r
-extern BOOLEAN gDownArrow;\r
\r
extern FORM_BROWSER_FORMSET *gOldFormSet;\r
\r
OUT UINT8 **BinaryData\r
);\r
\r
+/**\r
+ Save globals used by previous call to SendForm(). SendForm() may be called from \r
+ HiiConfigAccess.Callback(), this will cause SendForm() be reentried.\r
+ So, save globals of previous call to SendForm() and restore them upon exit.\r
+\r
+**/\r
+VOID\r
+SaveBrowserContext (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Restore globals used by previous call to SendForm().\r
+\r
+**/\r
+VOID\r
+RestoreBrowserContext (\r
+ VOID\r
+ );\r
+\r
/**\r
This is the routine which an external caller uses to direct the browser\r
where to obtain it's information.\r
#include "Ui.h"\r
#include "Setup.h"\r
\r
-LIST_ENTRY Menu;\r
+LIST_ENTRY gMenuOption;\r
LIST_ENTRY gMenuList = INITIALIZE_LIST_HEAD_VARIABLE (gMenuList);\r
MENU_REFRESH_ENTRY *gMenuRefreshHead;\r
\r
VOID\r
)\r
{\r
- InitializeListHead (&Menu);\r
+ InitializeListHead (&gMenuOption);\r
}\r
\r
\r
{\r
UI_MENU_OPTION *MenuOption;\r
\r
- while (!IsListEmpty (&Menu)) {\r
- MenuOption = MENU_OPTION_FROM_LINK (Menu.ForwardLink);\r
+ while (!IsListEmpty (&gMenuOption)) {\r
+ MenuOption = MENU_OPTION_FROM_LINK (gMenuOption.ForwardLink);\r
RemoveEntryList (&MenuOption->Link);\r
\r
//\r
MenuOption->ReadOnly = TRUE;\r
}\r
\r
- InsertTailList (&Menu, &MenuOption->Link);\r
+ InsertTailList (&gMenuOption, &MenuOption->Link);\r
}\r
\r
return MenuOption;\r
\r
Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink;\r
\r
- if (Temp == &Menu) {\r
+ if (Temp == &gMenuOption) {\r
return TRUE;\r
}\r
\r
- for (; Temp != &Menu; Temp = Direction ? Temp->BackLink : Temp->ForwardLink) {\r
+ for (; Temp != &gMenuOption; Temp = Direction ? Temp->BackLink : Temp->ForwardLink) {\r
MenuOption = MENU_OPTION_FROM_LINK (Temp);\r
if (IsSelectable (MenuOption)) {\r
return FALSE;\r
if (IsSelectable (NextMenuOption)) {\r
break;\r
}\r
- if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &Menu) {\r
+ if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {\r
HitEnd = TRUE;\r
break;\r
}\r
if (IsSelectable (NextMenuOption)) {\r
break;\r
}\r
- if ((!GoUp ? Pos->BackLink : Pos->ForwardLink) == &Menu) {\r
+ if ((!GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {\r
ASSERT (FALSE);\r
break;\r
}\r
BOOLEAN NewLine;\r
BOOLEAN Repaint;\r
BOOLEAN SavedValue;\r
+ BOOLEAN UpArrow;\r
+ BOOLEAN DownArrow;\r
EFI_STATUS Status;\r
EFI_INPUT_KEY Key;\r
LIST_ENTRY *Link;\r
DefaultId = 0;\r
\r
OutputString = NULL;\r
- gUpArrow = FALSE;\r
- gDownArrow = FALSE;\r
+ UpArrow = FALSE;\r
+ DownArrow = FALSE;\r
SkipValue = 0;\r
OldSkipValue = 0;\r
MenuRefreshEntry = gMenuRefreshHead;\r
Selection->OptionCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;\r
Selection->Statement = NULL;\r
\r
- TopOfScreen = Menu.ForwardLink;\r
+ TopOfScreen = gMenuOption.ForwardLink;\r
Repaint = TRUE;\r
MenuOption = NULL;\r
\r
//\r
// Get user's selection\r
//\r
- NewPos = Menu.ForwardLink;\r
+ NewPos = gMenuOption.ForwardLink;\r
\r
gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
UpdateStatusBar (REFRESH_STATUS_BAR, (UINT8) 0, TRUE);\r
while (TRUE) {\r
switch (ControlFlag) {\r
case CfInitialization:\r
- if (IsListEmpty (&Menu)) {\r
+ if (IsListEmpty (&gMenuOption)) {\r
ControlFlag = CfReadKey;\r
} else {\r
ControlFlag = CfCheckSelection;\r
//\r
// Display menu\r
//\r
- gDownArrow = FALSE;\r
- gUpArrow = FALSE;\r
+ DownArrow = FALSE;\r
+ UpArrow = FALSE;\r
Row = TopRow;\r
\r
Temp = SkipValue;\r
UiFreeRefreshList ();\r
MinRefreshInterval = 0;\r
\r
- for (Link = TopOfScreen; Link != &Menu; Link = Link->ForwardLink) {\r
+ for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) {\r
MenuOption = MENU_OPTION_FROM_LINK (Link);\r
MenuOption->Row = Row;\r
MenuOption->Col = Col;\r
\r
if (Row > BottomRow) {\r
if (!ValueIsScroll (FALSE, Link)) {\r
- gDownArrow = TRUE;\r
+ DownArrow = TRUE;\r
}\r
\r
Row = BottomRow + 1;\r
}\r
\r
if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
- gUpArrow = TRUE;\r
+ UpArrow = TRUE;\r
}\r
\r
- if (gUpArrow) {\r
+ if (UpArrow) {\r
gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);\r
PrintAt (\r
LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
}\r
\r
- if (gDownArrow) {\r
+ if (DownArrow) {\r
gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);\r
PrintAt (\r
LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
Repaint = FALSE;\r
\r
if (Selection->QuestionId != 0) {\r
- NewPos = Menu.ForwardLink;\r
+ NewPos = gMenuOption.ForwardLink;\r
SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
\r
- while (SavedMenuOption->ThisTag->QuestionId != Selection->QuestionId && NewPos->ForwardLink != &Menu) {\r
+ while (SavedMenuOption->ThisTag->QuestionId != Selection->QuestionId && NewPos->ForwardLink != &gMenuOption) {\r
NewPos = NewPos->ForwardLink;\r
SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
}\r
// If the screen has no menu items, and the user didn't select UiReset\r
// ignore the selection and go back to reading keys.\r
//\r
- if (IsListEmpty (&Menu)) {\r
+ if (IsListEmpty (&gMenuOption)) {\r
ControlFlag = CfReadKey;\r
break;\r
}\r
//\r
// if there is nothing logical to place a cursor on, just move on to wait for a key.\r
//\r
- for (Link = Menu.ForwardLink; Link != &Menu; Link = Link->ForwardLink) {\r
+ for (Link = gMenuOption.ForwardLink; Link != &gMenuOption; Link = Link->ForwardLink) {\r
NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
if (IsSelectable (NextMenuOption)) {\r
break;\r
}\r
}\r
\r
- if (Link == &Menu) {\r
+ if (Link == &gMenuOption) {\r
ControlFlag = CfPrepareToReadKey;\r
break;\r
}\r
\r
SavedListEntry = TopOfScreen;\r
\r
- if (NewPos->BackLink != &Menu) {\r
+ if (NewPos->BackLink != &gMenuOption) {\r
NewLine = TRUE;\r
//\r
// Adjust Date/Time position before we advance forward.\r
//\r
// Caution that we have already rewind to the top, don't go backward in this situation.\r
//\r
- if (NewPos->BackLink != &Menu) {\r
+ if (NewPos->BackLink != &gMenuOption) {\r
NewPos = NewPos->BackLink;\r
}\r
\r
// it means that we hit the begining MenuOption that can be focused\r
// so we simply scroll to the top\r
//\r
- if (SavedListEntry != Menu.ForwardLink) {\r
- TopOfScreen = Menu.ForwardLink;\r
+ if (SavedListEntry != gMenuOption.ForwardLink) {\r
+ TopOfScreen = gMenuOption.ForwardLink;\r
Repaint = TRUE;\r
}\r
}\r
case CfUiPageUp:\r
ControlFlag = CfCheckSelection;\r
\r
- if (NewPos->BackLink == &Menu) {\r
+ if (NewPos->BackLink == &gMenuOption) {\r
NewLine = FALSE;\r
Repaint = FALSE;\r
break;\r
Link = TopOfScreen;\r
PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);\r
Index = BottomRow;\r
- while ((Index >= TopRow) && (Link->BackLink != &Menu)) {\r
+ while ((Index >= TopRow) && (Link->BackLink != &gMenuOption)) {\r
Index = Index - PreviousMenuOption->Skip;\r
Link = Link->BackLink;\r
PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);\r
// This happens when there is no MenuOption can be focused from\r
// Current MenuOption to the first MenuOption\r
//\r
- TopOfScreen = Menu.ForwardLink;\r
+ TopOfScreen = gMenuOption.ForwardLink;\r
}\r
Index += Difference;\r
if (Index < TopRow) {\r
case CfUiPageDown:\r
ControlFlag = CfCheckSelection;\r
\r
- if (NewPos->ForwardLink == &Menu) {\r
+ if (NewPos->ForwardLink == &gMenuOption) {\r
NewLine = FALSE;\r
Repaint = FALSE;\r
break;\r
Link = TopOfScreen;\r
NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
Index = TopRow;\r
- while ((Index <= BottomRow) && (Link->ForwardLink != &Menu)) {\r
+ while ((Index <= BottomRow) && (Link->ForwardLink != &gMenuOption)) {\r
Index = Index + NextMenuOption->Skip;\r
Link = Link->ForwardLink;\r
NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
SavedListEntry = NewPos;\r
DistanceValue = AdjustDateAndTimePosition (FALSE, &NewPos);\r
\r
- if (NewPos->ForwardLink != &Menu) {\r
+ if (NewPos->ForwardLink != &gMenuOption) {\r
MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
NewLine = TRUE;\r
NewPos = NewPos->ForwardLink;\r
} SCREEN_OPERATION_T0_CONTROL_FLAG;\r
\r
\r
+extern LIST_ENTRY gMenuOption;\r
extern MENU_REFRESH_ENTRY *gMenuRefreshHead;\r
extern UI_MENU_SELECTION *gCurrentSelection;\r
extern BOOLEAN mHiiPackageListUpdated;\r