From 336c8e116b3e2e11dccdac163d0a85fc3c58fd3d Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Wed, 12 Feb 2014 06:31:10 +0000 Subject: Keep highlight on the current highlight menu if form auto exit, not exit by user input. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15234 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/DisplayEngineDxe/FormDisplay.c | 79 ++++++++++++++++++---- .../Universal/DisplayEngineDxe/FormDisplay.h | 5 +- 2 files changed, 69 insertions(+), 15 deletions(-) (limited to 'MdeModulePkg/Universal') diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index 203b6b5138..fe3d875cd9 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -1478,6 +1478,7 @@ FindTopMenu ( UI_MENU_OPTION *SavedMenuOption; UINTN TmpValue; + TmpValue = 0; TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT; BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT; @@ -1521,19 +1522,37 @@ FindTopMenu ( UpdateOptionSkipLines (SavedMenuOption); // - // If highlight opcode is date/time, keep the highlight row info not change. + // FormRefreshEvent != NULL means this form will auto exit at an interval, display engine + // will try to keep highlight on the current position after this form exit and re-enter. // - if ((SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP || SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP) && - (gHighligthMenuInfo.QuestionId != 0) && - (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode))) { - // - // Still show the highlight menu before exit from display engine. - // - BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip; + // HiiHandle + QuestionId can find the only one question in the system. + // + // If this question has question id, save the question id info to find the question. + // else save the opcode buffer to find it. + // + if (gFormData->FormRefreshEvent != NULL && gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle) { + if (gHighligthMenuInfo.QuestionId != 0) { + if (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode)) { + BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip; + // + // SkipValue only used for menu at the top of the form. + // If Highlight menu is not at the top, this value will be update later. + // + TmpValue = gHighligthMenuInfo.SkipValue; + } + } else if (gHighligthMenuInfo.OpCode != NULL){ + if (!CompareMem (gHighligthMenuInfo.OpCode, SavedMenuOption->ThisTag->OpCode, gHighligthMenuInfo.OpCode->Length)) { + BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip; + // + // SkipValue only used for menu at the top of the form. + // If Highlight menu is not at the top, this value will be update later. + // + TmpValue = gHighligthMenuInfo.SkipValue; + } + } } if (SavedMenuOption->Skip >= BottomRow - TopRow) { - TmpValue = 0; *TopOfScreen = NewPos; } else { *TopOfScreen = FindTopOfScreenMenu(NewPos, BottomRow - TopRow - SavedMenuOption->Skip, &TmpValue); @@ -1547,11 +1566,14 @@ FindTopMenu ( Update highlight menu info. @param MenuOption The menu opton which is highlight. + @param SkipValue The skipvalue info for this menu. + SkipValue only used for the menu at the top of the form. **/ VOID UpdateHighlightMenuInfo ( - IN UI_MENU_OPTION *MenuOption + IN UI_MENU_OPTION *MenuOption, + IN UINTN SkipValue ) { FORM_DISPLAY_ENGINE_STATEMENT *Statement; @@ -1568,14 +1590,39 @@ UpdateHighlightMenuInfo ( gSequence = (UINT16) MenuOption->Sequence; // - // Record highlight row info for date/time opcode. + // FormRefreshEvent != NULL means this form will auto exit at an interval, display engine + // will try to keep highlight on the current position after this form exit and re-enter. // - if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { + // HiiHandle + QuestionId can find the only one question in the system. + // + // If this question has question id, base on the question id info to find the question. + // else base on the opcode buffer to find it. + // + if (gFormData->FormRefreshEvent != NULL) { + gHighligthMenuInfo.HiiHandle = gFormData->HiiHandle; gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode); + + // + // if question id == 0, save the opcode buffer for later use. + // + if (gHighligthMenuInfo.QuestionId == 0) { + if (gHighligthMenuInfo.OpCode != NULL) { + FreePool (gHighligthMenuInfo.OpCode); + } + gHighligthMenuInfo.OpCode = AllocateCopyPool (Statement->OpCode->Length, Statement->OpCode); + ASSERT (gHighligthMenuInfo.OpCode != NULL); + } gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row; + gHighligthMenuInfo.SkipValue = (UINT16) SkipValue; } else { + gHighligthMenuInfo.HiiHandle = NULL; gHighligthMenuInfo.QuestionId = 0; + if (gHighligthMenuInfo.OpCode != NULL) { + FreePool (gHighligthMenuInfo.OpCode); + gHighligthMenuInfo.OpCode = NULL; + } gHighligthMenuInfo.DisplayRow = 0; + gHighligthMenuInfo.SkipValue = 0; } RefreshKeyHelp(gFormData, Statement, FALSE); @@ -2252,7 +2299,7 @@ UiDisplayMenu ( if (SkipHighLight) { MenuOption = SavedMenuOption; SkipHighLight = FALSE; - UpdateHighlightMenuInfo (MenuOption); + UpdateHighlightMenuInfo (MenuOption, TopOfScreen == &MenuOption->Link ? SkipValue : 0); break; } @@ -2296,7 +2343,7 @@ UiDisplayMenu ( MenuOption = MENU_OPTION_FROM_LINK (NewPos); Statement = MenuOption->ThisTag; - UpdateHighlightMenuInfo (MenuOption); + UpdateHighlightMenuInfo (MenuOption, Temp2); if (!IsSelectable (MenuOption)) { break; @@ -3393,5 +3440,9 @@ UnloadDisplayEngine ( FreeDisplayStrings (); + if (gHighligthMenuInfo.OpCode != NULL) { + FreePool (gHighligthMenuInfo.OpCode); + } + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h index 45bcadc7e6..a0638caf5a 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h @@ -1,7 +1,7 @@ /** @file FormDiplay protocol to show Form -Copyright (c) 2013, Intel Corporation. All rights reserved.
+Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. The full text of the license may be found at @@ -194,8 +194,11 @@ typedef struct { } SCREEN_OPERATION_T0_CONTROL_FLAG; typedef struct { + EFI_HII_HANDLE HiiHandle; EFI_QUESTION_ID QuestionId; + EFI_IFR_OP_HEADER *OpCode; UINT16 DisplayRow; + UINT16 SkipValue; } DISPLAY_HIGHLIGHT_MENU_INFO; #define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm') -- cgit v1.2.3