// Refresh guid.\r
//\r
case EFI_IFR_REFRESH_ID_OP:\r
- ASSERT (ParentStatement != NULL);\r
- CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));\r
+ //\r
+ // Get ScopeOpcode from top of stack\r
+ //\r
+ PopScope (&ScopeOpCode);\r
+ PushScope (ScopeOpCode);\r
+\r
+ switch (ScopeOpCode) {\r
+ case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
+ ASSERT (CurrentForm != NULL);\r
+ CopyMem (&CurrentForm->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));\r
+ break;\r
+\r
+ default:\r
+ ASSERT (ParentStatement != NULL);\r
+ CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));\r
+ break;\r
+ }\r
break;\r
\r
//\r
**/\r
VOID\r
EFIAPI\r
-RefreshEventNotify(\r
+RefreshEventNotifyForStatement(\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
)\r
gBS->SignalEvent (mValueChangedEvent);\r
}\r
\r
+/**\r
+ Refresh the questions within this form.\r
+ \r
+ @param Event The event which has this function related.\r
+ @param Context The input context info related to this event or the status code return to the caller.\r
+**/\r
+VOID\r
+EFIAPI\r
+RefreshEventNotifyForForm(\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ gCurrentSelection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+ gBS->SignalEvent (mValueChangedEvent);\r
+}\r
\r
/**\r
Create refresh hook event for statement which has refresh event or interval.\r
\r
**/\r
VOID\r
-CreateRefreshEvent (\r
+CreateRefreshEventForStatement (\r
IN FORM_BROWSER_STATEMENT *Statement\r
)\r
{\r
Status = gBS->CreateEventEx (\r
EVT_NOTIFY_SIGNAL,\r
TPL_CALLBACK,\r
- RefreshEventNotify,\r
+ RefreshEventNotifyForStatement,\r
Statement,\r
&Statement->RefreshGuid,\r
&RefreshEvent);\r
InsertTailList(&mRefreshEventList, &EventNode->Link);\r
}\r
\r
+/**\r
+ Create refresh hook event for statement which has refresh event or interval.\r
+\r
+ @param Statement The statement need to check.\r
+\r
+**/\r
+VOID\r
+CreateRefreshEventForForm (\r
+ IN FORM_BROWSER_FORM *Form\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_EVENT RefreshEvent;\r
+ FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;\r
+\r
+ //\r
+ // If question has refresh guid, create the notify function.\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_CALLBACK,\r
+ RefreshEventNotifyForForm,\r
+ Form,\r
+ &Form->RefreshGuid,\r
+ &RefreshEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE));\r
+ ASSERT (EventNode != NULL);\r
+ EventNode->RefreshEvent = RefreshEvent;\r
+ InsertTailList(&mRefreshEventList, &EventNode->Link);\r
+}\r
+\r
/**\r
\r
Initialize the Display statement structure data.\r
// Create the refresh event process function.\r
//\r
if (!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) {\r
- CreateRefreshEvent (Statement);\r
+ CreateRefreshEventForStatement (Statement);\r
}\r
\r
//\r
InsertTailList(&mRefreshEventList, &EventNode->Link);\r
}\r
\r
+ //\r
+ // Create the refresh event process function for Form.\r
+ //\r
+ if (!CompareGuid (&gCurrentSelection->Form->RefreshGuid, &gZeroGuid)) {\r
+ CreateRefreshEventForForm (gCurrentSelection->Form);\r
+ if (gDisplayFormData.FormRefreshEvent == NULL) {\r
+ gDisplayFormData.FormRefreshEvent = mValueChangedEvent;\r
+ }\r
+ }\r
+\r
//\r
// Update hotkey list field.\r
//\r