]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
Enhance EDKII Browser to support flexible HotKey setting.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.h
index 27a1ad1c3cd170131cf7ed973d50a8d790d176d4..8f71e7cc386a41d0e55df698a0dea670b2fcfc52 100644 (file)
@@ -22,6 +22,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/SimpleTextOut.h>\r
 #include <Protocol/SimpleTextIn.h>\r
 #include <Protocol/FormBrowser2.h>\r
+#include <Protocol/FormBrowserEx.h>\r
 #include <Protocol/DevicePath.h>\r
 #include <Protocol/UnicodeCollation.h>\r
 #include <Protocol/HiiConfigAccess.h>\r
@@ -74,10 +75,7 @@ extern UINT8  SetupBrowserStrings[];
 // Definition for function key setting\r
 //\r
 #define NONE_FUNCTION_KEY_SETTING     0\r
-#define DEFAULT_FUNCTION_KEY_SETTING  (FUNCTION_NINE | FUNCTION_TEN)\r
-\r
-#define FUNCTION_NINE                 (1 << 2)\r
-#define FUNCTION_TEN                  (1 << 3)\r
+#define ENABLE_FUNCTION_KEY_SETTING   1\r
 \r
 typedef struct {\r
   EFI_GUID  FormSetGuid;\r
@@ -164,7 +162,9 @@ typedef struct {
   //\r
   // Produced protocol\r
   //\r
-  EFI_FORM_BROWSER2_PROTOCOL         FormBrowser2;\r
+  EFI_FORM_BROWSER2_PROTOCOL          FormBrowser2;\r
+  \r
+  EFI_FORM_BROWSER_EXTENSION_PROTOCOL FormBrowserEx;\r
 \r
 } SETUP_DRIVER_PRIVATE_DATA;\r
 \r
@@ -448,8 +448,12 @@ typedef struct {
 \r
 #define FORMSET_DEFAULTSTORE_FROM_LINK(a)  CR (a, FORMSET_DEFAULTSTORE, Link, FORMSET_DEFAULTSTORE_SIGNATURE)\r
 \r
+#define FORM_BROWSER_FORMSET_SIGNATURE  SIGNATURE_32 ('F', 'B', 'F', 'S')\r
+\r
 typedef struct {\r
-  EFI_HII_HANDLE                  HiiHandle;\r
+  UINTN                           Signature;\r
+  LIST_ENTRY                      Link;\r
+  EFI_HII_HANDLE                  HiiHandle;      // unique id for formset.\r
   EFI_HANDLE                      DriverHandle;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
@@ -475,6 +479,8 @@ typedef struct {
   LIST_ENTRY                      ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
 } FORM_BROWSER_FORMSET;\r
 \r
+#define FORM_BROWSER_FORMSET_FROM_LINK(a)  CR (a, FORM_BROWSER_FORMSET, Link, FORM_BROWSER_FORMSET_SIGNATURE)\r
+\r
 #define BROWSER_CONTEXT_SIGNATURE  SIGNATURE_32 ('B', 'C', 'T', 'X')\r
 \r
 typedef struct {\r
@@ -490,13 +496,10 @@ typedef struct {
   BOOLEAN               ResetRequired;\r
   UINT16                Direction;\r
   EFI_SCREEN_DESCRIPTOR ScreenDimensions;\r
-  CHAR16                *FunctionNineString;\r
-  CHAR16                *FunctionTenString;\r
   CHAR16                *EnterString;\r
   CHAR16                *EnterCommitString;\r
   CHAR16                *EnterEscapeString;\r
   CHAR16                *EscapeString;\r
-  CHAR16                *SaveFailed;\r
   CHAR16                *MoveHighlight;\r
   CHAR16                *MakeSelection;\r
   CHAR16                *DecNumericInput;\r
@@ -534,6 +537,20 @@ typedef struct {
 \r
 #define BROWSER_CONTEXT_FROM_LINK(a)  CR (a, BROWSER_CONTEXT, Link, BROWSER_CONTEXT_SIGNATURE)\r
 \r
+#define BROWSER_HOT_KEY_SIGNATURE  SIGNATURE_32 ('B', 'H', 'K', 'S')\r
+\r
+typedef struct {\r
+  UINTN                 Signature;\r
+  LIST_ENTRY            Link;\r
+  \r
+  EFI_INPUT_KEY         *KeyData;\r
+  IN UINT32             Action;\r
+  IN UINT16             DefaultId;\r
+  IN EFI_STRING         HelpString;\r
+} BROWSER_HOT_KEY;\r
+\r
+#define BROWSER_HOT_KEY_FROM_LINK(a)  CR (a, BROWSER_HOT_KEY, Link, BROWSER_HOT_KEY_SIGNATURE)\r
+\r
 extern EFI_HII_DATABASE_PROTOCOL         *mHiiDatabase;\r
 extern EFI_HII_STRING_PROTOCOL           *mHiiString;\r
 extern EFI_HII_CONFIG_ROUTING_PROTOCOL   *mHiiConfigRouting;\r
@@ -548,12 +565,17 @@ extern UINT16                gDirection;
 extern EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
 \r
 extern FORM_BROWSER_FORMSET  *gOldFormSet;\r
+extern LIST_ENTRY            gBrowserFormSetList;\r
+extern LIST_ENTRY            gBrowserHotKeyList;\r
+extern BROWSER_SETTING_SCOPE gBrowserSettingScope;\r
+extern EXIT_HANDLER          ExitHandlerFunction;\r
+extern UINTN                 gFooterHeight;\r
 \r
 //\r
 // Browser Global Strings\r
 //\r
-extern CHAR16            *gFunctionNineString;\r
-extern CHAR16            *gFunctionTenString;\r
+extern CHAR16            *gDiscardFailed;\r
+extern CHAR16            *gDefaultFailed;\r
 extern CHAR16            *gEnterString;\r
 extern CHAR16            *gEnterCommitString;\r
 extern CHAR16            *gEnterEscapeString;\r
@@ -924,38 +946,41 @@ ValidateQuestion (
   IN  UINTN                           Type\r
   );\r
 \r
+\r
 /**\r
-  Discard data for form level or formset level.\r
+  Discard data based on the input setting scope (Form, FormSet or System).\r
 \r
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
-  @param  SingleForm             whether submit single form or formset.\r
+  @param  SettingScope           Setting Scope for Discard action.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
 \r
 **/\r
 EFI_STATUS\r
 DiscardForm (\r
   IN FORM_BROWSER_FORMSET             *FormSet,\r
   IN FORM_BROWSER_FORM                *Form,\r
-  IN BOOLEAN                          SingleForm\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
   );\r
 \r
 /**\r
-  Submit data for form level or formset level.\r
+  Submit data based on the input Setting level (Form, FormSet or System).\r
 \r
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
-  @param  SingleForm             whether submit single form or formset.\r
+  @param  SettingScope           Setting Scope for Submit action.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
 \r
 **/\r
 EFI_STATUS\r
 SubmitForm (\r
   IN FORM_BROWSER_FORMSET             *FormSet,\r
   IN FORM_BROWSER_FORM                *Form,\r
-  IN BOOLEAN                          SingleForm\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
   );\r
 \r
 /**\r
@@ -1011,18 +1036,23 @@ InitializeFormSet (
   );\r
 \r
 /**\r
-  Reset Questions in a Formset to their default value.\r
+  Reset Questions to their default value in a Form, Formset or System.\r
 \r
   @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
   @param  DefaultId              The Class of the default.\r
+  @param  SettingScope           Setting Scope for Default action.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
 \r
 **/\r
 EFI_STATUS\r
-ExtractFormSetDefault (\r
+ExtractDefault (\r
   IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN UINT16                           DefaultId\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN UINT16                           DefaultId,\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
   );\r
 \r
 /**\r
@@ -1300,4 +1330,121 @@ ProcessCallBackFunction (
   IN     EFI_BROWSER_ACTION              Action,\r
   IN     BOOLEAN                         SkipSaveOrDiscard\r
   );\r
+\r
+/**\r
+  Find the matched FormSet context in the backup maintain list based on HiiHandle.\r
+  \r
+  @param Handle  The Hii Handle.\r
+  \r
+  @return the found FormSet context. If no found, NULL will return.\r
+\r
+**/\r
+FORM_BROWSER_FORMSET * \r
+GetFormSetFromHiiHandle (\r
+  EFI_HII_HANDLE Handle\r
+  );\r
+\r
+/**\r
+  Check whether the input HII handle is the FormSet that is being used.\r
+  \r
+  @param Handle  The Hii Handle.\r
+  \r
+  @retval TRUE   HII handle is being used.\r
+  @retval FALSE  HII handle is not being used.\r
+\r
+**/\r
+BOOLEAN\r
+IsHiiHandleInBrowserContext (\r
+  EFI_HII_HANDLE Handle\r
+  );\r
+\r
+/**\r
+  Configure what scope the hot key will impact.\r
+  All hot keys have the same scope. The mixed hot keys with the different level are not supported.\r
+  If no scope is set, the default scope will be FormSet level.\r
+  After all registered hot keys are removed, previous Scope can reset to another level.\r
+  \r
+  @param[in] Scope               Scope level to be set. \r
+  \r
+  @retval EFI_SUCCESS            Scope is set correctly.\r
+  @retval EFI_INVALID_PARAMETER  Scope is not the valid value specified in BROWSER_SETTING_SCOPE. \r
+  @retval EFI_UNSPPORTED         Scope level is different from current one that the registered hot keys have.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetScope (\r
+  IN BROWSER_SETTING_SCOPE Scope\r
+  );\r
+\r
+/**\r
+  Register the hot key with its browser action, or unregistered the hot key.\r
+  Only support hot key that is not printable character (control key, function key, etc.).\r
+  If the action value is zero, the hot key will be unregistered if it has been registered.\r
+  If the same hot key has been registered, the new action and help string will override the previous ones.\r
+  \r
+  @param[in] KeyData     A pointer to a buffer that describes the keystroke\r
+                         information for the hot key. Its type is EFI_INPUT_KEY to \r
+                         be supported by all ConsoleIn devices.\r
+  @param[in] Action      Action value that describes what action will be trigged when the hot key is pressed. \r
+  @param[in] DefaultId   Specifies the type of defaults to retrieve, which is only for DEFAULT action.\r
+  @param[in] HelpString  Help string that describes the hot key information.\r
+                         Its value may be NULL for the unregistered hot key.\r
+  \r
+  @retval EFI_SUCCESS            Hot key is registered or unregistered.\r
+  @retval EFI_INVALID_PARAMETER  KeyData is NULL.\r
+  @retval EFI_NOT_FOUND          KeyData is not found to be unregistered.\r
+  @retval EFI_UNSUPPORTED        Key represents a printable character. It is conflicted with Browser.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterHotKey (\r
+  IN EFI_INPUT_KEY *KeyData,\r
+  IN UINT32        Action,\r
+  IN UINT16        DefaultId,\r
+  IN EFI_STRING    HelpString OPTIONAL\r
+  );\r
+\r
+/**\r
+  Register Exit handler function. \r
+  When more than one handler function is registered, the latter one will override the previous one. \r
+  When NULL handler is specified, the previous Exit handler will be unregistered. \r
+  \r
+  @param[in] Handler      Pointer to handler function. \r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RegiserExitHandler (\r
+  IN EXIT_HANDLER Handler\r
+  );\r
+\r
+/**\r
+  Create reminder to let user to choose save or discard the changed browser data.\r
+  Caller can use it to actively check the changed browser data.\r
+\r
+  @retval BROWSER_NO_CHANGES       No browser data is changed.\r
+  @retval BROWSER_SAVE_CHANGES     The changed browser data is saved.\r
+  @retval BROWSER_DISCARD_CHANGES  The changed browser data is discard.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+SaveReminder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Find the registered HotKey based on KeyData.\r
+  \r
+  @param[in] KeyData     A pointer to a buffer that describes the keystroke\r
+                         information for the hot key.\r
+\r
+  @return The registered HotKey context. If no found, NULL will return.\r
+**/\r
+BROWSER_HOT_KEY *\r
+GetHotKeyFromRegisterList (\r
+  IN EFI_INPUT_KEY *KeyData\r
+  );\r
+\r
 #endif\r