Add new "Modal form" opcode, also add sample code to use it.
Signed-off-by: ydong10 Reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11764 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
26a65e5c80
commit
b00964a999
@ -1502,6 +1502,7 @@ DriverCallback (
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1241:
|
case 0x1241:
|
||||||
|
case 0x1246:
|
||||||
//
|
//
|
||||||
// User press "Submit current form and Exit now", request Browser to submit current form and exit
|
// User press "Submit current form and Exit now", request Browser to submit current form and exit
|
||||||
//
|
//
|
||||||
@ -1523,6 +1524,7 @@ DriverCallback (
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1244:
|
case 0x1244:
|
||||||
|
case 0x1245:
|
||||||
//
|
//
|
||||||
// User press "Discard current form and Exit now", request Browser to discard the uncommitted data and exit.
|
// User press "Discard current form and Exit now", request Browser to discard the uncommitted data and exit.
|
||||||
//
|
//
|
||||||
|
Binary file not shown.
@ -2068,6 +2068,14 @@ ParseOpCodes (
|
|||||||
CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;
|
CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modal tag
|
||||||
|
//
|
||||||
|
case EFI_IFR_MODAL_TAG_OP:
|
||||||
|
ASSERT (CurrentForm != NULL);
|
||||||
|
CurrentForm->ModalForm = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Vendor specific
|
// Vendor specific
|
||||||
//
|
//
|
||||||
|
@ -182,10 +182,13 @@ GetStringWidth (
|
|||||||
/**
|
/**
|
||||||
This function displays the page frame.
|
This function displays the page frame.
|
||||||
|
|
||||||
|
@param Selection Selection contains the information about
|
||||||
|
the Selection, form and formset to be displayed.
|
||||||
|
Selection action may be updated in retrieve callback.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DisplayPageFrame (
|
DisplayPageFrame (
|
||||||
VOID
|
IN UI_MENU_SELECTION *Selection
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
@ -203,6 +206,10 @@ DisplayPageFrame (
|
|||||||
gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);
|
gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);
|
||||||
ClearLines (0, LocalScreen.RightColumn, 0, LocalScreen.BottomRow, KEYHELP_BACKGROUND);
|
ClearLines (0, LocalScreen.RightColumn, 0, LocalScreen.BottomRow, KEYHELP_BACKGROUND);
|
||||||
|
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -484,7 +491,11 @@ DisplayForm (
|
|||||||
StringPtr = GetToken (Selection->Form->FormTitle, Handle);
|
StringPtr = GetToken (Selection->Form->FormTitle, Handle);
|
||||||
|
|
||||||
if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {
|
if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | EFI_BACKGROUND_BLACK);
|
||||||
|
} else {
|
||||||
gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);
|
gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);
|
||||||
|
}
|
||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
(LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,
|
(LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,
|
||||||
LocalScreen.TopRow + 1,
|
LocalScreen.TopRow + 1,
|
||||||
@ -673,6 +684,12 @@ UpdateKeyHelp (
|
|||||||
EFI_SCREEN_DESCRIPTOR LocalScreen;
|
EFI_SCREEN_DESCRIPTOR LocalScreen;
|
||||||
FORM_BROWSER_STATEMENT *Statement;
|
FORM_BROWSER_STATEMENT *Statement;
|
||||||
|
|
||||||
|
gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);
|
||||||
|
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||||
|
|
||||||
SecCol = LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;
|
SecCol = LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;
|
||||||
@ -684,8 +701,6 @@ UpdateKeyHelp (
|
|||||||
TopRowOfHelp = LocalScreen.BottomRow - 4;
|
TopRowOfHelp = LocalScreen.BottomRow - 4;
|
||||||
BottomRowOfHelp = LocalScreen.BottomRow - 3;
|
BottomRowOfHelp = LocalScreen.BottomRow - 3;
|
||||||
|
|
||||||
gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);
|
|
||||||
|
|
||||||
Statement = MenuOption->ThisTag;
|
Statement = MenuOption->ThisTag;
|
||||||
switch (Statement->Operand) {
|
switch (Statement->Operand) {
|
||||||
case EFI_IFR_ORDERED_LIST_OP:
|
case EFI_IFR_ORDERED_LIST_OP:
|
||||||
@ -1338,7 +1353,7 @@ SetupBrowser (
|
|||||||
//
|
//
|
||||||
// Displays the Header and Footer borders
|
// Displays the Header and Footer borders
|
||||||
//
|
//
|
||||||
DisplayPageFrame ();
|
DisplayPageFrame (Selection);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Display form
|
// Display form
|
||||||
|
@ -2835,6 +2835,7 @@ InitializeCurrentSetting (
|
|||||||
FORMSET_STORAGE *StorageSrc;
|
FORMSET_STORAGE *StorageSrc;
|
||||||
FORMSET_STORAGE *OldStorage;
|
FORMSET_STORAGE *OldStorage;
|
||||||
FORM_BROWSER_FORM *Form;
|
FORM_BROWSER_FORM *Form;
|
||||||
|
FORM_BROWSER_FORM *Form2;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -2896,6 +2897,29 @@ InitializeCurrentSetting (
|
|||||||
Link = GetNextNode (&FormSet->StorageListHead, Link);
|
Link = GetNextNode (&FormSet->StorageListHead, Link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// If has old formset, get the old nv update status.
|
||||||
|
//
|
||||||
|
if (gOldFormSet != NULL) {
|
||||||
|
Link = GetFirstNode (&FormSet->FormListHead);
|
||||||
|
while (!IsNull (&FormSet->FormListHead, Link)) {
|
||||||
|
Form = FORM_BROWSER_FORM_FROM_LINK (Link);
|
||||||
|
|
||||||
|
Link2 = GetFirstNode (&gOldFormSet->FormListHead);
|
||||||
|
while (!IsNull (&gOldFormSet->FormListHead, Link2)) {
|
||||||
|
Form2 = FORM_BROWSER_FORM_FROM_LINK (Link2);
|
||||||
|
|
||||||
|
if (Form->FormId == Form2->FormId) {
|
||||||
|
Form->NvUpdateRequired = Form2->NvUpdateRequired;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Link2 = GetNextNode (&gOldFormSet->FormListHead, Link2);
|
||||||
|
}
|
||||||
|
Link = GetNextNode (&FormSet->FormListHead, Link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,6 +426,8 @@ typedef struct {
|
|||||||
|
|
||||||
EFI_IMAGE_ID ImageId;
|
EFI_IMAGE_ID ImageId;
|
||||||
|
|
||||||
|
BOOLEAN ModalForm; // Whether this is a modal form.
|
||||||
|
|
||||||
BOOLEAN NvUpdateRequired; // Whether this form has NV update request.
|
BOOLEAN NvUpdateRequired; // Whether this form has NV update request.
|
||||||
|
|
||||||
LIST_ENTRY ExpressionListHead; // List of Expressions (FORM_EXPRESSION)
|
LIST_ENTRY ExpressionListHead; // List of Expressions (FORM_EXPRESSION)
|
||||||
@ -717,10 +719,13 @@ DestroyFormSet (
|
|||||||
/**
|
/**
|
||||||
This function displays the page frame.
|
This function displays the page frame.
|
||||||
|
|
||||||
|
@param Selection Selection contains the information about
|
||||||
|
the Selection, form and formset to be displayed.
|
||||||
|
Selection action may be updated in retrieve callback.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DisplayPageFrame (
|
DisplayPageFrame (
|
||||||
VOID
|
IN UI_MENU_SELECTION *Selection
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1648,6 +1648,7 @@ UiDisplayMenu (
|
|||||||
UI_MENU_LIST *CurrentMenu;
|
UI_MENU_LIST *CurrentMenu;
|
||||||
UI_MENU_LIST *MenuList;
|
UI_MENU_LIST *MenuList;
|
||||||
FORM_BROWSER_FORM *RefForm;
|
FORM_BROWSER_FORM *RefForm;
|
||||||
|
UINTN ModalSkipColumn;
|
||||||
|
|
||||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||||
|
|
||||||
@ -1670,6 +1671,7 @@ UiDisplayMenu (
|
|||||||
PreviousMenuOption = NULL;
|
PreviousMenuOption = NULL;
|
||||||
SavedMenuOption = NULL;
|
SavedMenuOption = NULL;
|
||||||
RefForm = NULL;
|
RefForm = NULL;
|
||||||
|
ModalSkipColumn = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 6;
|
||||||
|
|
||||||
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
|
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
|
||||||
|
|
||||||
@ -1681,7 +1683,12 @@ UiDisplayMenu (
|
|||||||
Row = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
|
Row = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;
|
||||||
|
} else {
|
||||||
Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS;
|
Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS;
|
||||||
|
}
|
||||||
|
|
||||||
BottomRow = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - FOOTER_HEIGHT - SCROLL_ARROW_HEIGHT - 1;
|
BottomRow = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - FOOTER_HEIGHT - SCROLL_ARROW_HEIGHT - 1;
|
||||||
|
|
||||||
Selection->TopRow = TopRow;
|
Selection->TopRow = TopRow;
|
||||||
@ -1757,6 +1764,15 @@ UiDisplayMenu (
|
|||||||
Temp = (UINTN) SkipValue;
|
Temp = (UINTN) SkipValue;
|
||||||
Temp2 = (UINTN) SkipValue;
|
Temp2 = (UINTN) SkipValue;
|
||||||
|
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
ClearLines (
|
||||||
|
LocalScreen.LeftColumn + ModalSkipColumn,
|
||||||
|
LocalScreen.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,
|
||||||
|
TopRow - SCROLL_ARROW_HEIGHT,
|
||||||
|
BottomRow + SCROLL_ARROW_HEIGHT,
|
||||||
|
PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
|
||||||
|
);
|
||||||
|
} else {
|
||||||
ClearLines (
|
ClearLines (
|
||||||
LocalScreen.LeftColumn,
|
LocalScreen.LeftColumn,
|
||||||
LocalScreen.RightColumn,
|
LocalScreen.RightColumn,
|
||||||
@ -1764,7 +1780,7 @@ UiDisplayMenu (
|
|||||||
BottomRow + SCROLL_ARROW_HEIGHT,
|
BottomRow + SCROLL_ARROW_HEIGHT,
|
||||||
PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
|
PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
|
||||||
);
|
);
|
||||||
|
}
|
||||||
UiFreeRefreshList ();
|
UiFreeRefreshList ();
|
||||||
MinRefreshInterval = 0;
|
MinRefreshInterval = 0;
|
||||||
|
|
||||||
@ -1772,7 +1788,11 @@ UiDisplayMenu (
|
|||||||
MenuOption = MENU_OPTION_FROM_LINK (Link);
|
MenuOption = MENU_OPTION_FROM_LINK (Link);
|
||||||
MenuOption->Row = Row;
|
MenuOption->Row = Row;
|
||||||
MenuOption->Col = Col;
|
MenuOption->Col = Col;
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
MenuOption->OptCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn + ModalSkipColumn;
|
||||||
|
} else {
|
||||||
MenuOption->OptCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;
|
MenuOption->OptCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;
|
||||||
|
}
|
||||||
|
|
||||||
Statement = MenuOption->ThisTag;
|
Statement = MenuOption->ThisTag;
|
||||||
if (Statement->InSubtitle) {
|
if (Statement->InSubtitle) {
|
||||||
@ -2293,6 +2313,9 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
case CfUpdateHelpString:
|
case CfUpdateHelpString:
|
||||||
ControlFlag = CfPrepareToReadKey;
|
ControlFlag = CfPrepareToReadKey;
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (Repaint || NewLine) {
|
if (Repaint || NewLine) {
|
||||||
//
|
//
|
||||||
@ -2447,6 +2470,12 @@ UiDisplayMenu (
|
|||||||
//
|
//
|
||||||
} else {
|
} else {
|
||||||
for (Index = 0; Index < sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]); Index++) {
|
for (Index = 0; Index < sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]); Index++) {
|
||||||
|
if (Selection->Form->ModalForm &&
|
||||||
|
(Key.ScanCode == SCAN_F9 || Key.ScanCode == SCAN_F10 || Key.ScanCode == SCAN_ESC)) {
|
||||||
|
ControlFlag = CfReadKey;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {
|
if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {
|
||||||
if (Key.ScanCode == SCAN_F9) {
|
if (Key.ScanCode == SCAN_F9) {
|
||||||
//
|
//
|
||||||
@ -2503,6 +2532,9 @@ UiDisplayMenu (
|
|||||||
switch (Statement->Operand) {
|
switch (Statement->Operand) {
|
||||||
case EFI_IFR_REF_OP:
|
case EFI_IFR_REF_OP:
|
||||||
if (Statement->RefDevicePath != 0) {
|
if (Statement->RefDevicePath != 0) {
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// Goto another Hii Package list
|
// Goto another Hii Package list
|
||||||
//
|
//
|
||||||
@ -2558,6 +2590,9 @@ UiDisplayMenu (
|
|||||||
Selection->FormId = Statement->RefFormId;
|
Selection->FormId = Statement->RefFormId;
|
||||||
Selection->QuestionId = Statement->RefQuestionId;
|
Selection->QuestionId = Statement->RefQuestionId;
|
||||||
} else if (!CompareGuid (&Statement->RefFormSetId, &gZeroGuid)) {
|
} else if (!CompareGuid (&Statement->RefFormSetId, &gZeroGuid)) {
|
||||||
|
if (Selection->Form->ModalForm) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// Goto another Formset, check for uncommitted data
|
// Goto another Formset, check for uncommitted data
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user