]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the traversal path logic.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 27 Mar 2013 03:09:18 +0000 (03:09 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 27 Mar 2013 03:09:18 +0000 (03:09 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14220 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h

index ae7ff7f774b5b963cf81b9c6e4fbb2dce807a08a..6c019f045483890425b87844fafd7cb3e2a1ecc9 100644 (file)
@@ -244,6 +244,11 @@ SendForm (
   //\r
   gFooterHeight = FOOTER_HEIGHT + (Index / 3);\r
 \r
+  //\r
+  // Clean the history menu list.\r
+  //\r
+  InitializeListHead (&gMenuList);\r
+\r
   //\r
   // Save globals used by SendForm()\r
   //\r
@@ -378,6 +383,7 @@ SendForm (
   }\r
 \r
   FreeBrowserStrings ();\r
+  UiFreeMenuList(&gMenuList);\r
 \r
   gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
   gST->ConOut->ClearScreen (gST->ConOut);\r
index d54466e1230e65207c0499eb2d1d03e43e307c8f..e13ff52463892f40856488e0a04b8f1c34e74c20 100644 (file)
@@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Setup.h"\r
 \r
 LIST_ENTRY          gMenuOption;\r
-LIST_ENTRY          gMenuList = INITIALIZE_LIST_HEAD_VARIABLE (gMenuList);\r
+LIST_ENTRY          gMenuList;\r
 MENU_REFRESH_ENTRY  *gMenuRefreshHead;                // Menu list used for refresh timer opcode.\r
 MENU_REFRESH_ENTRY  *gMenuEventGuidRefreshHead;       // Menu list used for refresh event guid opcode.\r
 \r
@@ -219,9 +219,10 @@ UiAddMenuList (
 \r
 \r
 /**\r
-  Search Menu with given FormId and FormSetGuid in all cached menu list.\r
+  Search Menu with given FormId, FormSetGuid and Handle in all cached menu list.\r
 \r
   @param  Parent                 The parent of menu to search.\r
+  @param  Handle                 Hii handle related to this formset.\r
   @param  FormSetGuid            The Formset GUID of the menu to search.  \r
   @param  FormId                 The Form ID of menu to search.\r
 \r
@@ -231,6 +232,7 @@ UiAddMenuList (
 UI_MENU_LIST *\r
 UiFindChildMenuList (\r
   IN UI_MENU_LIST         *Parent,\r
+  IN EFI_HII_HANDLE       Handle,\r
   IN EFI_GUID             *FormSetGuid, \r
   IN UINT16               FormId\r
   )\r
@@ -241,7 +243,7 @@ UiFindChildMenuList (
 \r
   ASSERT (Parent != NULL);\r
 \r
-  if (Parent->FormId == FormId && CompareGuid (FormSetGuid, &Parent->FormSetGuid)) {\r
+  if (Parent->FormId == FormId && CompareGuid (FormSetGuid, &Parent->FormSetGuid) && Parent->HiiHandle == Handle) {\r
     return Parent;\r
   }\r
 \r
@@ -249,7 +251,7 @@ UiFindChildMenuList (
   while (!IsNull (&Parent->ChildListHead, Link)) {\r
     Child = UI_MENU_LIST_FROM_LINK (Link);\r
 \r
-    MenuList = UiFindChildMenuList (Child, FormSetGuid, FormId);\r
+    MenuList = UiFindChildMenuList (Child, Handle, FormSetGuid, FormId);\r
     if (MenuList != NULL) {\r
       return MenuList;\r
     }\r
@@ -262,9 +264,10 @@ UiFindChildMenuList (
 \r
 \r
 /**\r
-  Search Menu with given FormSetGuid and FormId in all cached menu list.\r
+  Search Menu with given Handle, FormSetGuid and FormId in all cached menu list.\r
 \r
   @param  FormSetGuid            The Formset GUID of the menu to search.\r
+  @param  Handle                 Hii handle related to this formset.\r
   @param  FormId                 The Form ID of menu to search.\r
 \r
   @return A pointer to menu found or NULL if not found.\r
@@ -272,6 +275,7 @@ UiFindChildMenuList (
 **/\r
 UI_MENU_LIST *\r
 UiFindMenuList (\r
+  IN EFI_HII_HANDLE       Handle,\r
   IN EFI_GUID             *FormSetGuid,\r
   IN UINT16               FormId\r
   )\r
@@ -284,8 +288,14 @@ UiFindMenuList (
   while (!IsNull (&gMenuList, Link)) {\r
     MenuList = UI_MENU_LIST_FROM_LINK (Link);\r
 \r
-    Child = UiFindChildMenuList(MenuList, FormSetGuid, FormId);\r
+    Child = UiFindChildMenuList(MenuList, Handle, FormSetGuid, FormId);\r
     if (Child != NULL) {\r
+\r
+      //\r
+      // If this form already in the menu history list,\r
+      // just free the list between old this form.\r
+      //\r
+      UiFreeMenuList(&Child->ChildListHead);\r
       return Child;\r
     }\r
 \r
@@ -295,6 +305,28 @@ UiFindMenuList (
   return NULL;\r
 }\r
 \r
+/**\r
+  Free Menu list linked list.\r
+\r
+  @param  MenuListHead    One Menu list point in the menu list.\r
+\r
+**/\r
+VOID\r
+UiFreeMenuList (\r
+  LIST_ENTRY   *MenuListHead\r
+  )\r
+{\r
+  UI_MENU_LIST    *MenuList;\r
+\r
+  while (!IsListEmpty (MenuListHead)) {\r
+    MenuList = UI_MENU_LIST_FROM_LINK (MenuListHead->ForwardLink);\r
+    RemoveEntryList (&MenuList->Link);\r
+    \r
+    UiFreeMenuList(&MenuList->ChildListHead);\r
+    FreePool (MenuList);\r
+  }\r
+\r
+}\r
 \r
 /**\r
   Free Menu option linked list.\r
@@ -1997,11 +2029,8 @@ ProcessGotoOpCode (
   FORM_BROWSER_FORM               *RefForm;\r
   EFI_INPUT_KEY                   Key;\r
   EFI_STATUS                      Status;\r
-  UI_MENU_LIST                    *MenuList;\r
-  BOOLEAN                         UpdateFormInfo;\r
-  \r
-  Status = EFI_SUCCESS;\r
-  UpdateFormInfo = TRUE;\r
+\r
+  Status    = EFI_SUCCESS;\r
   StringPtr = NULL;\r
 \r
   //\r
@@ -2122,22 +2151,10 @@ ProcessGotoOpCode (
         *NewLine = TRUE;\r
       }\r
     }\r
-    UpdateFormInfo = FALSE;\r
   } else {\r
     if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
       Selection->Action = UI_ACTION_REFRESH_FORM;\r
     }\r
-    UpdateFormInfo = FALSE;\r
-  }\r
-\r
-  if (UpdateFormInfo) {\r
-    //\r
-    // Link current form so that we can always go back when someone hits the ESC\r
-    //\r
-    MenuList = UiFindMenuList (&Selection->FormSetGuid, Selection->FormId);\r
-    if (MenuList == NULL && Selection->CurrentMenu != NULL) {\r
-      MenuList = UiAddMenuList (Selection->CurrentMenu, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
-    }\r
   }\r
 \r
   return Status;\r
@@ -2279,12 +2296,12 @@ UiDisplayMenu (
   //\r
   // Find current Menu\r
   //\r
-  CurrentMenu = UiFindMenuList (&Selection->FormSetGuid, Selection->FormId);\r
+  CurrentMenu = UiFindMenuList (Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
   if (CurrentMenu == NULL) {\r
     //\r
     // Current menu not found, add it to the menu tree\r
     //\r
-    CurrentMenu = UiAddMenuList (NULL, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
+    CurrentMenu = UiAddMenuList (Selection->CurrentMenu, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
   }\r
   ASSERT (CurrentMenu != NULL);\r
   Selection->CurrentMenu = CurrentMenu;\r
index 4c3b314f0eee35511891e888b0eb8816d45206b8..e79c5272a639fd8aed47ba5a5fc970dffb654f1b 100644 (file)
@@ -195,6 +195,7 @@ typedef struct {
 \r
 \r
 extern LIST_ENTRY          gMenuOption;\r
+extern LIST_ENTRY          gMenuList;\r
 extern MENU_REFRESH_ENTRY  *gMenuRefreshHead;\r
 extern UI_MENU_SELECTION   *gCurrentSelection;\r
 extern BOOLEAN             mHiiPackageListUpdated;\r
@@ -250,9 +251,10 @@ UiAddMenuList (
   );\r
 \r
 /**\r
-  Search Menu with given FormId in the parent menu and all its child menus.\r
+  Search Menu with given FormId, FormSetGuid and Handle in all cached menu list.\r
 \r
   @param  Parent                 The parent of menu to search.\r
+  @param  Handle                 Hii handle related to this formset.\r
   @param  FormSetGuid            The Formset GUID of the menu to search.  \r
   @param  FormId                 The Form ID of menu to search.\r
 \r
@@ -262,14 +264,16 @@ UiAddMenuList (
 UI_MENU_LIST *\r
 UiFindChildMenuList (\r
   IN UI_MENU_LIST         *Parent,\r
+  IN EFI_HII_HANDLE       Handle,\r
   IN EFI_GUID             *FormSetGuid, \r
   IN UINT16               FormId\r
   );\r
 \r
 /**\r
-  Search Menu with given FormSetGuid and FormId in all cached menu list.\r
+  Search Menu with given Handle, FormSetGuid and FormId in all cached menu list.\r
 \r
   @param  FormSetGuid            The Formset GUID of the menu to search.\r
+  @param  Handle                 Hii handle related to this formset.\r
   @param  FormId                 The Form ID of menu to search.\r
 \r
   @return A pointer to menu found or NULL if not found.\r
@@ -277,10 +281,22 @@ UiFindChildMenuList (
 **/\r
 UI_MENU_LIST *\r
 UiFindMenuList (\r
+  IN EFI_HII_HANDLE       Handle,\r
   IN EFI_GUID             *FormSetGuid,\r
   IN UINT16               FormId\r
   );\r
 \r
+/**\r
+  Free Menu list linked list.\r
+\r
+  @param  MenuListHead    One Menu list point in the menu list.\r
+\r
+**/\r
+VOID\r
+UiFreeMenuList (\r
+  LIST_ENTRY   *MenuListHead\r
+  );\r
+\r
 /**\r
   Free Menu option linked list.\r
 \r