X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FDisplayEngineDxe%2FFormDisplay.c;h=7390f954b67f1ec13d41b3dea404964096356563;hp=bbb267569785c56fc602b85e6f249ec70dd54121;hb=9090c8b533013078c6df773e128070c76d917830;hpb=ef3d1df77bbd5227c76306e5c64c66d82805bbd9 diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index bbb2675697..7390f954b6 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -1,7 +1,7 @@ /** @file Entry and initialization module for the browser. -Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
Copyright (c) 2014, Hewlett-Packard Development Company, L.P.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -87,7 +87,7 @@ SCREEN_OPERATION_T0_CONTROL_FLAG gScreenOperationToControlFlag[] = { { UiPageDown, CfUiPageDown - }, + }, { UiHotKey, CfUiHotKey @@ -151,6 +151,15 @@ CHAR16 *gConfirmExitMsg2nd; CHAR16 *gConfirmOpt; CHAR16 *gConfirmOptYes; CHAR16 *gConfirmOptNo; +CHAR16 *gConfirmOptOk; +CHAR16 *gConfirmOptCancel; +CHAR16 *gYesOption; +CHAR16 *gNoOption; +CHAR16 *gOkOption; +CHAR16 *gCancelOption; +CHAR16 *gErrorPopup; +CHAR16 *gWarningPopup; +CHAR16 *gInfoPopup; CHAR16 *gConfirmMsgConnect; CHAR16 *gConfirmMsgEnd; CHAR16 *gPasswordUnsupported; @@ -167,6 +176,10 @@ FORM_DISPLAY_DRIVER_PRIVATE_DATA mPrivateData = { FormDisplay, DriverClearDisplayPage, ConfirmDataChange + }, + { + EFI_HII_POPUP_PROTOCOL_REVISION, + CreatePopup } }; @@ -247,6 +260,15 @@ InitializeDisplayStrings ( gConfirmOpt = GetToken (STRING_TOKEN (CONFIRM_OPTION), gHiiHandle); gConfirmOptYes = GetToken (STRING_TOKEN (CONFIRM_OPTION_YES), gHiiHandle); gConfirmOptNo = GetToken (STRING_TOKEN (CONFIRM_OPTION_NO), gHiiHandle); + gConfirmOptOk = GetToken (STRING_TOKEN (CONFIRM_OPTION_OK), gHiiHandle); + gConfirmOptCancel = GetToken (STRING_TOKEN (CONFIRM_OPTION_CANCEL), gHiiHandle); + gYesOption = GetToken (STRING_TOKEN (YES_SELECTABLE_OPTION), gHiiHandle); + gNoOption = GetToken (STRING_TOKEN (NO_SELECTABLE_OPTION), gHiiHandle); + gOkOption = GetToken (STRING_TOKEN (OK_SELECTABLE_OPTION), gHiiHandle); + gCancelOption = GetToken (STRING_TOKEN (CANCEL_SELECTABLE_OPTION), gHiiHandle); + gErrorPopup = GetToken (STRING_TOKEN (ERROR_POPUP_STRING), gHiiHandle); + gWarningPopup = GetToken (STRING_TOKEN (WARNING_POPUP_STRING), gHiiHandle); + gInfoPopup = GetToken (STRING_TOKEN (INFO_POPUP_STRING), gHiiHandle); gConfirmMsgConnect = GetToken (STRING_TOKEN (CONFIRM_OPTION_CONNECT), gHiiHandle); gConfirmMsgEnd = GetToken (STRING_TOKEN (CONFIRM_OPTION_END), gHiiHandle); gPasswordUnsupported = GetToken (STRING_TOKEN (PASSWORD_NOT_SUPPORTED ), gHiiHandle); @@ -301,6 +323,15 @@ FreeDisplayStrings ( FreePool (gConfirmOpt); FreePool (gConfirmOptYes); FreePool (gConfirmOptNo); + FreePool (gConfirmOptOk); + FreePool (gConfirmOptCancel); + FreePool (gYesOption); + FreePool (gNoOption); + FreePool (gOkOption); + FreePool (gCancelOption); + FreePool (gErrorPopup); + FreePool (gWarningPopup); + FreePool (gInfoPopup); FreePool (gConfirmMsgConnect); FreePool (gConfirmMsgEnd); FreePool (gPasswordUnsupported); @@ -387,10 +418,10 @@ GetWidth ( // ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0)) ) { - + // // Return the space width. - // + // if (AdjustWidth != NULL) { *AdjustWidth = 2; } @@ -431,7 +462,7 @@ GetWidth ( @param Index Where in InputString to start the copy process @param OutputString Buffer to copy the string into - @return Returns the number of CHAR16 characters that were copied into the OutputString + @return Returns the number of CHAR16 characters that were copied into the OutputString buffer, include extra glyph info and '\0' info. **/ @@ -510,7 +541,7 @@ GetLineByWidth ( if (ReturnFlag) { break; } - } + } // // Rewind the string from the maximum size until we see a space to break the line @@ -559,7 +590,7 @@ GetLineByWidth ( if (InputString[*Index + StrOffset] == CHAR_SPACE) { // // Skip the space info at the begin of next line. - // + // *Index = (UINT16) (*Index + StrOffset + 1); } else if (InputString[*Index + StrOffset] == CHAR_LINEFEED) { // @@ -573,7 +604,7 @@ GetLineByWidth ( } else if (InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN) { // // Skip the /r or /r/n info. - // + // if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) { *Index = (UINT16) (*Index + StrOffset + 2); } else { @@ -674,7 +705,7 @@ UiAddMenuOption ( case EFI_IFR_TEXT_OP: if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) { // - // Initializing GrayOut option as TRUE for Text setup options + // Initializing GrayOut option as TRUE for Text setup options // so that those options will be Gray in colour and un selectable. // MenuOption->GrayOut = TRUE; @@ -692,8 +723,8 @@ UiAddMenuOption ( } } - if (Index == 0 && - (Statement->OpCode->OpCode != EFI_IFR_DATE_OP) && + if (Index == 0 && + (Statement->OpCode->OpCode != EFI_IFR_DATE_OP) && (Statement->OpCode->OpCode != EFI_IFR_TIME_OP)) { Width = GetWidth (MenuOption, NULL); for (; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) { @@ -710,7 +741,7 @@ UiAddMenuOption ( // Add three MenuOptions for Date/Time // Data format : [01/02/2004] [11:22:33] // Line number : 0 0 1 0 0 1 - // + // NumberOfLines = 0; } @@ -889,8 +920,8 @@ UpdateSkipInfoForMenu ( FreePool (OutputString); } - if ((Row > MenuOption->Skip) && - (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_DATE_OP) && + if ((Row > MenuOption->Skip) && + (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_DATE_OP) && (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_TIME_OP)) { MenuOption->Skip = Row; } @@ -1014,8 +1045,8 @@ IsSelectable ( @return The row distance from current MenuOption to next selectable MenuOption. @retval -1 Reach the begin of the menu, still can't find the selectable menu. - @retval Value Find the selectable menu, maybe the truly selectable, maybe the - first menu showing beyond current form or last menu showing in + @retval Value Find the selectable menu, maybe the truly selectable, maybe the + first menu showing beyond current form or last menu showing in current form. The value is the line number between the new selected menu and the current select menu, not include the new selected menu. @@ -1095,10 +1126,10 @@ MoveToNextStatement ( @param MenuOption Menu option point to date/time. @param OptionString Option string input for process. - @param AddOptCol Whether need to update MenuOption->OptCol. + @param AddOptCol Whether need to update MenuOption->OptCol. **/ -VOID +VOID ProcessStringForDateTime ( UI_MENU_OPTION *MenuOption, CHAR16 *OptionString, @@ -1112,7 +1143,7 @@ ProcessStringForDateTime ( EFI_IFR_TIME *Time; ASSERT (MenuOption != NULL && OptionString != NULL); - + Statement = MenuOption->ThisTag; Date = NULL; Time = NULL; @@ -1121,7 +1152,7 @@ ProcessStringForDateTime ( } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { Time = (EFI_IFR_TIME *) Statement->OpCode; } - + // // If leading spaces on OptionString - remove the spaces // @@ -1133,13 +1164,13 @@ ProcessStringForDateTime ( MenuOption->OptCol++; } } - + for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) { OptionString[Count] = OptionString[Index]; Count++; } OptionString[Count] = CHAR_NULL; - + // // Enable to suppress field in the opcode base on the flag. // @@ -1151,21 +1182,21 @@ ProcessStringForDateTime ( // if ((Date->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) { // - // At this point, only "<**:" in the optionstring. + // At this point, only "<**:" in the optionstring. // Clean the day's ** field, after clean, the format is "< :" // SetUnicodeMem (&OptionString[1], 2, L' '); } else if ((Date->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) { // - // At this point, only "**:" in the optionstring. + // At this point, only "**:" in the optionstring. // Clean the month's "**" field, after clean, the format is " :" - // + // SetUnicodeMem (&OptionString[0], 2, L' '); } else if ((Date->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) { // - // At this point, only "****>" in the optionstring. + // At this point, only "****>" in the optionstring. // Clean the year's "****" field, after clean, the format is " >" - // + // SetUnicodeMem (&OptionString[0], 4, L' '); } } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { @@ -1176,21 +1207,21 @@ ProcessStringForDateTime ( // if ((Time->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) { // - // At this point, only "<**:" in the optionstring. + // At this point, only "<**:" in the optionstring. // Clean the hour's ** field, after clean, the format is "< :" // SetUnicodeMem (&OptionString[1], 2, L' '); } else if ((Time->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) { // - // At this point, only "**:" in the optionstring. + // At this point, only "**:" in the optionstring. // Clean the minute's "**" field, after clean, the format is " :" - // + // SetUnicodeMem (&OptionString[0], 2, L' '); } else if ((Time->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) { // - // At this point, only "**>" in the optionstring. + // At this point, only "**>" in the optionstring. // Clean the second's "**" field, after clean, the format is " >" - // + // SetUnicodeMem (&OptionString[0], 2, L' '); } } @@ -1273,7 +1304,7 @@ AdjustDateAndTimePosition ( /** Get step info from numeric opcode. - + @param[in] OpCode The input numeric op code. @return step info for this opcode. @@ -1287,24 +1318,24 @@ GetFieldFromNum ( UINT64 Step; NumericOp = (EFI_IFR_NUMERIC *) OpCode; - + switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) { case EFI_IFR_NUMERIC_SIZE_1: Step = NumericOp->data.u8.Step; break; - + case EFI_IFR_NUMERIC_SIZE_2: Step = NumericOp->data.u16.Step; break; - + case EFI_IFR_NUMERIC_SIZE_4: Step = NumericOp->data.u32.Step; break; - + case EFI_IFR_NUMERIC_SIZE_8: Step = NumericOp->data.u64.Step; break; - + default: Step = 0; break; @@ -1315,7 +1346,7 @@ GetFieldFromNum ( /** Find the registered HotKey based on KeyData. - + @param[in] KeyData A pointer to a buffer that describes the keystroke information for the hot key. @@ -1332,14 +1363,14 @@ GetHotKeyFromRegisterList ( Link = GetFirstNode (&gFormData->HotKeyListHead); while (!IsNull (&gFormData->HotKeyListHead, Link)) { HotKey = BROWSER_HOT_KEY_FROM_LINK (Link); - + if (HotKey->KeyData->ScanCode == KeyData->ScanCode) { return HotKey; } Link = GetNextNode (&gFormData->HotKeyListHead, Link); } - + return NULL; } @@ -1409,13 +1440,13 @@ UiWaitForEvent ( Timeout ); } - + WaitList[0] = Event; EventNum = 1; if (gFormData->FormRefreshEvent != NULL) { WaitList[EventNum] = gFormData->FormRefreshEvent; EventNum ++; - } + } if (Timeout != 0) { WaitList[EventNum] = TimerEvent; @@ -1448,7 +1479,7 @@ UiWaitForEvent ( if (Timeout != 0) { gBS->CloseEvent (TimerEvent); } - + return EventType; } @@ -1572,7 +1603,7 @@ GetIndexInfoForOpcode ( @retval FALSE This is not the highlight statement. **/ -BOOLEAN +BOOLEAN IsSavedHighlightStatement ( IN FORM_DISPLAY_ENGINE_STATEMENT *HighLightedStatement ) @@ -1704,7 +1735,7 @@ IsTopOfScreeMenuOption ( { if (gHighligthMenuInfo.TOSQuestionId != 0) { return (BOOLEAN) (GetQuestionIdInfo(MenuOption->ThisTag->OpCode) == gHighligthMenuInfo.TOSQuestionId); - } + } if(CompareMem (gHighligthMenuInfo.TOSOpCode, MenuOption->ThisTag->OpCode, gHighligthMenuInfo.TOSOpCode->Length) == 0) { if (gHighligthMenuInfo.TOSIndex == 0 || gHighligthMenuInfo.TOSIndex == GetIndexInfoForOpcode(MenuOption->ThisTag->OpCode)) { @@ -1832,7 +1863,7 @@ FindTopMenu ( // if (gMisMatch && gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle && gFormData->FormId == gHighligthMenuInfo.FormId) { // - // Reenter caused by option mismatch or auto exit caused by refresh form(refresh interval/guid), + // Reenter caused by option mismatch or auto exit caused by refresh form(refresh interval/guid), // base on the record highlight info to find the highlight menu. // @@ -1899,7 +1930,7 @@ FindTopMenu ( // MenuOption = MENU_OPTION_FROM_LINK (*HighlightMenu); UpdateOptionSkipLines (MenuOption); - + *TopOfScreen = FindTopOfScreenMenuOption(*HighlightMenu); if (*TopOfScreen == NULL) { // @@ -2059,7 +2090,7 @@ SetDisplayAttribute ( ) { FORM_DISPLAY_ENGINE_STATEMENT *Statement; - + Statement = MenuOption->ThisTag; if (Highlight) { @@ -2109,11 +2140,11 @@ DisplayMenuString ( PrintStringAtWithWidth (Col, Row, String, Width); return; } - + // // Print the highlight menu string. // First print the highlight string. - // + // SetDisplayAttribute(MenuOption, TRUE); Length = PrintStringAt (Col, Row, String); @@ -2133,7 +2164,7 @@ DisplayMenuString ( @retval FALSE This menu option can't have option string. **/ -BOOLEAN +BOOLEAN HasOptionString ( IN UI_MENU_OPTION *MenuOption ) @@ -2202,8 +2233,8 @@ FxConfirmPopup ( // // Below action need extra popup dialog to confirm. - // - CheckFlags = BROWSER_ACTION_DISCARD | + // + CheckFlags = BROWSER_ACTION_DISCARD | BROWSER_ACTION_DEFAULT | BROWSER_ACTION_SUBMIT | BROWSER_ACTION_RESET | @@ -2218,12 +2249,12 @@ FxConfirmPopup ( if ((Action & BROWSER_ACTION_DISCARD) == BROWSER_ACTION_DISCARD) { CfmStrLen += StrLen (gConfirmDiscardMsg); - } + } if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) { if (CfmStrLen != 0) { CfmStrLen += CatLen; - } + } CfmStrLen += StrLen (gConfirmDefaultMsg); } @@ -2231,7 +2262,7 @@ FxConfirmPopup ( if ((Action & BROWSER_ACTION_SUBMIT) == BROWSER_ACTION_SUBMIT) { if (CfmStrLen != 0) { CfmStrLen += CatLen; - } + } CfmStrLen += StrLen (gConfirmSubmitMsg); } @@ -2239,7 +2270,7 @@ FxConfirmPopup ( if ((Action & BROWSER_ACTION_RESET) == BROWSER_ACTION_RESET) { if (CfmStrLen != 0) { CfmStrLen += CatLen; - } + } CfmStrLen += StrLen (gConfirmResetMsg); } @@ -2247,7 +2278,7 @@ FxConfirmPopup ( if ((Action & BROWSER_ACTION_EXIT) == BROWSER_ACTION_EXIT) { if (CfmStrLen != 0) { CfmStrLen += CatLen; - } + } CfmStrLen += StrLen (gConfirmExitMsg); } @@ -2325,7 +2356,7 @@ FxConfirmPopup ( @param MenuOption The menu opton which this attribut used to. @param SkipWidth The skip width between the left to the start of the prompt. @param BeginCol The begin column for one menu. - @param SkipLine The skip line for this menu. + @param SkipLine The skip line for this menu. @param BottomRow The bottom row for this form. @param Highlight Whether this menu will be highlight. @param UpdateCol Whether need to update the column info for Date/Time. @@ -2394,12 +2425,12 @@ DisplayOneMenu ( // ProcessStringForDateTime(MenuOption, OptionString, UpdateCol); } - + Width = (UINT16) gOptionBlockWidth - 1; Row = MenuOption->Row; GlyphWidth = 1; OptionLineNum = 0; - + for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { if (((Temp2 == 0)) && (Row <= BottomRow)) { if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { @@ -2417,7 +2448,7 @@ DisplayOneMenu ( } else { // // For date/ time, print the first and second past (year for date and second for time) - // The OutputString has a NARROW_CHAR or WIDE_CHAR at the begin of the string, + // The OutputString has a NARROW_CHAR or WIDE_CHAR at the begin of the string, // so need to - 1 to remove it, otherwise, it will clean 1 extr char follow it. DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, StrLen (OutputString) - 1, Highlight); } @@ -2426,7 +2457,7 @@ DisplayOneMenu ( } OptionLineNum++; } - + // // If there is more string to process print on the next row and increment the Skip value // @@ -2445,13 +2476,13 @@ DisplayOneMenu ( } } } - + FreePool (OutputString); if (Temp2 != 0) { Temp2--; } } - + Highlight = FALSE; FreePool (OptionString); @@ -2469,13 +2500,13 @@ DisplayOneMenu ( PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue + SkipWidth); PromptLineNum++; } else { - for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth, &GlyphWidth, &Index, &OutputString) != 0x0000;) { - if ((Temp == 0) && (Row <= BottomRow)) { + for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth, &GlyphWidth, &Index, &OutputString) != 0x0000;) { + if ((Temp == 0) && (Row <= BottomRow)) { // - // 1.Clean the start LEFT_SKIPPED_COLUMNS + // 1.Clean the start LEFT_SKIPPED_COLUMNS // PrintStringAtWithWidth (BeginCol, Row, L"", SkipWidth); - + if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2 && IsProcessingFirstRow) { // // Print Arrow for Goto button. @@ -2514,13 +2545,13 @@ DisplayOneMenu ( // if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) { StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle); - + Width = (UINT16) gOptionBlockWidth - 1; Row = MenuOption->Row; GlyphWidth = 1; OptionLineNum = 0; - for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { + for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { if ((Temp3 == 0) && (Row <= BottomRow)) { DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight); OptionLineNum++; @@ -2539,7 +2570,7 @@ DisplayOneMenu ( } } } - + FreePool (OutputString); if (Temp3 != 0) { Temp3--; @@ -2558,7 +2589,7 @@ DisplayOneMenu ( Row = (OptionLineNum < PromptLineNum ? OptionLineNum : PromptLineNum) + MenuOption->Row; Width = (UINT16) (OptionLineNum < PromptLineNum ? gOptionBlockWidth : PromptWidth + AdjustValue + SkipWidth); MaxRow = (OptionLineNum < PromptLineNum ? PromptLineNum : OptionLineNum) + MenuOption->Row - 1; - + while (Row <= MaxRow) { DisplayMenuString (MenuOption, Col, Row++, L"", Width, FALSE); } @@ -2686,7 +2717,7 @@ UiDisplayMenu ( while (TRUE) { switch (ControlFlag) { case CfInitialization: - if ((gOldFormEntry.HiiHandle != FormData->HiiHandle) || + if ((gOldFormEntry.HiiHandle != FormData->HiiHandle) || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))) { // // Clear Statement range if different formset is painted. @@ -2715,7 +2746,7 @@ UiDisplayMenu ( Row = TopRow; gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ()); - + // // 1. Check whether need to print the arrow up. // @@ -2764,19 +2795,19 @@ UiDisplayMenu ( } if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { - Status = DisplayOneMenu (MenuOption, + Status = DisplayOneMenu (MenuOption, MenuOption->Col - gStatementDimensions.LeftColumn, - gStatementDimensions.LeftColumn + gModalSkipColumn, - Link == TopOfScreen ? SkipValue : 0, + gStatementDimensions.LeftColumn + gModalSkipColumn, + Link == TopOfScreen ? SkipValue : 0, BottomRow, (BOOLEAN) ((Link == NewPos) && IsSelectable(MenuOption)), TRUE ); } else { - Status = DisplayOneMenu (MenuOption, + Status = DisplayOneMenu (MenuOption, MenuOption->Col - gStatementDimensions.LeftColumn, - gStatementDimensions.LeftColumn, - Link == TopOfScreen ? SkipValue : 0, + gStatementDimensions.LeftColumn, + Link == TopOfScreen ? SkipValue : 0, BottomRow, (BOOLEAN) ((Link == NewPos) && IsSelectable(MenuOption)), TRUE @@ -2884,10 +2915,10 @@ UiDisplayMenu ( // // Remove the old highlight menu. // - Status = DisplayOneMenu (MenuOption, + Status = DisplayOneMenu (MenuOption, MenuOption->Col - gStatementDimensions.LeftColumn, - gStatementDimensions.LeftColumn, - Temp, + gStatementDimensions.LeftColumn, + Temp, BottomRow, FALSE, FALSE @@ -2904,10 +2935,10 @@ UiDisplayMenu ( break; } - Status = DisplayOneMenu (MenuOption, + Status = DisplayOneMenu (MenuOption, MenuOption->Col - gStatementDimensions.LeftColumn, - gStatementDimensions.LeftColumn, - Temp2, + gStatementDimensions.LeftColumn, + Temp2, BottomRow, TRUE, FALSE @@ -3007,7 +3038,7 @@ UiDisplayMenu ( // // Check whether need to show the 'More(U/u)' at the begin. // Base on current direct info, here shows aligned to the right side of the column. - // If the direction is multi line and aligned to right side may have problem, so + // If the direction is multi line and aligned to right side may have problem, so // add ASSERT code here. // if (HelpPageIndex > 0) { @@ -3062,7 +3093,7 @@ UiDisplayMenu ( ); } } else { - for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && + for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) { PrintStringAtWithWidth ( gStatementDimensions.RightColumn - gHelpBlockWidth, @@ -3082,13 +3113,13 @@ UiDisplayMenu ( } gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow); } - } + } } // // Check whether need to print the 'More(D/d)' at the bottom. // Base on current direct info, here shows aligned to the right side of the column. - // If the direction is multi line and aligned to right side may have problem, so + // If the direction is multi line and aligned to right side may have problem, so // add ASSERT code here. // if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) { @@ -3140,7 +3171,7 @@ UiDisplayMenu ( if (Status != EFI_NOT_READY) { continue; } - + EventType = UiWaitForEvent(gST->ConIn->WaitForKey); if (EventType == UIEventKey) { gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); @@ -3154,7 +3185,7 @@ UiDisplayMenu ( ControlFlag = CfExit; break; } - + if (EventType == UIEventTimeOut) { gUserInput->Action = BROWSER_ACTION_FORM_EXIT; ControlFlag = CfExit; @@ -3198,7 +3229,7 @@ UiDisplayMenu ( } else { gDirection = SCAN_LEFT; } - + Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE); if (OptionString != NULL) { FreePool (OptionString); @@ -3229,7 +3260,7 @@ UiDisplayMenu ( ControlFlag = CfReadKey; break; } - + ASSERT(MenuOption != NULL); if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) { ScreenOperation = UiSelect; @@ -3263,7 +3294,7 @@ UiDisplayMenu ( break; } } - + if (((FormData->Attribute & HII_DISPLAY_MODAL) != 0) && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) { // // ModalForm has no ESC key and Hot Key. @@ -3328,11 +3359,11 @@ UiDisplayMenu ( // RefreshKeyHelp (gFormData, Statement, TRUE); Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE); - + if (OptionString != NULL) { FreePool (OptionString); } - + if (EFI_ERROR (Status)) { Repaint = TRUE; NewLine = TRUE; @@ -3462,12 +3493,12 @@ UiDisplayMenu ( // Check whether new highlight menu is selectable, if not, keep highlight on the old one. // // BottomRow - TopRow + 1 means the total rows current forms supported. - // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu - // and new top menu. New top menu will all shows in next form, but last highlight menu - // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the + // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu + // and new top menu. New top menu will all shows in next form, but last highlight menu + // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the // last highlight menu. - // - if (!IsSelectable(NextMenuOption) && IsSelectable(MenuOption) && + // + if (!IsSelectable(NextMenuOption) && IsSelectable(MenuOption) && (BottomRow - TopRow + 1 >= Difference + NextMenuOption->Skip + 1)) { NewPos = SavedListEntry; } @@ -3508,11 +3539,11 @@ UiDisplayMenu ( } else { Index = (BottomRow + 1) - SkipValue - TopRow; } - + TopOfScreen = FindTopOfScreenMenu(TopOfScreen, Index, &SkipValue); NewPos = TopOfScreen; MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow, FALSE); - + UpdateStatusBar (INPUT_ERROR, FALSE); // @@ -3631,7 +3662,7 @@ UiDisplayMenu ( // // Scroll to the first page. // - if (TopOfScreen != gMenuOption.ForwardLink || SkipValue != 0) { + if (TopOfScreen != gMenuOption.ForwardLink || SkipValue != 0) { TopOfScreen = gMenuOption.ForwardLink; Repaint = TRUE; MenuOption = NULL; @@ -3650,7 +3681,7 @@ UiDisplayMenu ( UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue); break; - } + } // // Get next selected menu info. @@ -3729,12 +3760,12 @@ UiDisplayMenu ( // Check whether new highlight menu is selectable, if not, keep highlight on the old one. // // BottomRow - TopRow + 1 means the total rows current forms supported. - // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu - // and new top menu. New top menu will all shows in next form, but last highlight menu - // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the + // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu + // and new top menu. New top menu will all shows in next form, but last highlight menu + // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the // last highlight menu. - // - if (!IsSelectable (NextMenuOption) && IsSelectable (MenuOption) && + // + if (!IsSelectable (NextMenuOption) && IsSelectable (MenuOption) && (BottomRow - TopRow + 1 >= Difference + NextMenuOption->Skip + 1)) { NewPos = SavedListEntry; } @@ -3953,7 +3984,7 @@ BrowserStatusProcess ( // Show the dialog first to avoid long time not reaction. // gBS->SignalEvent (RefreshIntervalEvent); - + Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND); ASSERT_EFI_ERROR (Status); @@ -3994,17 +4025,17 @@ BrowserStatusProcess ( /** Display one form, and return user input. - + @param FormData Form Data to be shown. @param UserInputData User input data. - + @retval EFI_SUCCESS 1.Form Data is shown, and user input is got. 2.Error info has show and return. @retval EFI_INVALID_PARAMETER The input screen dimension is not valid @retval EFI_NOT_FOUND New form data has some error. **/ EFI_STATUS -EFIAPI +EFIAPI FormDisplay ( IN FORM_DISPLAY_ENGINE_FORM *FormData, OUT USER_INPUT *UserInputData @@ -4043,7 +4074,7 @@ FormDisplay ( // // Left right // |<-.->|<-.........->|<- .........->|<-...........->| - // Skip Prompt Option Help + // Skip Prompt Option Help // gOptionBlockWidth = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3) + 1; gHelpBlockWidth = (CHAR16) (gOptionBlockWidth - 1 - LEFT_SKIPPED_COLUMNS); @@ -4054,7 +4085,7 @@ FormDisplay ( // // Check whether layout is changed. // - if (mIsFirstForm + if (mIsFirstForm || (gOldFormEntry.HiiHandle != FormData->HiiHandle) || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid)) || (gOldFormEntry.FormId != FormData->FormId)) { @@ -4064,7 +4095,7 @@ FormDisplay ( } Status = UiDisplayMenu(FormData); - + // // Backup last form info. // @@ -4085,7 +4116,7 @@ FormDisplay ( Clear Screen to the initial state. **/ VOID -EFIAPI +EFIAPI DriverClearDisplayPage ( VOID ) @@ -4161,14 +4192,25 @@ InitializeDisplayEngine ( ); ASSERT_EFI_ERROR (Status); + // + // Install HII Popup Protocol. + // + Status = gBS->InstallProtocolInterface ( + &mPrivateData.Handle, + &gEfiHiiPopupProtocolGuid, + EFI_NATIVE_INTERFACE, + &mPrivateData.HiiPopup + ); + ASSERT_EFI_ERROR (Status); + InitializeDisplayStrings(); - + ZeroMem (&gHighligthMenuInfo, sizeof (gHighligthMenuInfo)); ZeroMem (&gOldFormEntry, sizeof (gOldFormEntry)); // // Use BrowserEx2 protocol to register HotKey. - // + // Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2); if (!EFI_ERROR (Status)) { // @@ -4179,11 +4221,13 @@ InitializeDisplayEngine ( NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_TEN_STRING), NULL); ASSERT (NewString != NULL); FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_SUBMIT, 0, NewString); + FreePool (NewString); HotKey.ScanCode = SCAN_F9; NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_NINE_STRING), NULL); ASSERT (NewString != NULL); FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD, NewString); + FreePool (NewString); } return EFI_SUCCESS;