INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf\r
INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
-INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
\r
INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf\r
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf\r
- CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
#\r
# Platform\r
#\r
}\r
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
- MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
\r
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf\r
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf\r
- CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
#\r
# Platform\r
#\r
}\r
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
- MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
\r
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
+++ /dev/null
-/** @file\r
- This library class defines a set of interfaces to customize Display module\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef __CUSTOMIZED_DISPLAY_LIB_H__\r
-#define __CUSTOMIZED_DISPLAY_LIB_H__\r
-\r
-#include <Protocol/DisplayProtocol.h>\r
-\r
-/**\r
-+------------------------------------------------------------------------------+\r
-| Setup Page |\r
-+------------------------------------------------------------------------------+\r
-\r
-Statement\r
-Statement\r
-Statement\r
-\r
-\r
-\r
-\r
-\r
-+------------------------------------------------------------------------------+\r
-| F9=Reset to Defaults F10=Save |\r
-| ^"=Move Highlight <Spacebar> Toggles Checkbox Esc=Exit |\r
-+------------------------------------------------------------------------------+\r
- StatusBar\r
-**/\r
-\r
-/**\r
- This funtion defines Page Frame and Backgroud. \r
- \r
- Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, \r
- StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. \r
-\r
- @param[in] FormData Form Data to be shown in Page.\r
- @param[out] ScreenForStatement Screen to be used for Statement. (Prompt, Value and Help)\r
- \r
- @return Status\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DisplayPageFrame (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT EFI_SCREEN_DESCRIPTOR *ScreenForStatement\r
- );\r
-\r
-/**\r
- Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-ClearDisplayPage (\r
- VOID\r
- );\r
-\r
-/**\r
- This function updates customized key panel's help information.\r
- The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.\r
- and arrange them in Footer panel.\r
- \r
- @param[in] FormData Form Data to be shown in Page. FormData has the highlighted statement. \r
- @param[in] Statement The statement current selected.\r
- @param[in] Selected Whether or not a tag be selected. TRUE means Enter has hit this question.\r
-**/\r
-VOID\r
-EFIAPI\r
-RefreshKeyHelp (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN BOOLEAN Selected\r
- );\r
-\r
-/**\r
- Update status bar.\r
-\r
- This function updates the status bar on the bottom of menu screen. It just shows StatusBar. \r
- Original logic in this function should be splitted out.\r
-\r
- @param[in] MessageType The type of message to be shown. InputError or Configuration Changed. \r
- @param[in] State Show or Clear Message.\r
-**/\r
-VOID\r
-EFIAPI\r
-UpdateStatusBar (\r
- IN UINTN MessageType,\r
- IN BOOLEAN State\r
- );\r
-\r
-/**\r
- Create popup window. \r
-\r
- This function draws OEM/Vendor specific pop up windows.\r
-\r
- @param[out] Key User Input Key\r
- @param ... String to be shown in Popup. The variable argument list is terminated by a NULL.\r
- \r
-**/\r
-VOID\r
-EFIAPI\r
-CreateDialog (\r
- OUT EFI_INPUT_KEY *Key, OPTIONAL\r
- ...\r
- );\r
-\r
-/**\r
- Confirm how to handle the changed data. \r
- \r
- @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.\r
-**/\r
-UINTN\r
-EFIAPI\r
-ConfirmDataChange (\r
- VOID\r
- );\r
-\r
-/**\r
- OEM specifies whether Setup exits Page by ESC key.\r
-\r
- This function customized the behavior that whether Setup exits Page so that \r
- system able to boot when configuration is not changed.\r
-\r
- @retval TRUE Exits FrontPage\r
- @retval FALSE Don't exit FrontPage.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FormExitPolicy (\r
- VOID\r
- );\r
-\r
-/**\r
- Set Timeout value for a ceratain Form to get user response. \r
- \r
- This function allows to set timeout value on a ceratain form if necessary.\r
- If timeout is not zero, the form will exit if user has no response in timeout. \r
- \r
- @param[in] FormData Form Data to be shown in Page\r
-\r
- @return 0 No timeout for this form. \r
- @return > 0 Timeout value in 100 ns units.\r
-**/\r
-UINT64\r
-EFIAPI\r
-FormExitTimeout (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
-\r
-//\r
-// Print Functions\r
-//\r
-/**\r
- Prints a unicode string to the default console, at\r
- the supplied cursor position, using L"%s" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param String String pointer.\r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAt (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *String\r
- );\r
-\r
-\r
-/**\r
- Prints a unicode string with the specified width to the default console, at\r
- the supplied cursor position, using L"%s" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param String String pointer.\r
- @param Width Width for String to be printed. If the print length of String < Width, \r
- Space char (L' ') will be used to append String. \r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAtWithWidth (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *String,\r
- IN UINTN Width\r
- );\r
-\r
-/**\r
- Prints a chracter to the default console, at\r
- the supplied cursor position, using L"%c" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param Character Character to print.\r
-\r
- @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintCharAt (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- CHAR16 Character\r
- );\r
-\r
-/**\r
- Clear retangle with specified text attribute.\r
-\r
- @param LeftColumn Left column of retangle.\r
- @param RightColumn Right column of retangle.\r
- @param TopRow Start row of retangle.\r
- @param BottomRow End row of retangle.\r
- @param TextAttribute The character foreground and background.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-ClearLines (\r
- IN UINTN LeftColumn,\r
- IN UINTN RightColumn,\r
- IN UINTN TopRow,\r
- IN UINTN BottomRow,\r
- IN UINTN TextAttribute\r
- );\r
-\r
-//\r
-// Color Setting Functions\r
-//\r
-/**\r
- Get OEM/Vendor specific popup attribute colors.\r
-\r
- @retval Byte code color setting for popup color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific popup attribute colors.\r
-\r
- @retval Byte code color setting for popup inverse color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupInverseColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific PickList color attribute.\r
-\r
- @retval Byte code color setting for pick list color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPickListColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific arrow color attribute.\r
-\r
- @retval Byte code color setting for arrow color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetArrowColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific info text color attribute.\r
-\r
- @retval Byte code color setting for info text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetInfoTextColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific help text color attribute.\r
-\r
- @retval Byte code color setting for help text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHelpTextColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific grayed out text color attribute.\r
-\r
- @retval Byte code color setting for grayed out text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetGrayedTextColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific highlighted text color attribute.\r
-\r
- @retval Byte code color setting for highlight text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHighlightTextColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific field text color attribute.\r
-\r
- @retval Byte code color setting for field text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetFieldTextColor (\r
- VOID\r
- );\r
-\r
-/**\r
- Get OEM/Vendor specific subtitle text color attribute.\r
-\r
- @retval Byte code color setting for subtitle text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetSubTitleTextColor (\r
- VOID\r
- );\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
- FormDiplay protocol to show Form\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef __DISPLAY_PROTOCOL_H__\r
-#define __DISPLAY_PROTOCOL_H__\r
-\r
-#include <Protocol/FormBrowser2.h>\r
-\r
-#define EDKII_FORM_DISPLAY_ENGINE_PROTOCOL_GUID \\r
- { 0x9bbe29e9, 0xfda1, 0x41ec, { 0xad, 0x52, 0x45, 0x22, 0x13, 0x74, 0x2d, 0x2e } }\r
-\r
-// \r
-// Do nothing.\r
-//\r
-#define BROWSER_ACTION_NONE BIT16\r
-//\r
-// ESC Exit\r
-//\r
-#define BROWSER_ACTION_FORM_EXIT BIT17\r
-\r
-#define BROWSER_SUCCESS 0x0\r
-#define BROWSER_ERROR BIT31\r
-#define BROWSER_SUBMIT_FAIL BROWSER_ERROR | 0x01\r
-#define BROWSER_NO_SUBMIT_IF BROWSER_ERROR | 0x02\r
-#define BROWSER_FORM_NOT_FOUND BROWSER_ERROR | 0x03\r
-#define BROWSER_FORM_SUPPRESS BROWSER_ERROR | 0x04\r
-#define BROWSER_PROTOCOL_NOT_FOUND BROWSER_ERROR | 0x05\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1 0x10000\r
-#define FORM_DISPLAY_ENGINE_VERSION_1 0x10000\r
-\r
-typedef struct {\r
- //\r
- // HII Data Type\r
- //\r
- UINT8 Type;\r
- //\r
- // Buffer Data and Length if Type is EFI_IFR_TYPE_BUFFER or EFI_IFR_TYPE_STRING\r
- //\r
- UINT8 *Buffer;\r
- UINT16 BufferLen;\r
- EFI_IFR_TYPE_VALUE Value;\r
-} EFI_HII_VALUE;\r
-\r
-#define DISPLAY_QUESTION_OPTION_SIGNATURE SIGNATURE_32 ('Q', 'O', 'P', 'T')\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
- //\r
- // OneOfOption Data\r
- //\r
- EFI_IFR_ONE_OF_OPTION *OptionOpCode;\r
- //\r
- // Option ImageId and AnimationId\r
- //\r
- EFI_IMAGE_ID ImageId;\r
- EFI_ANIMATION_ID AnimationId;\r
-} DISPLAY_QUESTION_OPTION;\r
-\r
-#define DISPLAY_QUESTION_OPTION_FROM_LINK(a) CR (a, DISPLAY_QUESTION_OPTION, Link, DISPLAY_QUESTION_OPTION_SIGNATURE)\r
-\r
-typedef struct _FORM_DISPLAY_ENGINE_STATEMENT FORM_DISPLAY_ENGINE_STATEMENT;\r
-typedef struct _FORM_DISPLAY_ENGINE_FORM FORM_DISPLAY_ENGINE_FORM;\r
-\r
-#define STATEMENT_VALID 0x0\r
-#define STATEMENT_INVALID BIT31\r
-\r
-#define INCOSISTENT_IF_TRUE STATEMENT_INVALID | 0x01\r
-#define WARNING_IF_TRUE STATEMENT_INVALID | 0x02\r
-#define STRING_TOO_LONG STATEMENT_INVALID | 0x03\r
-// ... to be extended.\r
-\r
-typedef struct {\r
- //\r
- // StringId for INCONSITENT_IF or WARNING_IF\r
- //\r
- EFI_STRING_ID StringId;\r
- //\r
- // TimeOut for WARNING_IF\r
- //\r
- UINT8 TimeOut;\r
-} STATEMENT_ERROR_INFO;\r
-\r
-/**\r
- Perform value check for a question.\r
- \r
- @param Form Form where Statement is in.\r
- @param Statement Value will check for it.\r
- @param Value New value will be checked.\r
- \r
- @retval Status Value Status\r
-\r
-**/\r
-typedef\r
-UINT32\r
-(EFIAPI *VALIDATE_QUESTION) (\r
- IN FORM_DISPLAY_ENGINE_FORM *Form,\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN EFI_HII_VALUE *Value, \r
- OUT STATEMENT_ERROR_INFO *ErrorInfo\r
- );\r
-\r
-/**\r
- Perform Password check. \r
- Passwork may be encrypted by driver that requires the specific check.\r
- \r
- @param Form Form where Password Statement is in.\r
- @param Statement Password statement\r
- @param PasswordString Password string to be checked. It may be NULL.\r
- NULL means to restore password.\r
- "" string can be used to checked whether old password does exist.\r
- \r
- @return Status Status of Password check.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *PASSWORD_CHECK) (\r
- IN FORM_DISPLAY_ENGINE_FORM *Form,\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN EFI_STRING PasswordString OPTIONAL\r
- );\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'A')\r
-\r
-//\r
-// Attribute for Statement and Form\r
-//\r
-#define HII_DISPLAY_GRAYOUT BIT0\r
-#define HII_DISPLAY_LOCK BIT1\r
-#define HII_DISPLAY_READONLY BIT2\r
-#define HII_DISPLAY_MODAL BIT3\r
-\r
-struct _FORM_DISPLAY_ENGINE_STATEMENT{\r
- UINTN Signature;\r
- //\r
- // Version for future structure extension\r
- //\r
- UINTN Version;\r
- //\r
- // link to all the statement which will show in the display form.\r
- //\r
- LIST_ENTRY DisplayLink;\r
- //\r
- // Pointer to statement opcode.\r
- // for Guided Opcode. All buffers will be here if GUIDED opcode scope is set.\r
- //\r
- EFI_IFR_OP_HEADER *OpCode;\r
- //\r
- // Question CurrentValue\r
- //\r
- EFI_HII_VALUE CurrentValue;\r
- //\r
- // Flag to describe whether setting is changed or not.\r
- // Displayer may depend on it to show it with the different color. \r
- //\r
- BOOLEAN SettingChangedFlag;\r
- //\r
- // nested Statement list inside of EFI_IFR_SUBTITLE\r
- //\r
- LIST_ENTRY NestStatementList;\r
- //\r
- // nested EFI_IFR_ONE_OF_OPTION list (QUESTION_OPTION)\r
- //\r
- LIST_ENTRY OptionListHead;\r
- //\r
- // Statement attributes: GRAYOUT, LOCK and READONLY\r
- //\r
- UINT32 Attribute;\r
-\r
- //\r
- // ValidateQuestion to do InconsistIf check\r
- // It may be NULL if any value is valid.\r
- //\r
- VALIDATE_QUESTION ValidateQuestion;\r
- \r
- //\r
- // Password additional check. It may be NULL when the additional check is not required.\r
- //\r
- PASSWORD_CHECK PasswordCheck;\r
-\r
- //\r
- // Statement ImageId and AnimationId\r
- //\r
- EFI_IMAGE_ID ImageId;\r
- EFI_ANIMATION_ID AnimationId;\r
-};\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK(a) CR (a, FORM_DISPLAY_ENGINE_STATEMENT, DisplayLink, FORM_DISPLAY_ENGINE_STATEMENT_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
- //\r
- // Action is Discard, Default, Submit, Reset and Exit.\r
- //\r
- UINT32 Action;\r
- UINT16 DefaultId;\r
- //\r
- // HotKey Help String\r
- //\r
- 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
-#define FORM_DISPLAY_ENGINE_FORM_SIGNATURE SIGNATURE_32 ('F', 'F', 'R', 'M')\r
-\r
-struct _FORM_DISPLAY_ENGINE_FORM {\r
- UINTN Signature;\r
- //\r
- // Version for future structure extension\r
- //\r
- UINTN Version;\r
- //\r
- // Statement List inside of Form\r
- //\r
- LIST_ENTRY StatementListHead;\r
- //\r
- // Statement List outside of Form \r
- //\r
- LIST_ENTRY StatementListOSF;\r
- //\r
- // The input screen dimenstions info.\r
- //\r
- EFI_SCREEN_DESCRIPTOR *ScreenDimensions;\r
- //\r
- // FormSet information\r
- //\r
- EFI_GUID FormSetGuid;\r
- //\r
- // HiiHandle can be used to get String, Image or Animation\r
- //\r
- EFI_HII_HANDLE HiiHandle;\r
- \r
- //\r
- // Form ID and Title.\r
- //\r
- UINT16 FormId;\r
- EFI_STRING_ID FormTitle;\r
- //\r
- // Form Attributes: Lock, Modal.\r
- //\r
- UINT32 Attribute;\r
- //\r
- // Flag to describe whether setting is changed or not.\r
- // Displayer depends on it to show ChangedFlag.\r
- //\r
- BOOLEAN SettingChangedFlag;\r
-\r
- //\r
- // Statement to be HighLighted\r
- //\r
- FORM_DISPLAY_ENGINE_STATEMENT *HighLightedStatement;\r
- //\r
- // Event to notify Displayer that FormData is updated to be refreshed.\r
- //\r
- EFI_EVENT FormRefreshEvent;\r
- //\r
- // Additional Hotkey registered by BrowserEx protocol.\r
- //\r
- LIST_ENTRY HotKeyListHead;\r
-\r
- //\r
- // Form ImageId and AnimationId\r
- //\r
- EFI_IMAGE_ID ImageId;\r
- EFI_ANIMATION_ID AnimationId;\r
- \r
- //\r
- // If Status is error, display needs to handle it. \r
- //\r
- UINT32 BrowserStatus;\r
- //\r
- // String for error status. It may be NULL. \r
- //\r
- EFI_STRING ErrorString;\r
-};\r
-\r
-#define FORM_DISPLAY_ENGINE_FORM_FROM_LINK(a) CR (a, FORM_DISPLAY_ENGINE_FORM, Link, FORM_DISPLAY_ENGINE_FORM_SIGNATURE)\r
-\r
-typedef struct {\r
- FORM_DISPLAY_ENGINE_STATEMENT *SelectedStatement; // Selected Statement and InputValue\r
- \r
- EFI_HII_VALUE InputValue;\r
- \r
- UINT32 Action; // If SelectedStatement is NULL, Action will be used.\r
- // Trig Action (Discard, Default, Submit, Reset and Exit)\r
- UINT16 DefaultId;\r
-} USER_INPUT;\r
-\r
-/**\r
- Display one form, and return user input.\r
- \r
- @param FormData Form Data to be shown.\r
- @param UserInputData User input data.\r
- \r
- @retval EFI_SUCCESS Form Data is shown, and user input is got.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *FORM_DISPLAY) (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT USER_INPUT *UserInputData\r
-);\r
-\r
-/**\r
- Exit Display and Clear Screen to the original state.\r
-\r
-**/\r
-typedef\r
-VOID\r
-(EFIAPI *EXIT_DISPLAY) (\r
- VOID\r
-);\r
-\r
-/**\r
- Confirm how to handle the changed data. \r
- \r
- @return Action of Submit, Discard and None\r
-**/\r
-typedef\r
-UINTN\r
-(EFIAPI *CONFIRM_DATA_CHANGE) (\r
- VOID\r
-);\r
-\r
-typedef struct {\r
- FORM_DISPLAY FormDisplay;\r
- EXIT_DISPLAY ExitDisplay;\r
- CONFIRM_DATA_CHANGE ConfirmDataChange;\r
-} EDKII_FORM_DISPLAY_ENGINE_PROTOCOL;\r
-\r
-extern EFI_GUID gEdkiiFormDisplayEngineProtocolGuid;\r
-#endif\r
+++ /dev/null
-/** @file\r
- Extension Form Browser Protocol provides the services that can be used to \r
- register the different hot keys for the standard Browser actions described in UEFI specification.\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef __FORM_BROWSER_EXTENSION2_H__\r
-#define __FORM_BROWSER_EXTENSION2_H__\r
-\r
-#include <Protocol/FormBrowserEx.h>\r
-\r
-#define EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL_GUID \\r
- { 0xa770c357, 0xb693, 0x4e6d, { 0xa6, 0xcf, 0xd2, 0x1c, 0x72, 0x8e, 0x55, 0xb }}\r
-\r
-typedef struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL;\r
-\r
-#define BROWSER_EXTENSION2_VERSION_1 0x10000\r
-\r
-/**\r
- Check whether the browser data has been modified.\r
-\r
- @retval TRUE Browser data is modified.\r
- @retval FALSE No browser data is modified.\r
-\r
-**/\r
-typedef\r
-BOOLEAN\r
-(EFIAPI *IS_BROWSER_DATA_MODIFIED) (\r
- VOID\r
- );\r
-\r
-/**\r
- Execute the action requested by the Action parameter.\r
-\r
- @param[in] Action Execute the request action.\r
- @param[in] DefaultId The default Id info when need to load default value.\r
-\r
- @retval EFI_SUCCESS Execute the request action succss.\r
-\r
-**/\r
-typedef \r
-EFI_STATUS \r
-(EFIAPI *EXECUTE_ACTION) (\r
- IN UINT32 Action,\r
- IN UINT16 DefaultId\r
- );\r
-\r
-#define FORM_ENTRY_INFO_SIGNATURE SIGNATURE_32 ('f', 'e', 'i', 's')\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
-\r
- EFI_HII_HANDLE HiiHandle;\r
- EFI_GUID FormSetGuid;\r
- EFI_FORM_ID FormId;\r
- EFI_QUESTION_ID QuestionId;\r
-} FORM_ENTRY_INFO;\r
-\r
-#define FORM_ENTRY_INFO_FROM_LINK(a) CR (a, FORM_ENTRY_INFO, Link, FORM_ENTRY_INFO_SIGNATURE)\r
-\r
-struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL {\r
- ///\r
- /// Version for protocol future extension.\r
- ///\r
- UINT32 Version;\r
- SET_SCOPE SetScope;\r
- REGISTER_HOT_KEY RegisterHotKey;\r
- REGISTER_EXIT_HANDLER RegiserExitHandler;\r
- IS_BROWSER_DATA_MODIFIED IsBrowserDataModified;\r
- EXECUTE_ACTION ExecuteAction;\r
- ///\r
- /// A list of type FORMID_INFO is Browser View Form History List.\r
- ///\r
- LIST_ENTRY FormViewHistoryHead;\r
-};\r
-\r
-extern EFI_GUID gEdkiiFormBrowserEx2ProtocolGuid;\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
-MACRO definitions for color used in Setup Browser.\r
-\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-//\r
-// Unicode collation protocol in\r
-\r
-#ifndef _COLORS_H_\r
-#define _COLORS_H_\r
-\r
-//\r
-// Screen Color Settings\r
-//\r
-#define PICKLIST_HIGHLIGHT_TEXT EFI_WHITE\r
-#define PICKLIST_HIGHLIGHT_BACKGROUND EFI_BACKGROUND_CYAN\r
-#define TITLE_TEXT EFI_WHITE\r
-#define TITLE_BACKGROUND EFI_BACKGROUND_BLUE\r
-#define KEYHELP_TEXT EFI_LIGHTGRAY\r
-#define KEYHELP_BACKGROUND EFI_BACKGROUND_BLACK\r
-#define SUBTITLE_BACKGROUND EFI_BACKGROUND_LIGHTGRAY\r
-#define BANNER_TEXT EFI_BLUE\r
-#define BANNER_BACKGROUND EFI_BACKGROUND_LIGHTGRAY\r
-#define FIELD_TEXT_GRAYED EFI_DARKGRAY\r
-#define FIELD_BACKGROUND EFI_BACKGROUND_LIGHTGRAY\r
-#define POPUP_TEXT EFI_LIGHTGRAY\r
-#define POPUP_BACKGROUND EFI_BACKGROUND_BLUE\r
-#define POPUP_INVERSE_TEXT EFI_LIGHTGRAY\r
-#define POPUP_INVERSE_BACKGROUND EFI_BACKGROUND_BLACK\r
-#define HELP_TEXT EFI_BLUE\r
-#define ERROR_TEXT EFI_RED | EFI_BRIGHT\r
-#define INFO_TEXT EFI_YELLOW | EFI_BRIGHT\r
-#define ARROW_TEXT EFI_RED | EFI_BRIGHT\r
-#define ARROW_BACKGROUND EFI_BACKGROUND_LIGHTGRAY\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
-\r
- This library class defines a set of interfaces to customize Display module\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-#include "CustomizedDisplayLibInternal.h"\r
-\r
-EFI_GUID gCustomizedDisplayLibGuid = { 0x99fdc8fd, 0x849b, 0x4eba, { 0xad, 0x13, 0xfb, 0x96, 0x99, 0xc9, 0xa, 0x4d } };\r
-\r
-EFI_HII_HANDLE mCDLStringPackHandle;\r
-UINT16 gClassOfVfr; // Formset class information\r
-BOOLEAN gLibIsFirstForm = TRUE;\r
-BANNER_DATA *gBannerData;\r
-\r
-UINTN gFooterHeight;\r
-\r
-/**\r
-+------------------------------------------------------------------------------+\r
-| Setup Page |\r
-+------------------------------------------------------------------------------+\r
-\r
-Statement\r
-Statement\r
-Statement\r
-\r
-\r
-\r
-\r
-\r
-+------------------------------------------------------------------------------+\r
-| F9=Reset to Defaults F10=Save |\r
-| ^"=Move Highlight <Spacebar> Toggles Checkbox Esc=Exit |\r
-+------------------------------------------------------------------------------+\r
- StatusBar\r
-**/\r
-\r
-/**\r
- This funtion defines Page Frame and Backgroud. \r
- \r
- Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, \r
- StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. \r
-\r
- @param[in] FormData Form Data to be shown in Page.\r
- @param[out] ScreenForStatement Screen to be used for Statement. (Prompt, Value and Help)\r
- \r
- @return Status\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DisplayPageFrame (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT EFI_SCREEN_DESCRIPTOR *ScreenForStatement\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- ASSERT (FormData != NULL && ScreenForStatement != NULL);\r
- if (FormData == NULL || ScreenForStatement == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Status = ScreenDiemensionInfoValidate (FormData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
-\r
- ProcessExternedOpcode(FormData);\r
-\r
- //\r
- // Calculate the ScreenForStatement.\r
- //\r
- ScreenForStatement->BottomRow = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight;\r
- if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
- ScreenForStatement->TopRow = gScreenDimensions.TopRow + FRONT_PAGE_HEADER_HEIGHT;\r
- } else {\r
- ScreenForStatement->TopRow = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;\r
- }\r
- ScreenForStatement->LeftColumn = gScreenDimensions.LeftColumn;\r
- ScreenForStatement->RightColumn = gScreenDimensions.RightColumn;\r
-\r
- if ((gLibIsFirstForm) || ((FormData->Attribute & HII_DISPLAY_MODAL) != 0)) {\r
- //\r
- // Ensure we are in Text mode\r
- //\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- ClearLines (0, gScreenDimensions.RightColumn, 0, gScreenDimensions.BottomRow, KEYHELP_BACKGROUND);\r
- gLibIsFirstForm = FALSE;\r
- }\r
-\r
- //\r
- // Don't print frame for modal form.\r
- //\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
- PrintBannerInfo (FormData);\r
- }\r
-\r
- PrintFramework (FormData);\r
-\r
- UpdateStatusBar(NV_UPDATE_REQUIRED, FormData->SettingChangedFlag);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function updates customized key panel's help information.\r
- The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.\r
- and arrange them in Footer panel.\r
- \r
- @param[in] FormData Form Data to be shown in Page. FormData has the highlighted statement. \r
- @param[in] Statement The statement current selected.\r
- @param[in] Selected Whether or not a tag be selected. TRUE means Enter has hit this question.\r
-**/\r
-VOID\r
-EFIAPI\r
-RefreshKeyHelp (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN BOOLEAN Selected\r
- )\r
-{\r
- UINTN SecCol;\r
- UINTN ThdCol;\r
- UINTN LeftColumnOfHelp;\r
- UINTN RightColumnOfHelp;\r
- UINTN TopRowOfHelp;\r
- UINTN BottomRowOfHelp;\r
- UINTN StartColumnOfHelp;\r
- EFI_IFR_NUMERIC *NumericOp;\r
- EFI_IFR_DATE *DateOp;\r
- EFI_IFR_TIME *TimeOp;\r
- BOOLEAN HexDisplay;\r
-\r
- ASSERT (FormData != NULL);\r
- if (FormData == NULL) {\r
- return;\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- return;\r
- }\r
-\r
- SecCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3;\r
- ThdCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2;\r
-\r
- StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
- LeftColumnOfHelp = gScreenDimensions.LeftColumn + 1;\r
- RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\r
- TopRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
- BottomRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
-\r
- ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
- if (Statement == NULL) {\r
- //\r
- // Print Key for Form without showable statement.\r
- //\r
- PrintHotKeyHelpString (FormData);\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
- return;\r
- }\r
-\r
- HexDisplay = FALSE;\r
- NumericOp = NULL;\r
- DateOp = NULL;\r
- TimeOp = NULL;\r
- if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) {\r
- NumericOp = (EFI_IFR_NUMERIC *) Statement->OpCode;\r
- HexDisplay = (NumericOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
- } else if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- DateOp = (EFI_IFR_DATE *) Statement->OpCode;\r
- HexDisplay = (DateOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
- } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- TimeOp = (EFI_IFR_TIME *) Statement->OpCode;\r
- HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
- } \r
- switch (Statement->OpCode->OpCode) {\r
- case EFI_IFR_ORDERED_LIST_OP:\r
- case EFI_IFR_ONE_OF_OP:\r
- case EFI_IFR_NUMERIC_OP:\r
- case EFI_IFR_TIME_OP:\r
- case EFI_IFR_DATE_OP:\r
- if (!Selected) {\r
- PrintHotKeyHelpString (FormData);\r
-\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
- }\r
-\r
- if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- PrintAt (\r
- 0, \r
- StartColumnOfHelp,\r
- BottomRowOfHelp,\r
- L"%c%c%c%c%s",\r
- ARROW_UP,\r
- ARROW_DOWN,\r
- ARROW_RIGHT,\r
- ARROW_LEFT,\r
- gMoveHighlight\r
- );\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
- } else {\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
- if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
- } \r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
- }\r
- } else {\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
-\r
- //\r
- // If it is a selected numeric with manual input, display different message\r
- //\r
- if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || \r
- (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- PrintStringAt (\r
- SecCol,\r
- TopRowOfHelp,\r
- HexDisplay ? gHexNumericInput : gDecNumericInput\r
- );\r
- } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) {\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
- }\r
-\r
- if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
- }\r
-\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
- }\r
- break;\r
-\r
- case EFI_IFR_CHECKBOX_OP:\r
- PrintHotKeyHelpString (FormData);\r
-\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
- }\r
-\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
- PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
- break;\r
-\r
- case EFI_IFR_REF_OP:\r
- case EFI_IFR_PASSWORD_OP:\r
- case EFI_IFR_STRING_OP:\r
- case EFI_IFR_TEXT_OP:\r
- case EFI_IFR_ACTION_OP:\r
- case EFI_IFR_RESET_BUTTON_OP:\r
- case EFI_IFR_SUBTITLE_OP:\r
- if (!Selected) {\r
- PrintHotKeyHelpString (FormData);\r
-\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
- }\r
-\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
- if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
- }\r
- } else {\r
- if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
- PrintStringAt (\r
- (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2,\r
- BottomRowOfHelp,\r
- gEnterCommitString\r
- );\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- } \r
-}\r
-\r
-/**\r
- Update status bar.\r
-\r
- This function updates the status bar on the bottom of menu screen. It just shows StatusBar. \r
- Original logic in this function should be splitted out.\r
-\r
- @param[in] MessageType The type of message to be shown. InputError or Configuration Changed. \r
- @param[in] State Show or Clear Message.\r
-**/\r
-VOID\r
-EFIAPI\r
-UpdateStatusBar (\r
- IN UINTN MessageType,\r
- IN BOOLEAN State\r
- )\r
-{\r
- UINTN Index;\r
- CHAR16 OptionWidth;\r
-\r
- OptionWidth = (CHAR16) ((gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3);\r
-\r
- switch (MessageType) {\r
- case INPUT_ERROR:\r
- if (State) {\r
- gST->ConOut->SetAttribute (gST->ConOut, ERROR_TEXT);\r
- PrintStringAt (\r
- gScreenDimensions.LeftColumn + OptionWidth,\r
- gScreenDimensions.BottomRow - 1,\r
- gInputErrorMessage\r
- );\r
- } else {\r
- gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);\r
- for (Index = 0; Index < (LibGetStringWidth (gInputErrorMessage) - 2) / 2; Index++) {\r
- PrintStringAt (gScreenDimensions.LeftColumn + OptionWidth + Index, gScreenDimensions.BottomRow - 1, L" ");\r
- }\r
- }\r
- break;\r
-\r
- case NV_UPDATE_REQUIRED:\r
- //\r
- // Global setting support. Show configuration change on every form.\r
- //\r
- if (State) {\r
- gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);\r
- PrintStringAt (\r
- gScreenDimensions.LeftColumn + OptionWidth * 2,\r
- gScreenDimensions.BottomRow - 1,\r
- gNvUpdateMessage\r
- );\r
- } else {\r
- gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);\r
- for (Index = 0; Index < (LibGetStringWidth (gNvUpdateMessage) - 2) / 2; Index++) {\r
- PrintStringAt (\r
- (gScreenDimensions.LeftColumn + OptionWidth * 2 + Index),\r
- gScreenDimensions.BottomRow - 1,\r
- L" "\r
- );\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- } \r
-}\r
-\r
-/**\r
- Create popup window. It will replace CreateDialog(). \r
-\r
- This function draws OEM/Vendor specific pop up windows.\r
-\r
- @param[out] Key User Input Key\r
- @param ... String to be shown in Popup. The variable argument list is terminated by a NULL.\r
- \r
-**/\r
-VOID\r
-EFIAPI\r
-CreateDialog (\r
- OUT EFI_INPUT_KEY *Key, OPTIONAL\r
- ...\r
- )\r
-{\r
- VA_LIST Marker;\r
- EFI_INPUT_KEY KeyValue;\r
- EFI_STATUS Status;\r
- UINTN LargestString;\r
- UINTN LineNum;\r
- UINTN Index;\r
- UINTN Count;\r
- CHAR16 Character;\r
- UINTN Start;\r
- UINTN End;\r
- UINTN Top;\r
- UINTN Bottom;\r
- CHAR16 *String;\r
- UINTN DimensionsWidth;\r
- UINTN DimensionsHeight;\r
- UINTN CurrentAttribute;\r
-\r
- //\r
- // If screen dimension info is not ready, get it from console.\r
- //\r
- if (gScreenDimensions.RightColumn == 0 || gScreenDimensions.BottomRow == 0) {\r
- ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
- gST->ConOut->QueryMode (\r
- gST->ConOut,\r
- gST->ConOut->Mode->Mode,\r
- &gScreenDimensions.RightColumn,\r
- &gScreenDimensions.BottomRow\r
- );\r
- }\r
-\r
- DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
- DimensionsHeight = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;\r
-\r
- LargestString = 0;\r
- LineNum = 0;\r
- VA_START (Marker, Key);\r
- while ((String = VA_ARG (Marker, CHAR16 *)) != NULL) {\r
- LineNum ++;\r
- \r
- if ((LibGetStringWidth (String) / 2) > LargestString) {\r
- LargestString = (LibGetStringWidth (String) / 2);\r
- }\r
- } \r
- VA_END (Marker);\r
-\r
- if ((LargestString + 2) > DimensionsWidth) {\r
- LargestString = DimensionsWidth - 2;\r
- }\r
- \r
- CurrentAttribute = gST->ConOut->Mode->Attribute; \r
- gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
- gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
-\r
- //\r
- // Subtract the PopUp width from total Columns, allow for one space extra on\r
- // each end plus a border.\r
- //\r
- Start = (DimensionsWidth - LargestString - 2) / 2 + gScreenDimensions.LeftColumn + 1;\r
- End = Start + LargestString + 1;\r
-\r
- Top = ((DimensionsHeight - LineNum - 2) / 2) + gScreenDimensions.TopRow - 1;\r
- Bottom = Top + LineNum + 2;\r
-\r
- Character = BOXDRAW_DOWN_RIGHT;\r
- PrintCharAt (Start, Top, Character);\r
- Character = BOXDRAW_HORIZONTAL;\r
- for (Index = Start; Index + 2 < End; Index++) {\r
- PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
- }\r
-\r
- Character = BOXDRAW_DOWN_LEFT;\r
- PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
- Character = BOXDRAW_VERTICAL;\r
-\r
- Count = 0;\r
- VA_START (Marker, Key);\r
- for (Index = Top; Index + 2 < Bottom; Index++, Count++) {\r
- String = VA_ARG (Marker, CHAR16*);\r
-\r
- if (String[0] == CHAR_NULL) {\r
- //\r
- // Passing in a NULL results in a blank space\r
- //\r
- ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());\r
- } else if (String[0] == L' ') {\r
- //\r
- // Passing in a space results in the assumption that this is where typing will occur\r
- //\r
- ClearLines (Start + 1, End - 1, Index + 1, Index + 1, POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND);\r
- PrintStringAt (\r
- ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,\r
- Index + 1,\r
- String + 1\r
- );\r
- } else {\r
- //\r
- // This will clear the background of the line - we never know who might have been\r
- // here before us. This differs from the next clear in that it used the non-reverse\r
- // video for normal printing.\r
- //\r
- ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());\r
- PrintStringAt (\r
- ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,\r
- Index + 1,\r
- String\r
- );\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
- PrintCharAt (Start, Index + 1, Character);\r
- PrintCharAt (End - 1, Index + 1, Character);\r
- }\r
- VA_END (Marker);\r
-\r
- Character = BOXDRAW_UP_RIGHT;\r
- PrintCharAt (Start, Bottom - 1, Character);\r
- Character = BOXDRAW_HORIZONTAL;\r
- for (Index = Start; Index + 2 < End; Index++) {\r
- PrintCharAt ((UINTN)-1, (UINTN) -1, Character);\r
- }\r
-\r
- Character = BOXDRAW_UP_LEFT;\r
- PrintCharAt ((UINTN)-1, (UINTN) -1, Character);\r
-\r
- if (Key != NULL) {\r
- Status = WaitForKeyStroke (&KeyValue);\r
- ASSERT_EFI_ERROR (Status);\r
- CopyMem (Key, &KeyValue, sizeof (EFI_INPUT_KEY));\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
- gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-}\r
-\r
-/**\r
- Confirm how to handle the changed data. \r
- \r
- @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.\r
-**/\r
-UINTN\r
-EFIAPI\r
-ConfirmDataChange (\r
- VOID\r
- )\r
-{\r
- CHAR16 YesResponse;\r
- CHAR16 NoResponse;\r
- EFI_INPUT_KEY Key;\r
-\r
- gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- \r
- YesResponse = gYesResponse[0];\r
- NoResponse = gNoResponse[0];\r
- \r
- //\r
- // If NV flag is up, prompt user\r
- //\r
- do {\r
- CreateDialog (&Key, gLibEmptyString, gSaveChanges, gAreYouSure, gLibEmptyString, NULL);\r
- } while\r
- (\r
- (Key.ScanCode != SCAN_ESC) &&\r
- ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
- ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
- );\r
- \r
- if (Key.ScanCode == SCAN_ESC) {\r
- return BROWSER_ACTION_NONE;\r
- } else if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
- return BROWSER_ACTION_SUBMIT;\r
- } else {\r
- return BROWSER_ACTION_DISCARD;\r
- }\r
-}\r
-\r
-/**\r
- OEM specifies whether Setup exits Page by ESC key.\r
-\r
- This function customized the behavior that whether Setup exits Page so that \r
- system able to boot when configuration is not changed.\r
-\r
- @retval TRUE Exits FrontPage\r
- @retval FALSE Don't exit FrontPage.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FormExitPolicy (\r
- VOID\r
- )\r
-{\r
- return gClassOfVfr == FORMSET_CLASS_FRONT_PAGE ? FALSE : TRUE;\r
-}\r
-\r
-/**\r
- Set Timeout value for a ceratain Form to get user response. \r
- \r
- This function allows to set timeout value on a ceratain form if necessary.\r
- If timeout is not zero, the form will exit if user has no response in timeout. \r
- \r
- @param[in] FormData Form Data to be shown in Page\r
-\r
- @return 0 No timeout for this form. \r
- @return > 0 Timeout value in 100 ns units.\r
-**/\r
-UINT64\r
-EFIAPI\r
-FormExitTimeout (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- return 0;\r
-}\r
-//\r
-// Print Functions\r
-//\r
-/**\r
- Prints a unicode string to the default console, at\r
- the supplied cursor position, using L"%s" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param String String pointer.\r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAt (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *String\r
- )\r
-{\r
- return PrintAt (0, Column, Row, L"%s", String);\r
-}\r
-\r
-/**\r
- Prints a unicode string to the default console, at\r
- the supplied cursor position, using L"%s" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param String String pointer.\r
- @param Width Width for String.\r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAtWithWidth (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *String,\r
- IN UINTN Width\r
- )\r
-{\r
- return PrintAt (Width, Column, Row, L"%s", String);\r
-}\r
-\r
-/**\r
- Prints a chracter to the default console, at\r
- the supplied cursor position, using L"%c" format.\r
-\r
- @param Column The cursor position to print the string at. When it is -1, use current Position.\r
- @param Row The cursor position to print the string at. When it is -1, use current Position.\r
- @param Character Character to print.\r
-\r
- @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintCharAt (\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- CHAR16 Character\r
- )\r
-{\r
- return PrintAt (0, Column, Row, L"%c", Character);\r
-}\r
-\r
-/**\r
- Clear retangle with specified text attribute.\r
-\r
- @param LeftColumn Left column of retangle.\r
- @param RightColumn Right column of retangle.\r
- @param TopRow Start row of retangle.\r
- @param BottomRow End row of retangle.\r
- @param TextAttribute The character foreground and background.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-ClearLines (\r
- IN UINTN LeftColumn,\r
- IN UINTN RightColumn,\r
- IN UINTN TopRow,\r
- IN UINTN BottomRow,\r
- IN UINTN TextAttribute\r
- )\r
-{\r
- CHAR16 *Buffer;\r
- UINTN Row;\r
-\r
- //\r
- // For now, allocate an arbitrarily long buffer\r
- //\r
- Buffer = AllocateZeroPool (0x10000);\r
- ASSERT (Buffer != NULL);\r
-\r
- //\r
- // Set foreground and background as defined\r
- //\r
- gST->ConOut->SetAttribute (gST->ConOut, TextAttribute);\r
-\r
- //\r
- // Much faster to buffer the long string instead of print it a character at a time\r
- //\r
- LibSetUnicodeMem (Buffer, RightColumn - LeftColumn, L' ');\r
-\r
- //\r
- // Clear the desired area with the appropriate foreground/background\r
- //\r
- for (Row = TopRow; Row <= BottomRow; Row++) {\r
- PrintStringAt (LeftColumn, Row, Buffer);\r
- }\r
-\r
- gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);\r
-\r
- FreePool (Buffer);\r
-}\r
-\r
-//\r
-// Color Setting Functions\r
-//\r
-\r
-/**\r
- Get OEM/Vendor specific popup attribute colors.\r
-\r
- @retval Byte code color setting for popup color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupColor (\r
- VOID\r
- )\r
-{\r
- return POPUP_TEXT | POPUP_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific popup attribute colors.\r
-\r
- @retval Byte code color setting for popup inverse color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupInverseColor (\r
- VOID\r
- )\r
-{\r
- return POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific PickList color attribute.\r
-\r
- @retval Byte code color setting for pick list color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPickListColor (\r
- VOID\r
- )\r
-{\r
- return PICKLIST_HIGHLIGHT_TEXT | PICKLIST_HIGHLIGHT_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific arrow color attribute.\r
-\r
- @retval Byte code color setting for arrow color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetArrowColor (\r
- VOID\r
- )\r
-{\r
- return ARROW_TEXT | ARROW_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific info text color attribute.\r
-\r
- @retval Byte code color setting for info text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetInfoTextColor (\r
- VOID\r
- )\r
-{\r
- return INFO_TEXT | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific help text color attribute.\r
-\r
- @retval Byte code color setting for help text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHelpTextColor (\r
- VOID\r
- )\r
-{\r
- return HELP_TEXT | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific grayed out text color attribute.\r
-\r
- @retval Byte code color setting for grayed out text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetGrayedTextColor (\r
- VOID\r
- )\r
-{\r
- return FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific highlighted text color attribute.\r
-\r
- @retval Byte code color setting for highlight text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHighlightTextColor (\r
- VOID\r
- )\r
-{\r
- return PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific field text color attribute.\r
-\r
- @retval Byte code color setting for field text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetFieldTextColor (\r
- VOID\r
- )\r
-{\r
- return PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
- Get OEM/Vendor specific subtitle text color attribute.\r
-\r
- @retval Byte code color setting for subtitle text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetSubTitleTextColor (\r
- VOID\r
- )\r
-{\r
- return PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
- Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-ClearDisplayPage (\r
- VOID\r
- )\r
-{\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
- gLibIsFirstForm = TRUE;\r
-}\r
-\r
-/**\r
- Constructor of Customized Display Library Instance.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CustomizedDisplayLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- mCDLStringPackHandle = HiiAddPackages (&gCustomizedDisplayLibGuid, ImageHandle, CustomizedDisplayLibStrings, NULL);\r
- ASSERT (mCDLStringPackHandle != NULL);\r
-\r
- InitializeLibStrings();\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Destructor of Customized Display Library Instance.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The destructor completed successfully.\r
- @retval Other value The destructor did not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CustomizedDisplayLibDestructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- HiiRemovePackages(mCDLStringPackHandle);\r
- \r
- FreeLibStrings ();\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
+++ /dev/null
-##\r
-# This file contains an 'Intel Peripheral Driver' and is \r
-# licensed for Intel CPUs and chipsets under the terms of your \r
-# license agreement with Intel or your vendor. This file may \r
-# be modified by the user, subject to additional terms of the \r
-# license agreement \r
-##\r
-## @file\r
-# \r
-# General BDS defines and produce general interfaces for platform BDS driver including:\r
-# 1) BDS boot policy interface;\r
-# 2) BDS boot device connect interface;\r
-# 3) BDS Misc interfaces for mainting boot variable, ouput string, etc.\r
-# \r
-# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-# This software and associated documentation (if any) is furnished\r
-# under a license and may only be used or copied in accordance\r
-# with the terms of the license. Except as permitted by such\r
-# license, no part of this software or documentation may be\r
-# reproduced, stored in a retrieval system, or transmitted in any\r
-# form or by any means without the express written consent of\r
-# Intel Corporation.\r
-# \r
-##\r
-\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = CustomizedDisplayLib\r
- FILE_GUID = 80B92017-EC64-4923-938D-94FAEE85832E\r
- MODULE_TYPE = DXE_DRIVER\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = CustomizedDisplayLib|DXE_DRIVER UEFI_APPLICATION\r
- CONSTRUCTOR = CustomizedDisplayLibConstructor\r
- DESTRUCTOR = CustomizedDisplayLibDestructor\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
- CustomizedDisplayLib.c\r
- Colors.h\r
- CustomizedDisplayLibInternal.h\r
- CustomizedDisplayLibInternal.c\r
- CustomizedDisplayLib.uni\r
- \r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
-\r
-[LibraryClasses]\r
- MemoryAllocationLib\r
- BaseLib\r
- UefiBootServicesTableLib\r
- UefiDriverEntryPoint\r
- UefiRuntimeServicesTableLib\r
- BaseMemoryLib\r
- DebugLib\r
- PrintLib\r
- HiiLib\r
- DevicePathLib\r
- PcdLib\r
-\r
-[Guids]\r
- gEfiIfrTianoGuid\r
- \r
-[Protocols]\r
-\r
-[Pcd]\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextHighlightColor ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldBackgroundHighlightColor ## CONSUMES
\ No newline at end of file
+++ /dev/null
-/** @file\r
-\r
- This library class defines a set of interfaces to customize Display module\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-#include "CustomizedDisplayLibInternal.h"\r
-\r
-EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-CHAR16 *mLibUnknownString;\r
-extern EFI_HII_HANDLE mCDLStringPackHandle;\r
-CHAR16 *mSpaceBuffer;\r
-#define SPACE_BUFFER_SIZE 1000\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-CHAR16 *gEnterString;\r
-CHAR16 *gEnterCommitString;\r
-CHAR16 *gEnterEscapeString;\r
-CHAR16 *gEscapeString;\r
-CHAR16 *gMoveHighlight;\r
-CHAR16 *gDecNumericInput;\r
-CHAR16 *gHexNumericInput;\r
-CHAR16 *gToggleCheckBox;\r
-CHAR16 *gLibEmptyString;\r
-CHAR16 *gAreYouSure;\r
-CHAR16 *gYesResponse;\r
-CHAR16 *gNoResponse;\r
-CHAR16 *gPlusString;\r
-CHAR16 *gMinusString;\r
-CHAR16 *gAdjustNumber;\r
-CHAR16 *gSaveChanges;\r
-CHAR16 *gNvUpdateMessage;\r
-CHAR16 *gInputErrorMessage;\r
-\r
-/**\r
-\r
- Print banner info for front page.\r
-\r
- @param[in] FormData Form Data to be shown in Page\r
- \r
-**/\r
-VOID\r
-PrintBannerInfo ( \r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- UINT8 Line;\r
- UINT8 Alignment;\r
- CHAR16 *StrFrontPageBanner;\r
- UINT8 RowIdx;\r
- UINT8 ColumnIdx;\r
-\r
- //\r
- // ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
- //\r
- ClearLines (\r
- gScreenDimensions.LeftColumn,\r
- gScreenDimensions.RightColumn,\r
- gScreenDimensions.TopRow,\r
- FRONT_PAGE_HEADER_HEIGHT - 1 + gScreenDimensions.TopRow,\r
- BANNER_TEXT | BANNER_BACKGROUND\r
- );\r
-\r
- //\r
- // for (Line = 0; Line < BANNER_HEIGHT; Line++) {\r
- //\r
- for (Line = (UINT8) gScreenDimensions.TopRow; Line < BANNER_HEIGHT + (UINT8) gScreenDimensions.TopRow; Line++) {\r
- //\r
- // for (Alignment = 0; Alignment < BANNER_COLUMNS; Alignment++) {\r
- //\r
- for (Alignment = (UINT8) gScreenDimensions.LeftColumn;\r
- Alignment < BANNER_COLUMNS + (UINT8) gScreenDimensions.LeftColumn;\r
- Alignment++\r
- ) {\r
- RowIdx = (UINT8) (Line - (UINT8) gScreenDimensions.TopRow);\r
- ColumnIdx = (UINT8) (Alignment - (UINT8) gScreenDimensions.LeftColumn);\r
- \r
- ASSERT (RowIdx < BANNER_HEIGHT && ColumnIdx < BANNER_COLUMNS);\r
- \r
- if (gBannerData!= NULL && gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
- StrFrontPageBanner = LibGetToken (gBannerData->Banner[RowIdx][ColumnIdx], FormData->HiiHandle);\r
- } else {\r
- continue;\r
- }\r
- \r
- switch (Alignment - gScreenDimensions.LeftColumn) {\r
- case 0:\r
- //\r
- // Handle left column\r
- //\r
- PrintStringAt (gScreenDimensions.LeftColumn + BANNER_LEFT_COLUMN_INDENT, Line, StrFrontPageBanner);\r
- break;\r
- \r
- case 1:\r
- //\r
- // Handle center column\r
- //\r
- PrintStringAt (\r
- gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3,\r
- Line,\r
- StrFrontPageBanner\r
- );\r
- break;\r
- \r
- case 2:\r
- //\r
- // Handle right column\r
- //\r
- PrintStringAt (\r
- gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) * 2 / 3,\r
- Line,\r
- StrFrontPageBanner\r
- );\r
- break;\r
- }\r
- \r
- FreePool (StrFrontPageBanner);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Print framework and form title for a page.\r
-\r
- @param[in] FormData Form Data to be shown in Page\r
-**/\r
-VOID\r
-PrintFramework (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- UINTN Index;\r
- CHAR16 Character;\r
- CHAR16 *Buffer;\r
- UINTN Row;\r
- CHAR16 *TitleStr;\r
-\r
- if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
- //\r
- // Only Setup page needs Framework\r
- //\r
- ClearLines (\r
- gScreenDimensions.LeftColumn,\r
- gScreenDimensions.RightColumn,\r
- gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight,\r
- gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1,\r
- KEYHELP_TEXT | KEYHELP_BACKGROUND\r
- );\r
- return;\r
- }\r
- \r
- Buffer = AllocateZeroPool (0x10000);\r
- ASSERT (Buffer != NULL);\r
- Character = BOXDRAW_HORIZONTAL;\r
- for (Index = 0; Index + 2 < (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn); Index++) {\r
- Buffer[Index] = Character;\r
- }\r
-\r
- //\r
- // Print Top border line\r
- // +------------------------------------------------------------------------------+\r
- // ? ?\r
- // +------------------------------------------------------------------------------+\r
- //\r
- gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
- Character = BOXDRAW_DOWN_RIGHT;\r
-\r
- PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow, Character);\r
- PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
- Character = BOXDRAW_DOWN_LEFT;\r
- PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
- Character = BOXDRAW_VERTICAL;\r
- for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
- PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
- PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
- }\r
- \r
- //\r
- // Print Form Title\r
- //\r
- ClearLines (\r
- gScreenDimensions.LeftColumn + 1,\r
- gScreenDimensions.RightColumn - 1,\r
- gScreenDimensions.TopRow + 1,\r
- gScreenDimensions.TopRow + 1,\r
- TITLE_TEXT | TITLE_BACKGROUND\r
- );\r
-\r
- TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
- ASSERT (TitleStr != NULL);\r
- PrintStringAt (\r
- (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
- gScreenDimensions.TopRow + 1,\r
- TitleStr\r
- );\r
- FreePool (TitleStr);\r
-\r
- Character = BOXDRAW_UP_RIGHT;\r
- PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
- PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
- Character = BOXDRAW_UP_LEFT;\r
- PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
- //\r
- // Print Bottom border line\r
- // +------------------------------------------------------------------------------+\r
- // ? ?\r
- // +------------------------------------------------------------------------------+\r
- //\r
- Character = BOXDRAW_DOWN_RIGHT;\r
- PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
-\r
- PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
- Character = BOXDRAW_DOWN_LEFT;\r
- PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
- Character = BOXDRAW_VERTICAL;\r
- for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
- Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
- Row++\r
- ) {\r
- PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
- PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
- }\r
-\r
- Character = BOXDRAW_UP_RIGHT;\r
- PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
-\r
- PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
- Character = BOXDRAW_UP_LEFT;\r
- PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
- \r
- FreePool (Buffer);\r
-}\r
-\r
-/**\r
- Process some op code which is not recognized by browser core.\r
-\r
- @param OpCodeData The pointer to the op code buffer.\r
-\r
- @return EFI_SUCCESS Pass the statement success.\r
-\r
-**/\r
-VOID\r
-ProcessUserOpcode(\r
- IN EFI_IFR_OP_HEADER *OpCodeData\r
- )\r
-{\r
- switch (OpCodeData->OpCode) {\r
- case EFI_IFR_GUID_OP: \r
- if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8*) OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
- //\r
- // Tiano specific GUIDed opcodes\r
- //\r
- switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
- case EFI_IFR_EXTEND_OP_LABEL:\r
- //\r
- // just ignore label\r
- //\r
- break;\r
-\r
- case EFI_IFR_EXTEND_OP_BANNER:\r
- //\r
- // Only in front page form set, we care about the banner data.\r
- //\r
- if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
- //\r
- // Initialize Driver private data\r
- //\r
- if (gBannerData == NULL) {\r
- gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
- ASSERT (gBannerData != NULL);\r
- }\r
- \r
- CopyMem (\r
- &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
- ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
- &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
- sizeof (EFI_STRING_ID)\r
- );\r
- }\r
- break;\r
-\r
- case EFI_IFR_EXTEND_OP_SUBCLASS:\r
- if (((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
- gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-/**\r
- Process some op codes which is out side of current form.\r
- \r
- @param FormData Pointer to the form data.\r
-\r
- @return EFI_SUCCESS Pass the statement success.\r
-\r
-**/\r
-VOID\r
-ProcessExternedOpcode (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
-\r
- Link = GetFirstNode (&FormData->StatementListOSF);\r
- while (!IsNull (&FormData->StatementListOSF, Link)) {\r
- Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&FormData->StatementListOSF, Link);\r
-\r
- ProcessUserOpcode(Statement->OpCode);\r
- }\r
-\r
- Link = GetFirstNode (&FormData->StatementListHead);\r
- while (!IsNull (&FormData->StatementListHead, Link)) {\r
- Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&FormData->StatementListHead, Link);\r
-\r
- ProcessUserOpcode(Statement->OpCode);\r
- }\r
-}\r
-\r
-/**\r
- Validate the input screen diemenstion info.\r
-\r
- @param FormData The input form data info.\r
-\r
- @return EFI_SUCCESS The input screen info is acceptable.\r
- @return EFI_INVALID_PARAMETER The input screen info is not acceptable.\r
-\r
-**/\r
-EFI_STATUS \r
-ScreenDiemensionInfoValidate (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- UINTN Index;\r
-\r
- //\r
- // Calculate total number of Register HotKeys. \r
- //\r
- Index = 0;\r
- if (!IsListEmpty (&FormData->HotKeyListHead)){\r
- Link = GetFirstNode (&FormData->HotKeyListHead);\r
- while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
- Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
- Index ++;\r
- }\r
- }\r
-\r
- //\r
- // Show three HotKeys help information on one row.\r
- //\r
- gFooterHeight = FOOTER_HEIGHT + (Index / 3);\r
-\r
-\r
- ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
- gST->ConOut->QueryMode (\r
- gST->ConOut,\r
- gST->ConOut->Mode->Mode,\r
- &gScreenDimensions.RightColumn,\r
- &gScreenDimensions.BottomRow\r
- );\r
-\r
- //\r
- // Check local dimension vs. global dimension.\r
- //\r
- if (FormData->ScreenDimensions != NULL) {\r
- if ((gScreenDimensions.RightColumn < FormData->ScreenDimensions->RightColumn) ||\r
- (gScreenDimensions.BottomRow < FormData->ScreenDimensions->BottomRow)\r
- ) {\r
- return EFI_INVALID_PARAMETER;\r
- } else {\r
- //\r
- // Local dimension validation.\r
- //\r
- if ((FormData->ScreenDimensions->RightColumn > FormData->ScreenDimensions->LeftColumn) &&\r
- (FormData->ScreenDimensions->BottomRow > FormData->ScreenDimensions->TopRow) &&\r
- ((FormData->ScreenDimensions->RightColumn - FormData->ScreenDimensions->LeftColumn) > 2) &&\r
- ((FormData->ScreenDimensions->BottomRow - FormData->ScreenDimensions->TopRow) > STATUS_BAR_HEIGHT +\r
- FRONT_PAGE_HEADER_HEIGHT + gFooterHeight + 3)) {\r
- CopyMem (&gScreenDimensions, (VOID *) FormData->ScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
- } else {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Get the string based on the StringId and HII Package List Handle.\r
-\r
- @param Token The String's ID.\r
- @param HiiHandle The package list in the HII database to search for\r
- the specified string.\r
-\r
- @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-LibGetToken (\r
- IN EFI_STRING_ID Token,\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STRING String;\r
-\r
- String = HiiGetString (HiiHandle, Token, NULL);\r
- if (String == NULL) {\r
- String = AllocateCopyPool (StrSize (mLibUnknownString), mLibUnknownString);\r
- ASSERT (String != NULL);\r
- }\r
-\r
- return (CHAR16 *) String;\r
-}\r
-\r
-\r
-/**\r
- Count the storage space of a Unicode string.\r
-\r
- This function handles the Unicode string with NARROW_CHAR\r
- and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
- does not count in the resultant output. If a WIDE_CHAR is\r
- hit, then 2 Unicode character will consume an output storage\r
- space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
- If String is NULL, then ASSERT ().\r
-\r
- @param String The input string to be counted.\r
-\r
- @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-LibGetStringWidth (\r
- IN CHAR16 *String\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Count;\r
- UINTN IncrementValue;\r
-\r
- ASSERT (String != NULL);\r
- if (String == NULL) {\r
- return 0;\r
- }\r
-\r
- Index = 0;\r
- Count = 0;\r
- IncrementValue = 1;\r
-\r
- do {\r
- //\r
- // Advance to the null-terminator or to the first width directive\r
- //\r
- for (;\r
- (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
- Index++, Count = Count + IncrementValue\r
- )\r
- ;\r
-\r
- //\r
- // We hit the null-terminator, we now have a count\r
- //\r
- if (String[Index] == 0) {\r
- break;\r
- }\r
- //\r
- // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
- // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
- //\r
- if (String[Index] == NARROW_CHAR) {\r
- //\r
- // Skip to the next character\r
- //\r
- Index++;\r
- IncrementValue = 1;\r
- } else {\r
- //\r
- // Skip to the next character\r
- //\r
- Index++;\r
- IncrementValue = 2;\r
- }\r
- } while (String[Index] != 0);\r
-\r
- //\r
- // Increment by one to include the null-terminator in the size\r
- //\r
- Count++;\r
-\r
- return Count * sizeof (CHAR16);\r
-}\r
-\r
-/**\r
- Show all registered HotKey help strings on bottom Rows.\r
-\r
- @param FormData The curent input form data info.\r
-\r
-**/\r
-VOID\r
-PrintHotKeyHelpString (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- UINTN CurrentCol;\r
- UINTN CurrentRow;\r
- UINTN BottomRowOfHotKeyHelp;\r
- UINTN ColumnWidth;\r
- UINTN Index;\r
- EFI_SCREEN_DESCRIPTOR LocalScreen;\r
- LIST_ENTRY *Link;\r
- BROWSER_HOT_KEY *HotKey;\r
-\r
- if (IsListEmpty (&FormData->HotKeyListHead)) {\r
- return;\r
- }\r
-\r
- CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
- ColumnWidth = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
- BottomRowOfHotKeyHelp = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
-\r
- //\r
- // Calculate total number of Register HotKeys. \r
- //\r
- Index = 0;\r
- Link = GetFirstNode (&FormData->HotKeyListHead);\r
- while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
- HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
- //\r
- // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
- //\r
- if (StrLen (HotKey->HelpString) > ColumnWidth) {\r
- HotKey->HelpString[ColumnWidth] = L'\0';\r
- }\r
- //\r
- // Calculate help information Column and Row.\r
- //\r
- if ((Index % 3) != 2) {\r
- CurrentCol = LocalScreen.LeftColumn + (2 - Index % 3) * ColumnWidth;\r
- } else {\r
- CurrentCol = LocalScreen.LeftColumn + 2;\r
- }\r
- CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
- //\r
- // Print HotKey help string on bottom Row.\r
- //\r
- PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
-\r
- //\r
- // Get Next Hot Key.\r
- //\r
- Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
- Index ++;\r
- }\r
- \r
- return;\r
-}\r
-\r
-/**\r
- Get step info from numeric opcode.\r
- \r
- @param[in] OpCode The input numeric op code.\r
-\r
- @return step info for this opcode.\r
-**/\r
-UINT64\r
-LibGetFieldFromNum (\r
- IN EFI_IFR_OP_HEADER *OpCode\r
- )\r
-{\r
- EFI_IFR_NUMERIC *NumericOp;\r
- UINT64 Step;\r
-\r
- NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
- \r
- switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
- case EFI_IFR_NUMERIC_SIZE_1:\r
- Step = NumericOp->data.u8.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_2:\r
- Step = NumericOp->data.u16.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_4:\r
- Step = NumericOp->data.u32.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_8:\r
- Step = NumericOp->data.u64.Step;\r
- break;\r
- \r
- default:\r
- Step = 0;\r
- break;\r
- }\r
-\r
- return Step;\r
-}\r
-\r
-/**\r
- Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeLibStrings (\r
- VOID\r
- )\r
-{\r
- mLibUnknownString = L"!";\r
-\r
- gEnterString = LibGetToken (STRING_TOKEN (ENTER_STRING), mCDLStringPackHandle);\r
- gEnterCommitString = LibGetToken (STRING_TOKEN (ENTER_COMMIT_STRING), mCDLStringPackHandle);\r
- gEnterEscapeString = LibGetToken (STRING_TOKEN (ENTER_ESCAPE_STRING), mCDLStringPackHandle);\r
- gEscapeString = LibGetToken (STRING_TOKEN (ESCAPE_STRING), mCDLStringPackHandle);\r
- gMoveHighlight = LibGetToken (STRING_TOKEN (MOVE_HIGHLIGHT), mCDLStringPackHandle);\r
- gDecNumericInput = LibGetToken (STRING_TOKEN (DEC_NUMERIC_INPUT), mCDLStringPackHandle);\r
- gHexNumericInput = LibGetToken (STRING_TOKEN (HEX_NUMERIC_INPUT), mCDLStringPackHandle);\r
- gToggleCheckBox = LibGetToken (STRING_TOKEN (TOGGLE_CHECK_BOX), mCDLStringPackHandle);\r
-\r
- gAreYouSure = LibGetToken (STRING_TOKEN (ARE_YOU_SURE), mCDLStringPackHandle);\r
- gYesResponse = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_YES), mCDLStringPackHandle);\r
- gNoResponse = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_NO), mCDLStringPackHandle);\r
- gPlusString = LibGetToken (STRING_TOKEN (PLUS_STRING), mCDLStringPackHandle);\r
- gMinusString = LibGetToken (STRING_TOKEN (MINUS_STRING), mCDLStringPackHandle);\r
- gAdjustNumber = LibGetToken (STRING_TOKEN (ADJUST_NUMBER), mCDLStringPackHandle);\r
- gSaveChanges = LibGetToken (STRING_TOKEN (SAVE_CHANGES), mCDLStringPackHandle);\r
-\r
- gLibEmptyString = LibGetToken (STRING_TOKEN (EMPTY_STRING), mCDLStringPackHandle);\r
-\r
- gNvUpdateMessage = LibGetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), mCDLStringPackHandle);\r
- gInputErrorMessage = LibGetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), mCDLStringPackHandle);\r
- \r
- //\r
- // SpaceBuffer;\r
- //\r
- mSpaceBuffer = AllocatePool ((SPACE_BUFFER_SIZE + 1) * sizeof (CHAR16));\r
- ASSERT (mSpaceBuffer != NULL);\r
- LibSetUnicodeMem (mSpaceBuffer, SPACE_BUFFER_SIZE, L' ');\r
- mSpaceBuffer[SPACE_BUFFER_SIZE] = L'\0';\r
-}\r
-\r
-\r
-/**\r
- Free the HII String.\r
-\r
-**/\r
-VOID\r
-FreeLibStrings (\r
- VOID\r
- )\r
-{\r
- FreePool (gEnterString);\r
- FreePool (gEnterCommitString);\r
- FreePool (gEnterEscapeString);\r
- FreePool (gEscapeString);\r
- FreePool (gMoveHighlight);\r
- FreePool (gDecNumericInput);\r
- FreePool (gHexNumericInput);\r
- FreePool (gToggleCheckBox);\r
-\r
- FreePool (gAreYouSure);\r
- FreePool (gYesResponse);\r
- FreePool (gNoResponse);\r
- FreePool (gPlusString);\r
- FreePool (gMinusString);\r
- FreePool (gAdjustNumber);\r
- FreePool (gSaveChanges);\r
-\r
- FreePool (gLibEmptyString);\r
-\r
- FreePool (gNvUpdateMessage);\r
- FreePool (gInputErrorMessage);\r
- \r
- FreePool (mSpaceBuffer);\r
-}\r
-\r
-/**\r
- Wait for a key to be pressed by user.\r
-\r
- @param Key The key which is pressed by user.\r
-\r
- @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
- OUT EFI_INPUT_KEY *Key\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
-\r
- while (TRUE) {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
- if (!EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- if (Status != EFI_NOT_READY) {\r
- continue;\r
- }\r
- \r
- gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index);\r
- }\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Set Buffer to Value for Size bytes.\r
-\r
- @param Buffer Memory to set.\r
- @param Size Number of bytes to set\r
- @param Value Value of the set operation.\r
-\r
-**/\r
-VOID\r
-LibSetUnicodeMem (\r
- IN VOID *Buffer,\r
- IN UINTN Size,\r
- IN CHAR16 Value\r
- )\r
-{\r
- CHAR16 *Ptr;\r
-\r
- Ptr = Buffer;\r
- while ((Size--) != 0) {\r
- *(Ptr++) = Value;\r
- }\r
-}\r
-\r
-/**\r
- The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL\r
- protocol instance.\r
-\r
- @param Width Width of string to be print.\r
- @param Column The position of the output string.\r
- @param Row The position of the output string.\r
- @param Out The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.\r
- @param Fmt The format string.\r
- @param Args The additional argument for the variables in the format string.\r
-\r
- @return Number of Unicode character printed.\r
-\r
-**/\r
-UINTN\r
-PrintInternal (\r
- IN UINTN Width, \r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Out,\r
- IN CHAR16 *Fmt,\r
- IN VA_LIST Args\r
- )\r
-{\r
- CHAR16 *Buffer;\r
- CHAR16 *BackupBuffer;\r
- UINTN Index;\r
- UINTN PreviousIndex;\r
- UINTN Count;\r
- UINTN PrintWidth;\r
- UINTN CharWidth;\r
-\r
- //\r
- // For now, allocate an arbitrarily long buffer\r
- //\r
- Buffer = AllocateZeroPool (0x10000);\r
- BackupBuffer = AllocateZeroPool (0x10000);\r
- ASSERT (Buffer);\r
- ASSERT (BackupBuffer);\r
-\r
- if (Column != (UINTN) -1) {\r
- Out->SetCursorPosition (Out, Column, Row);\r
- }\r
-\r
- UnicodeVSPrint (Buffer, 0x10000, Fmt, Args);\r
-\r
- Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-\r
- Out->SetAttribute (Out, Out->Mode->Attribute);\r
-\r
- Index = 0;\r
- PreviousIndex = 0;\r
- Count = 0;\r
- PrintWidth = 0;\r
- CharWidth = 1;\r
-\r
- do {\r
- for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
- BackupBuffer[Index] = Buffer[Index];\r
- }\r
-\r
- if (Buffer[Index] == 0) {\r
- break;\r
- }\r
- //\r
- // Null-terminate the temporary string\r
- //\r
- BackupBuffer[Index] = 0;\r
-\r
- //\r
- // Print this out, we are about to switch widths\r
- //\r
- Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
- Count += StrLen (&BackupBuffer[PreviousIndex]);\r
- PrintWidth += Count * CharWidth;\r
-\r
- //\r
- // Preserve the current index + 1, since this is where we will start printing from next\r
- //\r
- PreviousIndex = Index + 1;\r
-\r
- //\r
- // We are at a narrow or wide character directive. Set attributes and strip it and print it\r
- //\r
- if (Buffer[Index] == NARROW_CHAR) {\r
- //\r
- // Preserve bits 0 - 6 and zero out the rest\r
- //\r
- Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
- Out->SetAttribute (Out, Out->Mode->Attribute);\r
- CharWidth = 1;\r
- } else {\r
- //\r
- // Must be wide, set bit 7 ON\r
- //\r
- Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE;\r
- Out->SetAttribute (Out, Out->Mode->Attribute);\r
- CharWidth = 2;\r
- }\r
-\r
- Index++;\r
-\r
- } while (Buffer[Index] != 0);\r
-\r
- //\r
- // We hit the end of the string - print it\r
- //\r
- Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
- Count += StrLen (&BackupBuffer[PreviousIndex]);\r
- PrintWidth += Count * CharWidth;\r
- if (PrintWidth < Width) {\r
- Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
- Out->SetAttribute (Out, Out->Mode->Attribute);\r
- Out->OutputString (Out, &mSpaceBuffer[SPACE_BUFFER_SIZE - Width + PrintWidth]);\r
- }\r
-\r
- FreePool (Buffer);\r
- FreePool (BackupBuffer);\r
- return Count;\r
-}\r
-\r
-/**\r
- Prints a formatted unicode string to the default console, at\r
- the supplied cursor position.\r
-\r
- @param Width Width of String to be printed.\r
- @param Column The cursor position to print the string at.\r
- @param Row The cursor position to print the string at.\r
- @param Fmt Format string.\r
- @param ... Variable argument list for format string.\r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintAt (\r
- IN UINTN Width,\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *Fmt,\r
- ...\r
- )\r
-{\r
- VA_LIST Args;\r
- UINTN LengthOfPrinted;\r
-\r
- VA_START (Args, Fmt);\r
- LengthOfPrinted = PrintInternal (Width, Column, Row, gST->ConOut, Fmt, Args);\r
- VA_END (Args);\r
- return LengthOfPrinted;\r
-}\r
-\r
+++ /dev/null
-/** @file\r
-\r
- This library class defines a set of interfaces to customize Display module\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef __CUSTOMIZED_DISPLAY_LIB_INTERNAL_H__\r
-#define __CUSTOMIZED_DISPLAY_LIB_INTERNAL_H__\r
-\r
-\r
-\r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/SimpleTextOut.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/FormBrowser2.h>\r
-#include <Protocol/FormBrowserEx2.h>\r
-#include <Protocol/DisplayProtocol.h>\r
-#include <Protocol/DevicePath.h>\r
-#include <Protocol/UnicodeCollation.h>\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/HiiConfigRouting.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/UserManager.h>\r
-#include <Protocol/DevicePathFromText.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-#include <Guid/HiiPlatformSetupFormset.h>\r
-#include <Guid/HiiFormMapMethodGuid.h>\r
-\r
-#include <Library/PrintLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/CustomizedDisplayLib.h>\r
-\r
-#include "Colors.h"\r
-\r
-\r
-\r
-#define FORMSET_CLASS_PLATFORM_SETUP 0x0001\r
-#define FORMSET_CLASS_FRONT_PAGE 0x0002\r
-\r
-\r
-#define FRONT_PAGE_HEADER_HEIGHT 6\r
-#define NONE_FRONT_PAGE_HEADER_HEIGHT 3\r
-#define FOOTER_HEIGHT 4\r
-#define STATUS_BAR_HEIGHT 1\r
-\r
-//\r
-// Screen definitions\r
-//\r
-#define BANNER_HEIGHT 6\r
-#define BANNER_COLUMNS 3\r
-#define BANNER_LEFT_COLUMN_INDENT 1\r
-\r
-//\r
-// Character definitions\r
-//\r
-#define UPPER_LOWER_CASE_OFFSET 0x20\r
-\r
-//\r
-// This is the Input Error Message\r
-//\r
-#define INPUT_ERROR 1\r
-\r
-//\r
-// This is the NV RAM update required Message\r
-//\r
-#define NV_UPDATE_REQUIRED 2\r
-\r
-typedef struct {\r
- EFI_STRING_ID Banner[BANNER_HEIGHT][BANNER_COLUMNS];\r
-} BANNER_DATA;\r
-\r
-extern UINT16 gClassOfVfr; // Formset class information\r
-extern BANNER_DATA *gBannerData;\r
-extern EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-extern UINTN gFooterHeight;\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-extern CHAR16 *gEnterString;\r
-extern CHAR16 *gEnterCommitString;\r
-extern CHAR16 *gEnterEscapeString;\r
-extern CHAR16 *gEscapeString;\r
-extern CHAR16 *gMoveHighlight;\r
-extern CHAR16 *gDecNumericInput;\r
-extern CHAR16 *gHexNumericInput;\r
-extern CHAR16 *gToggleCheckBox;\r
-extern CHAR16 *gLibEmptyString;\r
-extern CHAR16 *gAreYouSure;\r
-extern CHAR16 *gYesResponse;\r
-extern CHAR16 *gNoResponse;\r
-extern CHAR16 *gPlusString;\r
-extern CHAR16 *gMinusString;\r
-extern CHAR16 *gAdjustNumber;\r
-extern CHAR16 *gSaveChanges;\r
-extern CHAR16 *gNvUpdateMessage;\r
-extern CHAR16 *gInputErrorMessage;\r
-/**\r
-\r
- Print banner info for front page.\r
-\r
- @param[in] FormData Form Data to be shown in Page\r
- \r
-**/\r
-VOID\r
-PrintBannerInfo ( \r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
-\r
-/**\r
- Print framework and form title for a page.\r
-\r
- @param[in] FormData Form Data to be shown in Page\r
-**/\r
-VOID\r
-PrintFramework (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
-\r
-/**\r
- Validate the input screen diemenstion info.\r
-\r
- @param FormData The input form data info.\r
-\r
- @return EFI_SUCCESS The input screen info is acceptable.\r
- @return EFI_INVALID_PARAMETER The input screen info is not acceptable.\r
-\r
-**/\r
-EFI_STATUS \r
-ScreenDiemensionInfoValidate (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
-\r
-/**\r
- Get the string based on the StringId and HII Package List Handle.\r
-\r
- @param Token The String's ID.\r
- @param HiiHandle The package list in the HII database to search for\r
- the specified string.\r
-\r
- @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-LibGetToken (\r
- IN EFI_STRING_ID Token,\r
- IN EFI_HII_HANDLE HiiHandle\r
- );\r
-\r
-/**\r
- Count the storage space of a Unicode string.\r
-\r
- This function handles the Unicode string with NARROW_CHAR\r
- and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
- does not count in the resultant output. If a WIDE_CHAR is\r
- hit, then 2 Unicode character will consume an output storage\r
- space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
- If String is NULL, then ASSERT ().\r
-\r
- @param String The input string to be counted.\r
-\r
- @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-LibGetStringWidth (\r
- IN CHAR16 *String\r
- );\r
-\r
-/**\r
- Show all registered HotKey help strings on bottom Rows.\r
-\r
- @param FormData The curent input form data info.\r
-\r
-**/\r
-VOID\r
-PrintHotKeyHelpString (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
- \r
-/**\r
- Get step info from numeric opcode.\r
- \r
- @param[in] OpCode The input numeric op code.\r
-\r
- @return step info for this opcode.\r
-**/\r
-UINT64\r
-LibGetFieldFromNum (\r
- IN EFI_IFR_OP_HEADER *OpCode\r
- );\r
-\r
-/**\r
- Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeLibStrings (\r
- VOID\r
- );\r
-\r
-/**\r
- Free the HII String.\r
-\r
-**/\r
-VOID\r
-FreeLibStrings (\r
- VOID\r
- );\r
-\r
-/**\r
- Wait for a key to be pressed by user.\r
-\r
- @param Key The key which is pressed by user.\r
-\r
- @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
- OUT EFI_INPUT_KEY *Key\r
- );\r
-\r
-/**\r
- Set Buffer to Value for Size bytes.\r
-\r
- @param Buffer Memory to set.\r
- @param Size Number of bytes to set\r
- @param Value Value of the set operation.\r
-\r
-**/\r
-VOID\r
-LibSetUnicodeMem (\r
- IN VOID *Buffer,\r
- IN UINTN Size,\r
- IN CHAR16 Value\r
- );\r
-\r
-/**\r
- Prints a formatted unicode string to the default console, at\r
- the supplied cursor position.\r
-\r
- @param Width Width of String to be printed.\r
- @param Column The cursor position to print the string at.\r
- @param Row The cursor position to print the string at.\r
- @param Fmt Format string.\r
- @param ... Variable argument list for format string.\r
-\r
- @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintAt (\r
- IN UINTN Width,\r
- IN UINTN Column,\r
- IN UINTN Row,\r
- IN CHAR16 *Fmt,\r
- ...\r
- );\r
-\r
-/**\r
- Process some op codes which is out side of current form.\r
- \r
- @param FormData Pointer to the form data.\r
-\r
-**/\r
-VOID\r
-ProcessExternedOpcode (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- );\r
-\r
-#endif\r
#\r
CpuExceptionHandlerLib|Include/Library/CpuExceptionHandlerLib.h\r
\r
- ## @libraryclass Provides platform specific display interface.\r
- #\r
- CustomizedDisplayLib|Include/Library/CustomizedDisplayLib.h\r
-\r
[Guids]\r
## MdeModule package token space guid\r
# Include/Guid/MdeModulePkgTokenSpace.h\r
## Include/Protocol/BootLogo.h\r
gEfiBootLogoProtocolGuid = { 0xcdea2bd3, 0xfc25, 0x4c1c, { 0xb9, 0x7c, 0xb3, 0x11, 0x86, 0x6, 0x49, 0x90 } }\r
\r
- ## Include/Protocol/DisplayProtocol.h\r
- gEdkiiFormDisplayEngineProtocolGuid = { 0x9bbe29e9, 0xfda1, 0x41ec, { 0xad, 0x52, 0x45, 0x22, 0x13, 0x74, 0x2d, 0x2e } }\r
-\r
- ## Include/Protocol/FormBrowserEx2.h\r
- gEdkiiFormBrowserEx2ProtocolGuid = { 0xa770c357, 0xb693, 0x4e6d, { 0xa6, 0xcf, 0xd2, 0x1c, 0x72, 0x8e, 0x55, 0xb } }\r
-\r
[PcdsFeatureFlag]\r
## Indicate whether platform can support update capsule across a system reset\r
gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE|BOOLEAN|0x0001001d\r
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
PalLib|MdePkg/Library/BasePalLibNull/BasePalLibNull.inf\r
- CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
#\r
# Misc\r
#\r
\r
MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
- MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
MdeModulePkg/Application/VariableInfo/VariableInfo.inf\r
MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf\r
MdeModulePkg/Universal/Variable/Pei/VariablePei.inf\r
+++ /dev/null
-## @file\r
-# The DXE driver produces FORM BROWSER protocols defined in UEFI HII 2.1 specificatin.\r
-#\r
-# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
-#\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-#\r
-##\r
-\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = DisplayEngine\r
- FILE_GUID = E660EA85-058E-4b55-A54B-F02F83A24707\r
- MODULE_TYPE = DXE_DRIVER\r
- VERSION_STRING = 1.0\r
- ENTRY_POINT = InitializeDisplayEngine\r
- UNLOAD_IMAGE = UnloadDisplayEngine\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
- FormDisplayStr.uni\r
- FormDisplay.c\r
- FormDisplay.h\r
- ProcessOptions.c\r
- InputHandler.c\r
- \r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
- \r
-[LibraryClasses]\r
- UefiDriverEntryPoint\r
- UefiBootServicesTableLib\r
- DebugLib\r
- BaseMemoryLib\r
- BaseLib\r
- PrintLib\r
- HiiLib\r
- MemoryAllocationLib\r
- CustomizedDisplayLib\r
-\r
-[Protocols]\r
- gEdkiiFormDisplayEngineProtocolGuid\r
- gEdkiiFormBrowserEx2ProtocolGuid\r
-\r
-[Guids]\r
- gEfiIfrTianoGuid ## CONSUMES ## GUID \r
- \r
-[Depex]\r
- gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid AND gEdkiiFormBrowserEx2ProtocolGuid\r
- \r
-[FeaturePcd]\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserGrayOutTextStatement ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdBrowerGrayOutReadOnlyMenu ## CONSUMES\r
-\r
+++ /dev/null
-/** @file\r
-Entry and initialization module for the browser.\r
-\r
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "FormDisplay.h"\r
-\r
-//\r
-// Search table for UiDisplayMenu()\r
-//\r
-SCAN_CODE_TO_SCREEN_OPERATION gScanCodeToOperation[] = {\r
- {\r
- SCAN_UP,\r
- UiUp,\r
- },\r
- {\r
- SCAN_DOWN,\r
- UiDown,\r
- },\r
- {\r
- SCAN_PAGE_UP,\r
- UiPageUp,\r
- },\r
- {\r
- SCAN_PAGE_DOWN,\r
- UiPageDown,\r
- },\r
- {\r
- SCAN_ESC,\r
- UiReset,\r
- },\r
- {\r
- SCAN_LEFT,\r
- UiLeft,\r
- },\r
- {\r
- SCAN_RIGHT,\r
- UiRight,\r
- }\r
-};\r
-\r
-UINTN mScanCodeNumber = sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]);\r
-\r
-SCREEN_OPERATION_T0_CONTROL_FLAG gScreenOperationToControlFlag[] = {\r
- {\r
- UiNoOperation,\r
- CfUiNoOperation,\r
- },\r
- {\r
- UiSelect,\r
- CfUiSelect,\r
- },\r
- {\r
- UiUp,\r
- CfUiUp,\r
- },\r
- {\r
- UiDown,\r
- CfUiDown,\r
- },\r
- {\r
- UiLeft,\r
- CfUiLeft,\r
- },\r
- {\r
- UiRight,\r
- CfUiRight,\r
- },\r
- {\r
- UiReset,\r
- CfUiReset,\r
- },\r
- {\r
- UiPageUp,\r
- CfUiPageUp,\r
- },\r
- {\r
- UiPageDown,\r
- CfUiPageDown\r
- }, \r
- {\r
- UiHotKey,\r
- CfUiHotKey\r
- }\r
-};\r
-\r
-EFI_GUID gDisplayEngineGuid = {\r
- 0xE38C1029, 0xE38F, 0x45b9, {0x8F, 0x0D, 0xE2, 0xE6, 0x0B, 0xC9, 0xB2, 0x62}\r
-};\r
-\r
-FORM_ENTRY_INFO gFormEntryInfo;\r
-UINTN gSequence;\r
-EFI_SCREEN_DESCRIPTOR gStatementDimensions;\r
-BOOLEAN mStatementLayoutIsChanged = TRUE;\r
-USER_INPUT *gUserInput;\r
-FORM_DISPLAY_ENGINE_FORM *gFormData;\r
-EFI_HII_HANDLE gHiiHandle;\r
-UINT16 gDirection;\r
-LIST_ENTRY gMenuOption;\r
-DISPLAY_HIGHLIGHT_MENU_INFO gHighligthMenuInfo = {0};\r
-BOOLEAN mIsFirstForm = TRUE;\r
-FORM_ENTRY_INFO gOldFormEntry = {0};\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-CHAR16 *gFormNotFound;\r
-CHAR16 *gNoSubmitIf;\r
-CHAR16 *gBrwoserError;\r
-CHAR16 *gSaveFailed;\r
-CHAR16 *gPromptForData;\r
-CHAR16 *gPromptForPassword;\r
-CHAR16 *gPromptForNewPassword;\r
-CHAR16 *gConfirmPassword;\r
-CHAR16 *gConfirmError;\r
-CHAR16 *gPassowordInvalid;\r
-CHAR16 *gPressEnter;\r
-CHAR16 *gEmptyString;\r
-CHAR16 *gMiniString;\r
-CHAR16 *gOptionMismatch;\r
-CHAR16 *gFormSuppress;\r
-CHAR16 *gProtocolNotFound;\r
-\r
-CHAR16 gPromptBlockWidth;\r
-CHAR16 gOptionBlockWidth;\r
-CHAR16 gHelpBlockWidth;\r
-CHAR16 *mUnknownString;\r
-\r
-FORM_DISPLAY_DRIVER_PRIVATE_DATA mPrivateData = {\r
- FORM_DISPLAY_DRIVER_SIGNATURE,\r
- NULL,\r
- {\r
- FormDisplay,\r
- DriverClearDisplayPage,\r
- ConfirmDataChange\r
- }\r
-};\r
-\r
-\r
-/**\r
- Get the string based on the StringId and HII Package List Handle.\r
-\r
- @param Token The String's ID.\r
- @param HiiHandle The package list in the HII database to search for\r
- the specified string.\r
-\r
- @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-GetToken (\r
- IN EFI_STRING_ID Token,\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STRING String;\r
-\r
- String = HiiGetString (HiiHandle, Token, NULL);\r
- if (String == NULL) {\r
- String = AllocateCopyPool (StrSize (mUnknownString), mUnknownString);\r
- ASSERT (String != NULL);\r
- }\r
-\r
- return (CHAR16 *) String;\r
-}\r
-\r
-\r
-/**\r
- Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeDisplayStrings (\r
- VOID\r
- )\r
-{\r
- mUnknownString = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);\r
- gSaveFailed = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
- gPromptForData = GetToken (STRING_TOKEN (PROMPT_FOR_DATA), gHiiHandle);\r
- gPromptForPassword = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle);\r
- gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle);\r
- gConfirmPassword = GetToken (STRING_TOKEN (CONFIRM_PASSWORD), gHiiHandle);\r
- gConfirmError = GetToken (STRING_TOKEN (CONFIRM_ERROR), gHiiHandle);\r
- gPassowordInvalid = GetToken (STRING_TOKEN (PASSWORD_INVALID), gHiiHandle);\r
- gPressEnter = GetToken (STRING_TOKEN (PRESS_ENTER), gHiiHandle);\r
- gEmptyString = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
- gMiniString = GetToken (STRING_TOKEN (MINI_STRING), gHiiHandle);\r
- gOptionMismatch = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle);\r
- gFormSuppress = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle);\r
- gProtocolNotFound = GetToken (STRING_TOKEN (PROTOCOL_NOT_FOUND), gHiiHandle);\r
- gFormNotFound = GetToken (STRING_TOKEN (STATUS_BROWSER_FORM_NOT_FOUND), gHiiHandle);\r
- gNoSubmitIf = GetToken (STRING_TOKEN (STATUS_BROWSER_NO_SUBMIT_IF), gHiiHandle);\r
- gBrwoserError = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);\r
-}\r
-\r
-/**\r
- Free up the resource allocated for all strings required\r
- by Setup Browser.\r
-\r
-**/\r
-VOID\r
-FreeDisplayStrings (\r
- VOID\r
- )\r
-{\r
- FreePool (mUnknownString);\r
- FreePool (gEmptyString);\r
- FreePool (gSaveFailed);\r
- FreePool (gPromptForData);\r
- FreePool (gPromptForPassword);\r
- FreePool (gPromptForNewPassword);\r
- FreePool (gConfirmPassword);\r
- FreePool (gConfirmError);\r
- FreePool (gPassowordInvalid);\r
- FreePool (gPressEnter);\r
- FreePool (gMiniString);\r
- FreePool (gOptionMismatch);\r
- FreePool (gFormSuppress);\r
- FreePool (gProtocolNotFound);\r
- FreePool (gBrwoserError);\r
- FreePool (gNoSubmitIf);\r
- FreePool (gFormNotFound);\r
-}\r
-\r
-/**\r
- Get prompt string id from the opcode data buffer.\r
-\r
- @param OpCode The input opcode buffer.\r
-\r
- @return The prompt string id.\r
-\r
-**/\r
-EFI_STRING_ID\r
-GetPrompt (\r
- IN EFI_IFR_OP_HEADER *OpCode\r
- )\r
-{\r
- EFI_IFR_STATEMENT_HEADER *Header;\r
-\r
- if (OpCode->Length <= sizeof (EFI_IFR_OP_HEADER)) {\r
- return 0;\r
- }\r
-\r
- Header = (EFI_IFR_STATEMENT_HEADER *) (OpCode + 1);\r
-\r
- return Header->Prompt;\r
-}\r
-\r
-/**\r
- Get the supported width for a particular op-code\r
-\r
- @param Statement The curent statement.\r
-\r
- @return Returns the number of CHAR16 characters that is support.\r
-\r
-**/\r
-UINT16\r
-GetWidth (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement\r
- )\r
-{\r
- CHAR16 *String;\r
- UINTN Size;\r
- UINT16 Width;\r
- EFI_IFR_TEXT *TestOp;\r
-\r
- Size = 0;\r
-\r
- //\r
- // See if the second text parameter is really NULL\r
- //\r
- if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) {\r
- TestOp = (EFI_IFR_TEXT *) Statement->OpCode;\r
- if (TestOp->TextTwo != 0) {\r
- String = GetToken (TestOp->TextTwo, gFormData->HiiHandle);\r
- Size = StrLen (String);\r
- FreePool (String);\r
- }\r
- }\r
-\r
- if ((Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_REF_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_PASSWORD_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_ACTION_OP) ||\r
- (Statement->OpCode->OpCode == EFI_IFR_RESET_BUTTON_OP) ||\r
- //\r
- // Allow a wide display if text op-code and no secondary text op-code\r
- //\r
- ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0))\r
- ) {\r
- Width = (UINT16) (gPromptBlockWidth + gOptionBlockWidth);\r
- } else {\r
- Width = (UINT16) gPromptBlockWidth;\r
- }\r
-\r
- return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
-}\r
-\r
-/**\r
- Will copy LineWidth amount of a string in the OutputString buffer and return the\r
- number of CHAR16 characters that were copied into the OutputString buffer.\r
- The output string format is:\r
- Glyph Info + String info + '\0'.\r
-\r
- In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
- @param InputString String description for this option.\r
- @param LineWidth Width of the desired string to extract in CHAR16\r
- characters\r
- @param GlyphWidth The glyph width of the begin of the char in the string.\r
- @param Index Where in InputString to start the copy process\r
- @param OutputString Buffer to copy the string into\r
-\r
- @return Returns the number of CHAR16 characters that were copied into the OutputString \r
- buffer, include extra glyph info and '\0' info.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
- IN CHAR16 *InputString,\r
- IN UINT16 LineWidth,\r
- IN OUT UINT16 *GlyphWidth,\r
- IN OUT UINTN *Index,\r
- OUT CHAR16 **OutputString\r
- )\r
-{\r
- UINT16 StrOffset;\r
- UINT16 GlyphOffset;\r
- UINT16 OriginalGlyphWidth;\r
- BOOLEAN ReturnFlag;\r
- UINT16 LastSpaceOffset;\r
- UINT16 LastGlyphWidth;\r
-\r
- if (InputString == NULL || Index == NULL || OutputString == NULL) {\r
- return 0;\r
- }\r
-\r
- if (LineWidth == 0 || *GlyphWidth == 0) {\r
- return 0;\r
- }\r
-\r
- //\r
- // Save original glyph width.\r
- //\r
- OriginalGlyphWidth = *GlyphWidth;\r
- LastGlyphWidth = OriginalGlyphWidth;\r
- ReturnFlag = FALSE;\r
- LastSpaceOffset = 0;\r
-\r
- //\r
- // NARROW_CHAR can not be printed in screen, so if a line only contain the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line in Screen.\r
- // To avoid displaying this empty line in screen, just skip the two CHARs here.\r
- //\r
- if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {\r
- *Index = *Index + 2;\r
- }\r
-\r
- //\r
- // Fast-forward the string and see if there is a carriage-return in the string\r
- //\r
- for (StrOffset = 0, GlyphOffset = 0; GlyphOffset <= LineWidth; StrOffset++) {\r
- switch (InputString[*Index + StrOffset]) {\r
- case NARROW_CHAR:\r
- *GlyphWidth = 1;\r
- break;\r
-\r
- case WIDE_CHAR:\r
- *GlyphWidth = 2;\r
- break;\r
-\r
- case CHAR_CARRIAGE_RETURN:\r
- case CHAR_LINEFEED:\r
- case CHAR_NULL:\r
- ReturnFlag = TRUE;\r
- break;\r
-\r
- default:\r
- GlyphOffset = GlyphOffset + *GlyphWidth;\r
-\r
- //\r
- // Record the last space info in this line. Will be used in rewind.\r
- //\r
- if ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) {\r
- LastSpaceOffset = StrOffset;\r
- LastGlyphWidth = *GlyphWidth;\r
- }\r
- break;\r
- }\r
-\r
- if (ReturnFlag) {\r
- break;\r
- }\r
- } \r
-\r
- //\r
- // Rewind the string from the maximum size until we see a space to break the line\r
- //\r
- if (GlyphOffset > LineWidth) {\r
- //\r
- // Rewind the string to last space char in this line.\r
- //\r
- if (LastSpaceOffset != 0) {\r
- StrOffset = LastSpaceOffset;\r
- *GlyphWidth = LastGlyphWidth;\r
- } else {\r
- //\r
- // Roll back to last char in the line width.\r
- //\r
- StrOffset--;\r
- }\r
- }\r
-\r
- //\r
- // The CHAR_NULL has process last time, this time just return 0 to stand for the end.\r
- //\r
- if (StrOffset == 0 && (InputString[*Index + StrOffset] == CHAR_NULL)) {\r
- return 0;\r
- }\r
-\r
- //\r
- // Need extra glyph info and '\0' info, so +2.\r
- //\r
- *OutputString = AllocateZeroPool (((UINTN) (StrOffset + 2) * sizeof(CHAR16)));\r
- if (*OutputString == NULL) {\r
- return 0;\r
- }\r
-\r
- //\r
- // Save the glyph info at the begin of the string, will used by Print function.\r
- //\r
- if (OriginalGlyphWidth == 1) {\r
- *(*OutputString) = NARROW_CHAR;\r
- } else {\r
- *(*OutputString) = WIDE_CHAR;\r
- }\r
-\r
- CopyMem ((*OutputString) + 1, &InputString[*Index], StrOffset * sizeof(CHAR16));\r
-\r
- if (InputString[*Index + StrOffset] == CHAR_SPACE) {\r
- //\r
- // Skip the space info at the begin of next line.\r
- // \r
- *Index = (UINT16) (*Index + StrOffset + 1);\r
- } else if (InputString[*Index + StrOffset] == CHAR_LINEFEED) {\r
- //\r
- // Skip the /n or /n/r info.\r
- //\r
- if (InputString[*Index + StrOffset + 1] == CHAR_CARRIAGE_RETURN) {\r
- *Index = (UINT16) (*Index + StrOffset + 2);\r
- } else {\r
- *Index = (UINT16) (*Index + StrOffset + 1);\r
- }\r
- } else if (InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN) {\r
- //\r
- // Skip the /r or /r/n info.\r
- // \r
- if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) {\r
- *Index = (UINT16) (*Index + StrOffset + 2);\r
- } else {\r
- *Index = (UINT16) (*Index + StrOffset + 1);\r
- }\r
- } else {\r
- *Index = (UINT16) (*Index + StrOffset);\r
- }\r
-\r
- //\r
- // Include extra glyph info and '\0' info, so +2.\r
- //\r
- return StrOffset + 2;\r
-}\r
-\r
-/**\r
- Add one menu option by specified description and context.\r
-\r
- @param Statement Statement of this Menu Option.\r
- @param MenuItemCount The index for this Option in the Menu.\r
- @param NestIn Whether this statement is nest in another statement.\r
-\r
-**/\r
-VOID\r
-UiAddMenuOption (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN UINT16 *MenuItemCount,\r
- IN BOOLEAN NestIn\r
- )\r
-{\r
- UI_MENU_OPTION *MenuOption;\r
- UINTN Index;\r
- UINTN Count;\r
- CHAR16 *String;\r
- UINT16 NumberOfLines;\r
- UINT16 GlyphWidth;\r
- UINT16 Width;\r
- UINTN ArrayEntry;\r
- CHAR16 *OutputString;\r
- EFI_STRING_ID PromptId;\r
-\r
- NumberOfLines = 1;\r
- ArrayEntry = 0;\r
- GlyphWidth = 1;\r
- Count = 1;\r
- MenuOption = NULL;\r
-\r
- PromptId = GetPrompt (Statement->OpCode);\r
- ASSERT (PromptId != 0);\r
-\r
- String = GetToken (PromptId, gFormData->HiiHandle);\r
- ASSERT (String != NULL);\r
-\r
- Width = GetWidth (Statement);\r
- for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&String[ArrayEntry]) != 0) {\r
- NumberOfLines++;\r
- }\r
- FreePool (OutputString);\r
- }\r
-\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- //\r
- // Add three MenuOptions for Date/Time\r
- // Data format : [01/02/2004] [11:22:33]\r
- // Line number : 0 0 1 0 0 1\r
- //\r
- NumberOfLines = 0;\r
- Count = 3;\r
- }\r
-\r
- for (Index = 0; Index < Count; Index++) {\r
- MenuOption = AllocateZeroPool (sizeof (UI_MENU_OPTION));\r
- ASSERT (MenuOption);\r
-\r
- MenuOption->Signature = UI_MENU_OPTION_SIGNATURE;\r
- MenuOption->Description = String;\r
- MenuOption->Handle = gFormData->HiiHandle;\r
- MenuOption->ThisTag = Statement;\r
- MenuOption->NestInStatement = NestIn;\r
- MenuOption->EntryNumber = *MenuItemCount;\r
-\r
- if (Index == 2) {\r
- //\r
- // Override LineNumber for the MenuOption in Date/Time sequence\r
- //\r
- MenuOption->Skip = 1;\r
- } else {\r
- MenuOption->Skip = NumberOfLines;\r
- }\r
- MenuOption->Sequence = Index;\r
-\r
- if ((Statement->Attribute & HII_DISPLAY_GRAYOUT) != 0) {\r
- MenuOption->GrayOut = TRUE;\r
- } else {\r
- MenuOption->GrayOut = FALSE;\r
- }\r
-\r
- if ((Statement->Attribute & HII_DISPLAY_LOCK) != 0 || (gFormData->Attribute & HII_DISPLAY_LOCK) != 0) {\r
- MenuOption->GrayOut = TRUE;\r
- }\r
-\r
- //\r
- // If the form or the question has the lock attribute, deal same as grayout.\r
- //\r
- if ((gFormData->Attribute & HII_DISPLAY_LOCK) != 0 || (Statement->Attribute & HII_DISPLAY_LOCK) != 0) {\r
- MenuOption->GrayOut = TRUE;\r
- }\r
-\r
- switch (Statement->OpCode->OpCode) {\r
- case EFI_IFR_ORDERED_LIST_OP:\r
- case EFI_IFR_ONE_OF_OP:\r
- case EFI_IFR_NUMERIC_OP:\r
- case EFI_IFR_TIME_OP:\r
- case EFI_IFR_DATE_OP:\r
- case EFI_IFR_CHECKBOX_OP:\r
- case EFI_IFR_PASSWORD_OP:\r
- case EFI_IFR_STRING_OP:\r
- //\r
- // User could change the value of these items\r
- //\r
- MenuOption->IsQuestion = TRUE;\r
- break;\r
- case EFI_IFR_TEXT_OP:\r
- if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) {\r
- //\r
- // Initializing GrayOut option as TRUE for Text setup options \r
- // so that those options will be Gray in colour and un selectable.\r
- //\r
- MenuOption->GrayOut = TRUE;\r
- }\r
- break;\r
- default:\r
- MenuOption->IsQuestion = FALSE;\r
- break;\r
- }\r
-\r
- if ((Statement->Attribute & HII_DISPLAY_READONLY) != 0) {\r
- MenuOption->ReadOnly = TRUE;\r
- if (FeaturePcdGet (PcdBrowerGrayOutReadOnlyMenu)) {\r
- MenuOption->GrayOut = TRUE;\r
- }\r
- }\r
-\r
- InsertTailList (&gMenuOption, &MenuOption->Link);\r
- }\r
-\r
- (*MenuItemCount)++;\r
-}\r
-\r
-/**\r
- Create the menu list base on the form data info.\r
-\r
-**/\r
-VOID\r
-ConvertStatementToMenu (\r
- VOID\r
- )\r
-{\r
- UINT16 MenuItemCount;\r
- LIST_ENTRY *Link;\r
- LIST_ENTRY *NestLink;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
- FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;\r
-\r
- MenuItemCount = 0;\r
- InitializeListHead (&gMenuOption);\r
-\r
- Link = GetFirstNode (&gFormData->StatementListHead);\r
- while (!IsNull (&gFormData->StatementListHead, Link)) {\r
- Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&gFormData->StatementListHead, Link);\r
-\r
- //\r
- // Skip the opcode not recognized by Display core.\r
- //\r
- if (Statement->OpCode->OpCode == EFI_IFR_GUID_OP) {\r
- continue;\r
- }\r
-\r
- UiAddMenuOption (Statement, &MenuItemCount, FALSE);\r
-\r
- //\r
- // Check the statement nest in this host statement.\r
- //\r
- NestLink = GetFirstNode (&Statement->NestStatementList);\r
- while (!IsNull (&Statement->NestStatementList, NestLink)) {\r
- NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);\r
- NestLink = GetNextNode (&Statement->NestStatementList, NestLink);\r
-\r
- UiAddMenuOption (NestStatement, &MenuItemCount, TRUE);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Count the storage space of a Unicode string.\r
-\r
- This function handles the Unicode string with NARROW_CHAR\r
- and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
- does not count in the resultant output. If a WIDE_CHAR is\r
- hit, then 2 Unicode character will consume an output storage\r
- space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
- If String is NULL, then ASSERT ().\r
-\r
- @param String The input string to be counted.\r
-\r
- @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-GetStringWidth (\r
- IN CHAR16 *String\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Count;\r
- UINTN IncrementValue;\r
-\r
- ASSERT (String != NULL);\r
- if (String == NULL) {\r
- return 0;\r
- }\r
-\r
- Index = 0;\r
- Count = 0;\r
- IncrementValue = 1;\r
-\r
- do {\r
- //\r
- // Advance to the null-terminator or to the first width directive\r
- //\r
- for (;\r
- (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
- Index++, Count = Count + IncrementValue\r
- )\r
- ;\r
-\r
- //\r
- // We hit the null-terminator, we now have a count\r
- //\r
- if (String[Index] == 0) {\r
- break;\r
- }\r
- //\r
- // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
- // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
- //\r
- if (String[Index] == NARROW_CHAR) {\r
- //\r
- // Skip to the next character\r
- //\r
- Index++;\r
- IncrementValue = 1;\r
- } else {\r
- //\r
- // Skip to the next character\r
- //\r
- Index++;\r
- IncrementValue = 2;\r
- }\r
- } while (String[Index] != 0);\r
-\r
- //\r
- // Increment by one to include the null-terminator in the size\r
- //\r
- Count++;\r
-\r
- return Count * sizeof (CHAR16);\r
-}\r
-\r
-/**\r
- Base on the input option string to update the skip value for a menu option.\r
-\r
- @param MenuOption The MenuOption to be checked.\r
- @param OptionString The input option string.\r
-\r
-**/\r
-VOID\r
-UpdateSkipInfoForMenu (\r
- IN UI_MENU_OPTION *MenuOption,\r
- IN CHAR16 *OptionString\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 Width;\r
- UINTN Row;\r
- CHAR16 *OutputString;\r
- UINT16 GlyphWidth;\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- GlyphWidth = 1;\r
- Row = 1;\r
-\r
- for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if (StrLen (&OptionString[Index]) != 0) {\r
- Row++;\r
- }\r
-\r
- FreePool (OutputString);\r
- }\r
-\r
- if ((Row > MenuOption->Skip) && \r
- (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_DATE_OP) && \r
- (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_TIME_OP)) {\r
- MenuOption->Skip = Row;\r
- }\r
-}\r
-\r
-/**\r
- Update display lines for a Menu Option.\r
-\r
- @param MenuOption The MenuOption to be checked.\r
-\r
-**/\r
-VOID\r
-UpdateOptionSkipLines (\r
- IN UI_MENU_OPTION *MenuOption\r
- )\r
-{\r
- CHAR16 *OptionString;\r
-\r
- OptionString = NULL;\r
-\r
- ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
- if (OptionString != NULL) {\r
- UpdateSkipInfoForMenu (MenuOption, OptionString);\r
-\r
- FreePool (OptionString);\r
- }\r
-\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo != 0)) {\r
- OptionString = GetToken (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo, gFormData->HiiHandle);\r
-\r
- if (OptionString != NULL) {\r
- UpdateSkipInfoForMenu (MenuOption, OptionString);\r
-\r
- FreePool (OptionString);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Check whether this Menu Option could be highlighted.\r
-\r
- This is an internal function.\r
-\r
- @param MenuOption The MenuOption to be checked.\r
-\r
- @retval TRUE This Menu Option is selectable.\r
- @retval FALSE This Menu Option could not be selected.\r
-\r
-**/\r
-BOOLEAN\r
-IsSelectable (\r
- UI_MENU_OPTION *MenuOption\r
- )\r
-{\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) ||\r
- MenuOption->GrayOut || MenuOption->ReadOnly) {\r
- return FALSE;\r
- } else {\r
- return TRUE;\r
- }\r
-}\r
-\r
-/**\r
- Move to next selectable statement.\r
-\r
- This is an internal function.\r
-\r
- @param GoUp The navigation direction. TRUE: up, FALSE: down.\r
- @param CurrentPosition Current position.\r
- @param GapToTop Gap position to top or bottom.\r
-\r
- @return The row distance from current MenuOption to next selectable MenuOption.\r
-\r
- @retval -1 Reach the begin of the menu, still can't find the selectable menu.\r
- @retval Value Find the selectable menu, maybe the truly selectable, maybe the l\r
- last menu showing at current form.\r
-\r
-**/\r
-INTN\r
-MoveToNextStatement (\r
- IN BOOLEAN GoUp,\r
- IN OUT LIST_ENTRY **CurrentPosition,\r
- IN UINTN GapToTop\r
- )\r
-{\r
- INTN Distance;\r
- LIST_ENTRY *Pos;\r
- UI_MENU_OPTION *NextMenuOption;\r
- UI_MENU_OPTION *PreMenuOption;\r
-\r
- Distance = 0;\r
- Pos = *CurrentPosition;\r
- PreMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
-\r
- while (TRUE) {\r
- NextMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
- //\r
- // NextMenuOption->Row == 0 means this menu has not calculate\r
- // the NextMenuOption->Skip value yet, just calculate here.\r
- //\r
- if (NextMenuOption->Row == 0) {\r
- UpdateOptionSkipLines (NextMenuOption);\r
- }\r
- \r
- if (GoUp && (PreMenuOption != NextMenuOption)) {\r
- //\r
- // In this case, still can't find the selectable menu,\r
- // return the last one in the showing form.\r
- //\r
- if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
- NextMenuOption = PreMenuOption;\r
- break;\r
- }\r
-\r
- //\r
- // Current Position doesn't need to be caculated when go up.\r
- // Caculate distanct at first when go up\r
- // \r
- Distance += NextMenuOption->Skip;\r
- }\r
-\r
- if (IsSelectable (NextMenuOption)) {\r
- break;\r
- }\r
-\r
- //\r
- // Arrive at begin of the menu list.\r
- //\r
- if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {\r
- Distance = -1;\r
- break;\r
- }\r
-\r
- if (!GoUp) {\r
- //\r
- // In this case, still can't find the selectable menu,\r
- // return the last one in the showing form.\r
- //\r
- if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
- NextMenuOption = PreMenuOption;\r
- break;\r
- }\r
-\r
- Distance += NextMenuOption->Skip;\r
- }\r
-\r
- PreMenuOption = NextMenuOption;\r
- Pos = (GoUp ? Pos->BackLink : Pos->ForwardLink);\r
- }\r
-\r
- *CurrentPosition = &NextMenuOption->Link;\r
- return Distance;\r
-}\r
-\r
-\r
-/**\r
- Process option string for date/time opcode.\r
-\r
- @param MenuOption Menu option point to date/time.\r
- @param OptionString Option string input for process.\r
- @param AddOptCol Whether need to update MenuOption->OptCol. \r
-\r
-**/\r
-VOID \r
-ProcessStringForDateTime (\r
- UI_MENU_OPTION *MenuOption,\r
- CHAR16 *OptionString,\r
- BOOLEAN AddOptCol\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Count;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
- EFI_IFR_DATE *Date;\r
- EFI_IFR_TIME *Time;\r
-\r
- ASSERT (MenuOption != NULL && OptionString != NULL);\r
- \r
- Statement = MenuOption->ThisTag;\r
- Date = NULL;\r
- Time = NULL;\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- Date = (EFI_IFR_DATE *) Statement->OpCode;\r
- } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- Time = (EFI_IFR_TIME *) Statement->OpCode;\r
- }\r
- \r
- //\r
- // If leading spaces on OptionString - remove the spaces\r
- //\r
- for (Index = 0; OptionString[Index] == L' '; Index++) {\r
- //\r
- // Base on the blockspace to get the option column info.\r
- //\r
- if (AddOptCol) {\r
- MenuOption->OptCol++;\r
- }\r
- }\r
- \r
- for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) {\r
- OptionString[Count] = OptionString[Index];\r
- Count++;\r
- }\r
- OptionString[Count] = CHAR_NULL;\r
- \r
- //\r
- // Enable to suppress field in the opcode base on the flag.\r
- //\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- //\r
- // OptionString format is: <**: **: ****>\r
- // |month|day|year|\r
- // 4 3 5\r
- //\r
- if ((Date->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
- //\r
- // At this point, only "<**:" in the optionstring. \r
- // Clean the day's ** field, after clean, the format is "< :"\r
- //\r
- SetUnicodeMem (&OptionString[1], 2, L' ');\r
- } else if ((Date->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
- //\r
- // At this point, only "**:" in the optionstring. \r
- // Clean the month's "**" field, after clean, the format is " :"\r
- // \r
- SetUnicodeMem (&OptionString[0], 2, L' ');\r
- } else if ((Date->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
- //\r
- // At this point, only "****>" in the optionstring. \r
- // Clean the year's "****" field, after clean, the format is " >"\r
- // \r
- SetUnicodeMem (&OptionString[0], 4, L' ');\r
- }\r
- } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- //\r
- // OptionString format is: <**: **: **>\r
- // |hour|minute|second|\r
- // 4 3 3\r
- //\r
- if ((Time->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
- //\r
- // At this point, only "<**:" in the optionstring. \r
- // Clean the hour's ** field, after clean, the format is "< :"\r
- //\r
- SetUnicodeMem (&OptionString[1], 2, L' ');\r
- } else if ((Time->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
- //\r
- // At this point, only "**:" in the optionstring. \r
- // Clean the minute's "**" field, after clean, the format is " :"\r
- // \r
- SetUnicodeMem (&OptionString[0], 2, L' ');\r
- } else if ((Time->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
- //\r
- // At this point, only "**>" in the optionstring. \r
- // Clean the second's "**" field, after clean, the format is " >"\r
- // \r
- SetUnicodeMem (&OptionString[0], 2, L' ');\r
- }\r
- }\r
-}\r
-\r
-\r
-/**\r
- Adjust Data and Time position accordingly.\r
- Data format : [01/02/2004] [11:22:33]\r
- Line number : 0 0 1 0 0 1\r
-\r
- This is an internal function.\r
-\r
- @param DirectionUp the up or down direction. False is down. True is\r
- up.\r
- @param CurrentPosition Current position. On return: Point to the last\r
- Option (Year or Second) if up; Point to the first\r
- Option (Month or Hour) if down.\r
-\r
- @return Return line number to pad. It is possible that we stand on a zero-advance\r
- @return data or time opcode, so pad one line when we judge if we are going to scroll outside.\r
-\r
-**/\r
-UINTN\r
-AdjustDateAndTimePosition (\r
- IN BOOLEAN DirectionUp,\r
- IN OUT LIST_ENTRY **CurrentPosition\r
- )\r
-{\r
- UINTN Count;\r
- LIST_ENTRY *NewPosition;\r
- UI_MENU_OPTION *MenuOption;\r
- UINTN PadLineNumber;\r
-\r
- PadLineNumber = 0;\r
- NewPosition = *CurrentPosition;\r
- MenuOption = MENU_OPTION_FROM_LINK (NewPosition);\r
-\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
- (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- //\r
- // Calculate the distance from current position to the last Date/Time MenuOption\r
- //\r
- Count = 0;\r
- while (MenuOption->Skip == 0) {\r
- Count++;\r
- NewPosition = NewPosition->ForwardLink;\r
- MenuOption = MENU_OPTION_FROM_LINK (NewPosition);\r
- PadLineNumber = 1;\r
- }\r
-\r
- NewPosition = *CurrentPosition;\r
- if (DirectionUp) {\r
- //\r
- // Since the behavior of hitting the up arrow on a Date/Time MenuOption is intended\r
- // to be one that back to the previous set of MenuOptions, we need to advance to the first\r
- // Date/Time MenuOption and leave the remaining logic in CfUiUp intact so the appropriate\r
- // checking can be done.\r
- //\r
- while (Count++ < 2) {\r
- NewPosition = NewPosition->BackLink;\r
- }\r
- } else {\r
- //\r
- // Since the behavior of hitting the down arrow on a Date/Time MenuOption is intended\r
- // to be one that progresses to the next set of MenuOptions, we need to advance to the last\r
- // Date/Time MenuOption and leave the remaining logic in CfUiDown intact so the appropriate\r
- // checking can be done.\r
- //\r
- while (Count-- > 0) {\r
- NewPosition = NewPosition->ForwardLink;\r
- }\r
- }\r
-\r
- *CurrentPosition = NewPosition;\r
- }\r
-\r
- return PadLineNumber;\r
-}\r
-\r
-/**\r
- Get step info from numeric opcode.\r
- \r
- @param[in] OpCode The input numeric op code.\r
-\r
- @return step info for this opcode.\r
-**/\r
-UINT64\r
-GetFieldFromNum (\r
- IN EFI_IFR_OP_HEADER *OpCode\r
- )\r
-{\r
- EFI_IFR_NUMERIC *NumericOp;\r
- UINT64 Step;\r
-\r
- NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
- \r
- switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
- case EFI_IFR_NUMERIC_SIZE_1:\r
- Step = NumericOp->data.u8.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_2:\r
- Step = NumericOp->data.u16.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_4:\r
- Step = NumericOp->data.u32.Step;\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_8:\r
- Step = NumericOp->data.u64.Step;\r
- break;\r
- \r
- default:\r
- Step = 0;\r
- break;\r
- }\r
-\r
- return Step;\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
- LIST_ENTRY *Link;\r
- BROWSER_HOT_KEY *HotKey;\r
-\r
- Link = GetFirstNode (&gFormData->HotKeyListHead);\r
- while (!IsNull (&gFormData->HotKeyListHead, Link)) {\r
- HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
- \r
- if (HotKey->KeyData->ScanCode == KeyData->ScanCode) {\r
- return HotKey;\r
- }\r
-\r
- Link = GetNextNode (&gFormData->HotKeyListHead, Link);\r
- }\r
- \r
- return NULL;\r
-}\r
-\r
-\r
-/**\r
- Determine if the menu is the last menu that can be selected.\r
-\r
- This is an internal function.\r
-\r
- @param Direction The scroll direction. False is down. True is up.\r
- @param CurrentPos The current focus.\r
-\r
- @return FALSE -- the menu isn't the last menu that can be selected.\r
- @return TRUE -- the menu is the last menu that can be selected.\r
-\r
-**/\r
-BOOLEAN\r
-ValueIsScroll (\r
- IN BOOLEAN Direction,\r
- IN LIST_ENTRY *CurrentPos\r
- )\r
-{\r
- LIST_ENTRY *Temp;\r
-\r
- Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink;\r
-\r
- if (Temp == &gMenuOption) {\r
- return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Wait for a given event to fire, or for an optional timeout to expire.\r
-\r
- @param Event The event to wait for\r
-\r
- @retval UI_EVENT_TYPE The type of the event which is trigged.\r
-\r
-**/\r
-UI_EVENT_TYPE\r
-UiWaitForEvent (\r
- IN EFI_EVENT Event\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN EventNum;\r
- UINT64 Timeout;\r
- EFI_EVENT TimerEvent;\r
- EFI_EVENT WaitList[3];\r
- UI_EVENT_TYPE EventType;\r
-\r
- TimerEvent = NULL;\r
- Timeout = FormExitTimeout(gFormData);\r
-\r
- if (Timeout != 0) {\r
- Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
-\r
- //\r
- // Set the timer event\r
- //\r
- gBS->SetTimer (\r
- TimerEvent,\r
- TimerRelative,\r
- Timeout\r
- );\r
- }\r
- \r
- WaitList[0] = Event;\r
- EventNum = 1;\r
- if (gFormData->FormRefreshEvent != NULL) {\r
- WaitList[EventNum] = gFormData->FormRefreshEvent;\r
- EventNum ++;\r
- } \r
-\r
- if (Timeout != 0) {\r
- WaitList[EventNum] = TimerEvent;\r
- EventNum ++;\r
- }\r
-\r
- Status = gBS->WaitForEvent (EventNum, WaitList, &Index);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- switch (Index) {\r
- case 0:\r
- EventType = UIEventKey;\r
- break;\r
-\r
- case 1:\r
- if (gFormData->FormRefreshEvent != NULL) {\r
- EventType = UIEventDriver;\r
- } else {\r
- ASSERT (Timeout != 0 && EventNum == 2);\r
- EventType = UIEventTimeOut;\r
- }\r
- break;\r
-\r
- default:\r
- ASSERT (Index == 2 && EventNum == 3);\r
- EventType = UIEventTimeOut;\r
- break;\r
- }\r
-\r
- if (Timeout != 0) {\r
- gBS->CloseEvent (TimerEvent);\r
- }\r
- \r
- return EventType;\r
-}\r
-\r
-/**\r
- Get question id info from the input opcode header.\r
-\r
- @param OpCode The input opcode header pointer.\r
-\r
- @retval The question id for this opcode.\r
-\r
-**/\r
-EFI_QUESTION_ID\r
-GetQuestionIdInfo (\r
- IN EFI_IFR_OP_HEADER *OpCode\r
- )\r
-{\r
- EFI_IFR_QUESTION_HEADER *QuestionHeader;\r
-\r
- if (OpCode->Length < sizeof (EFI_IFR_OP_HEADER) + sizeof (EFI_IFR_QUESTION_HEADER)) {\r
- return 0;\r
- }\r
-\r
- QuestionHeader = (EFI_IFR_QUESTION_HEADER *)((UINT8 *) OpCode + sizeof(EFI_IFR_OP_HEADER));\r
-\r
- return QuestionHeader->QuestionId;\r
-}\r
-\r
-/**\r
- Find the first menu which will be show at the top.\r
-\r
- @param FormData The data info for this form.\r
- @param TopOfScreen The link_entry pointer to top menu.\r
- @param HighlightMenu The menu which will be highlight.\r
- @param SkipValue The skip value for the top menu.\r
-\r
-**/\r
-VOID\r
-FindTopMenu (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT LIST_ENTRY **TopOfScreen,\r
- OUT LIST_ENTRY **HighlightMenu,\r
- OUT INTN *SkipValue\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- LIST_ENTRY *NewPos;\r
- UINTN TopRow;\r
- UINTN BottomRow;\r
- UINTN Index;\r
- UI_MENU_OPTION *SavedMenuOption;\r
- UINTN EndRow;\r
-\r
- TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;\r
- BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;\r
-\r
- //\r
- // If not has input highlight statement, just return the first one in this form.\r
- //\r
- if (FormData->HighLightedStatement == NULL) {\r
- *TopOfScreen = gMenuOption.ForwardLink;\r
- *HighlightMenu = gMenuOption.ForwardLink;\r
- if (!IsListEmpty (&gMenuOption)) {\r
- MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow);\r
- }\r
- *SkipValue = 0;\r
- return;\r
- }\r
-\r
- //\r
- // Now base on the input highlight menu to find the top menu in this page.\r
- // Will base on the highlight menu show at the bottom to find the top menu.\r
- //\r
- NewPos = gMenuOption.ForwardLink;\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-\r
- while ((SavedMenuOption->ThisTag != FormData->HighLightedStatement) ||\r
- (SavedMenuOption->Sequence != gSequence)) {\r
- NewPos = NewPos->ForwardLink;\r
- if (NewPos == &gMenuOption) {\r
- //\r
- // Not Found it, break\r
- //\r
- break;\r
- }\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- }\r
- ASSERT (SavedMenuOption->ThisTag == FormData->HighLightedStatement);\r
-\r
- *HighlightMenu = NewPos;\r
-\r
- AdjustDateAndTimePosition(FALSE, &NewPos);\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- UpdateOptionSkipLines (SavedMenuOption);\r
-\r
- //\r
- // If highlight opcode is date/time, keep the highlight row info not change.\r
- //\r
- if ((SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP || SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP) &&\r
- (gHighligthMenuInfo.QuestionId != 0) && \r
- (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode))) {\r
- //\r
- // Still show the highlight menu before exit from display engine.\r
- //\r
- EndRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;\r
- } else {\r
- EndRow = BottomRow;\r
- }\r
-\r
- //\r
- // Base on the selected menu will show at the bottome of next page, \r
- // select the menu show at the top of the next page. \r
- //\r
- Link = NewPos;\r
- for (Index = TopRow + SavedMenuOption->Skip; Index <= EndRow; ) {\r
- Link = Link->BackLink;\r
- //\r
- // Already find the first menu in this form, means highlight menu \r
- // will show in first page of this form.\r
- //\r
- if (Link == &gMenuOption) {\r
- *TopOfScreen = gMenuOption.ForwardLink;\r
- *SkipValue = 0;\r
- return;\r
- }\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (Link);\r
- UpdateOptionSkipLines (SavedMenuOption);\r
- Index += SavedMenuOption->Skip;\r
- }\r
-\r
- //\r
- // Found the menu which will show at the top of the page.\r
- //\r
- if (Link == NewPos) {\r
- //\r
- // The menu can show more than one pages, just show the menu at the top of the page.\r
- //\r
- *SkipValue = 0;\r
- *TopOfScreen = Link;\r
- } else {\r
- //\r
- // Check whether need to skip some line for menu shows at the top of the page.\r
- //\r
- *SkipValue = Index - EndRow;\r
- if (*SkipValue > 0 && *SkipValue < (INTN) SavedMenuOption->Skip) {\r
- *TopOfScreen = Link;\r
- } else {\r
- *SkipValue = 0;\r
- *TopOfScreen = Link->ForwardLink;\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Display menu and wait for user to select one menu option, then return it.\r
- If AutoBoot is enabled, then if user doesn't select any option,\r
- after period of time, it will automatically return the first menu option.\r
-\r
- @param FormData The current form data info.\r
-\r
- @retval EFI_SUCESSS Process the user selection success.\r
- @retval EFI_NOT_FOUND Process option string for orderedlist/Oneof fail.\r
-\r
-**/\r
-EFI_STATUS\r
-UiDisplayMenu (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
- )\r
-{\r
- INTN SkipValue;\r
- INTN Difference;\r
- UINTN DistanceValue;\r
- UINTN Row;\r
- UINTN Col;\r
- UINTN TempRightCol;\r
- UINTN Temp;\r
- UINTN Temp2;\r
- UINTN Temp3;\r
- UINTN TopRow;\r
- UINTN BottomRow;\r
- UINTN OriginalRow;\r
- UINTN Index;\r
- UINT16 Width;\r
- CHAR16 *StringPtr;\r
- CHAR16 *OptionString;\r
- CHAR16 *OutputString;\r
- CHAR16 *HelpString;\r
- CHAR16 *HelpHeaderString;\r
- CHAR16 *HelpBottomString;\r
- BOOLEAN NewLine;\r
- BOOLEAN Repaint;\r
- BOOLEAN UpArrow;\r
- BOOLEAN DownArrow;\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY Key;\r
- LIST_ENTRY *Link;\r
- LIST_ENTRY *NewPos;\r
- LIST_ENTRY *TopOfScreen;\r
- LIST_ENTRY *SavedListEntry;\r
- UI_MENU_OPTION *MenuOption;\r
- UI_MENU_OPTION *NextMenuOption;\r
- UI_MENU_OPTION *SavedMenuOption;\r
- UI_MENU_OPTION *PreviousMenuOption;\r
- UI_CONTROL_FLAG ControlFlag;\r
- UI_SCREEN_OPERATION ScreenOperation;\r
- UINT16 DefaultId;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
- UINTN ModalSkipColumn;\r
- BROWSER_HOT_KEY *HotKey;\r
- UINTN HelpPageIndex;\r
- UINTN HelpPageCount;\r
- UINTN RowCount;\r
- UINTN HelpLine;\r
- UINTN HelpHeaderLine;\r
- UINTN HelpBottomLine;\r
- BOOLEAN MultiHelpPage;\r
- UINT16 GlyphWidth;\r
- UINT16 EachLineWidth;\r
- UINT16 HeaderLineWidth;\r
- UINT16 BottomLineWidth;\r
- EFI_STRING_ID HelpInfo;\r
- UI_EVENT_TYPE EventType;\r
- FORM_DISPLAY_ENGINE_STATEMENT *InitialHighlight;\r
-\r
- EventType = UIEventNone;\r
- Status = EFI_SUCCESS;\r
- HelpString = NULL;\r
- HelpHeaderString = NULL;\r
- HelpBottomString = NULL;\r
- OptionString = NULL;\r
- ScreenOperation = UiNoOperation;\r
- NewLine = TRUE;\r
- DefaultId = 0;\r
- HelpPageCount = 0;\r
- HelpLine = 0;\r
- RowCount = 0;\r
- HelpBottomLine = 0;\r
- HelpHeaderLine = 0;\r
- HelpPageIndex = 0;\r
- MultiHelpPage = FALSE;\r
- EachLineWidth = 0;\r
- HeaderLineWidth = 0;\r
- BottomLineWidth = 0;\r
- OutputString = NULL;\r
- UpArrow = FALSE;\r
- DownArrow = FALSE;\r
- SkipValue = 0;\r
-\r
- NextMenuOption = NULL;\r
- PreviousMenuOption = NULL;\r
- SavedMenuOption = NULL;\r
- HotKey = NULL;\r
- Repaint = TRUE;\r
- MenuOption = NULL;\r
- ModalSkipColumn = (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
- InitialHighlight = gFormData->HighLightedStatement;\r
-\r
- ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
-\r
- gOptionBlockWidth = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
- gPromptBlockWidth = (CHAR16) (gOptionBlockWidth + LEFT_SKIPPED_COLUMNS);\r
- gHelpBlockWidth = (CHAR16) (gOptionBlockWidth - LEFT_SKIPPED_COLUMNS);\r
-\r
- TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;\r
- BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT - 1;\r
-\r
- Row = TopRow;\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;\r
- } else {\r
- Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS;\r
- }\r
-\r
- FindTopMenu(FormData, &TopOfScreen, &NewPos, &SkipValue);\r
-\r
- gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-\r
- ControlFlag = CfInitialization;\r
- while (TRUE) {\r
- switch (ControlFlag) {\r
- case CfInitialization:\r
- if (IsListEmpty (&gMenuOption)) {\r
- \r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) == 0) {\r
- //\r
- // Clear Statement range.\r
- //\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
- );\r
- \r
- //\r
- // Clear Key Range\r
- //\r
- RefreshKeyHelp (gFormData, NULL, FALSE);\r
- }\r
-\r
- ControlFlag = CfReadKey;\r
- } else {\r
- ControlFlag = CfRepaint;\r
- }\r
- break;\r
-\r
- case CfRepaint:\r
- ControlFlag = CfRefreshHighLight;\r
-\r
- if (Repaint) {\r
- //\r
- // Display menu\r
- //\r
- DownArrow = FALSE;\r
- UpArrow = FALSE;\r
- Row = TopRow;\r
-\r
- Temp = (UINTN) SkipValue;\r
- Temp2 = (UINTN) SkipValue;\r
- Temp3 = (UINTN) SkipValue;\r
-\r
- //\r
- // 1. Clear the screen.\r
- //\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- ClearLines (\r
- gStatementDimensions.LeftColumn + ModalSkipColumn,\r
- gStatementDimensions.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
- );\r
- } else {\r
- TempRightCol = gStatementDimensions.RightColumn;\r
- if (!mStatementLayoutIsChanged) {\r
- TempRightCol = gStatementDimensions.RightColumn - gHelpBlockWidth;\r
- }\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- TopRow - 1,\r
- GetFieldTextColor ()\r
- );\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- TempRightCol,\r
- TopRow,\r
- BottomRow,\r
- GetFieldTextColor ()\r
- );\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
- BottomRow + 1,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
- );\r
- }\r
-\r
- //\r
- // 2.Paint the menu.\r
- //\r
- for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) {\r
- MenuOption = MENU_OPTION_FROM_LINK (Link);\r
- MenuOption->Row = Row;\r
- MenuOption->Col = Col;\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- MenuOption->OptCol = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn + ModalSkipColumn;\r
- } else {\r
- MenuOption->OptCol = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn;\r
- }\r
-\r
- Statement = MenuOption->ThisTag;\r
- if (MenuOption->NestInStatement) {\r
- MenuOption->Col += SUBTITLE_INDENT;\r
- }\r
-\r
- if (MenuOption->GrayOut) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
- } else {\r
- if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
- }\r
- }\r
-\r
- Width = GetWidth (Statement);\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
- //\r
- // Print Arrow for Goto button.\r
- //\r
- PrintCharAt (\r
- MenuOption->Col - 2,\r
- Row,\r
- GEOMETRICSHAPE_RIGHT_TRIANGLE\r
- );\r
- }\r
-\r
- //\r
- // 2.1. Paint the description.\r
- //\r
- for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- //\r
- // Temp means need to skip how many lines from the start.\r
- //\r
- if ((Temp == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->Col, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&MenuOption->Description[Index]) != 0) {\r
- if (Temp == 0) {\r
- Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp != 0) {\r
- Temp--;\r
- }\r
- }\r
-\r
- Temp = 0;\r
- Row = OriginalRow;\r
-\r
- //\r
- // 2.2. Paint the option string.\r
- //\r
- Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE);\r
- //\r
- // If Error occur, question value update in ProcessOptions.\r
- // Exit current FormDisplay with new question value.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (OptionString != NULL) {\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
- }\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp2 == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&OptionString[Index]) != 0) {\r
- if (Temp2 == 0) {\r
- Row++;\r
- //\r
- // Since the Number of lines for this menu entry may or may not be reflected accurately\r
- // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
- // some testing to ensure we are keeping this in-sync.\r
- //\r
- // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
- //\r
- if ((Row - OriginalRow) >= MenuOption->Skip) {\r
- MenuOption->Skip++;\r
- }\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp2 != 0) {\r
- Temp2--;\r
- }\r
- }\r
-\r
- Row = OriginalRow;\r
-\r
- FreePool (OptionString);\r
- }\r
- Temp2 = 0;\r
-\r
- //\r
- // If this is a text op with secondary text information\r
- //\r
- if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
- StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp3 == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&StringPtr[Index]) != 0) {\r
- if (Temp3 == 0) {\r
- Row++;\r
- //\r
- // Since the Number of lines for this menu entry may or may not be reflected accurately\r
- // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
- // some testing to ensure we are keeping this in-sync.\r
- //\r
- // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
- //\r
- if ((Row - OriginalRow) >= MenuOption->Skip) {\r
- MenuOption->Skip++;\r
- }\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp3 != 0) {\r
- Temp3--;\r
- }\r
- }\r
-\r
- Row = OriginalRow;\r
- FreePool (StringPtr);\r
- }\r
- Temp3 = 0;\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-\r
- //\r
- // 3. Update the row info which will be used by next menu.\r
- //\r
- if (Link == TopOfScreen) {\r
- Row += MenuOption->Skip - SkipValue;\r
- } else {\r
- Row += MenuOption->Skip;\r
- }\r
-\r
- if (Row > BottomRow) {\r
- if (!ValueIsScroll (FALSE, Link)) {\r
- DownArrow = TRUE;\r
- }\r
-\r
- Row = BottomRow + 1;\r
- break;\r
- }\r
- }\r
-\r
- if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
- UpArrow = TRUE;\r
- }\r
-\r
- if (UpArrow) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
- PrintCharAt (\r
- gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- ARROW_UP\r
- );\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- }\r
-\r
- if (DownArrow) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
- PrintCharAt (\r
- gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- ARROW_DOWN\r
- );\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- }\r
-\r
- MenuOption = NULL;\r
- }\r
- break;\r
-\r
- case CfRefreshHighLight:\r
-\r
- //\r
- // MenuOption: Last menu option that need to remove hilight\r
- // MenuOption is set to NULL in Repaint\r
- // NewPos: Current menu option that need to hilight\r
- //\r
- ControlFlag = CfUpdateHelpString;\r
-\r
- if (MenuOption != NULL && TopOfScreen == &MenuOption->Link) {\r
- Temp = SkipValue;\r
- } else {\r
- Temp = 0;\r
- }\r
- if (NewPos == TopOfScreen) {\r
- Temp2 = SkipValue;\r
- } else {\r
- Temp2 = 0;\r
- }\r
-\r
- if (NewPos != NULL && (MenuOption == NULL || NewPos != &MenuOption->Link)) {\r
- if (MenuOption != NULL) {\r
- //\r
- // Remove highlight on last Menu Option\r
- //\r
- gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
- ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- if (OptionString != NULL) {\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
- (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)\r
- ) {\r
- ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
- }\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- OriginalRow = MenuOption->Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&OptionString[Index]) != 0) {\r
- if (Temp == 0) {\r
- MenuOption->Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp != 0) {\r
- Temp--;\r
- }\r
- }\r
-\r
- MenuOption->Row = OriginalRow;\r
-\r
- FreePool (OptionString);\r
- } else {\r
- if (NewLine) {\r
- if (MenuOption->GrayOut) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
- } else if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
- }\r
-\r
- OriginalRow = MenuOption->Row;\r
- Width = GetWidth (MenuOption->ThisTag);\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&MenuOption->Description[Index]) != 0) {\r
- if (Temp == 0) {\r
- MenuOption->Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp != 0) {\r
- Temp--;\r
- }\r
- }\r
-\r
- MenuOption->Row = OriginalRow;\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- }\r
- }\r
- }\r
-\r
- //\r
- // This is the current selected statement\r
- //\r
- MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- Statement = MenuOption->ThisTag;\r
-\r
- //\r
- // Get the highlight statement.\r
- //\r
- gUserInput->SelectedStatement = Statement;\r
- gSequence = (UINT16) MenuOption->Sequence;\r
-\r
- //\r
- // Record highlight row info for date/time opcode.\r
- //\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
- gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
- } else {\r
- gHighligthMenuInfo.QuestionId = 0;\r
- gHighligthMenuInfo.DisplayRow = 0;\r
- }\r
-\r
- if (!IsSelectable (MenuOption)) {\r
- RefreshKeyHelp(gFormData, Statement, FALSE);\r
- break;\r
- }\r
-\r
- //\r
- // Set reverse attribute\r
- //\r
- gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
- gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
-\r
- ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
- if (OptionString != NULL) {\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
- }\r
- Width = (UINT16) gOptionBlockWidth;\r
-\r
- OriginalRow = MenuOption->Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
- PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&OptionString[Index]) != 0) {\r
- if (Temp2 == 0) {\r
- MenuOption->Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp2 != 0) {\r
- Temp2--;\r
- }\r
- }\r
-\r
- MenuOption->Row = OriginalRow;\r
-\r
- FreePool (OptionString);\r
- } else {\r
- if (NewLine) {\r
- OriginalRow = MenuOption->Row;\r
-\r
- Width = GetWidth (Statement);\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
- PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&MenuOption->Description[Index]) != 0) {\r
- if (Temp2 == 0) {\r
- MenuOption->Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp2 != 0) {\r
- Temp2--;\r
- }\r
- }\r
-\r
- MenuOption->Row = OriginalRow;\r
-\r
- }\r
- }\r
-\r
- RefreshKeyHelp(gFormData, MenuOption->ThisTag, FALSE);\r
-\r
- //\r
- // Clear reverse attribute\r
- //\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- }\r
- break;\r
-\r
- case CfUpdateHelpString:\r
- ControlFlag = CfPrepareToReadKey;\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- break;\r
- }\r
-\r
- if (Repaint || NewLine) {\r
- //\r
- // Don't print anything if it is a NULL help token\r
- //\r
- ASSERT(MenuOption != NULL);\r
- HelpInfo = ((EFI_IFR_STATEMENT_HEADER *) ((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help;\r
- if (HelpInfo == 0 || !IsSelectable (MenuOption)) {\r
- StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
- } else {\r
- StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
- }\r
-\r
- RowCount = BottomRow - TopRow + 1;\r
- HelpPageIndex = 0;\r
- //\r
- // 1.Calculate how many line the help string need to print.\r
- //\r
- if (HelpString != NULL) {\r
- FreePool (HelpString);\r
- HelpString = NULL;\r
- }\r
- HelpLine = ProcessHelpString (StringPtr, &HelpString, &EachLineWidth, RowCount);\r
- FreePool (StringPtr);\r
-\r
- if (HelpLine > RowCount) {\r
- MultiHelpPage = TRUE;\r
- StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);\r
- if (HelpHeaderString != NULL) {\r
- FreePool (HelpHeaderString);\r
- HelpHeaderString = NULL;\r
- }\r
- HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, &HeaderLineWidth, 0);\r
- FreePool (StringPtr);\r
- StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);\r
- if (HelpBottomString != NULL) {\r
- FreePool (HelpBottomString);\r
- HelpBottomString = NULL;\r
- }\r
- HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, &BottomLineWidth, 0);\r
- FreePool (StringPtr);\r
- //\r
- // Calculate the help page count.\r
- //\r
- if (HelpLine > 2 * RowCount - 2) {\r
- HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;\r
- if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {\r
- HelpPageCount += 1;\r
- }\r
- } else {\r
- HelpPageCount = 2;\r
- }\r
- } else {\r
- MultiHelpPage = FALSE;\r
- }\r
- }\r
-\r
- //\r
- // Check whether need to show the 'More(U/u)' at the begin.\r
- // Base on current direct info, here shows aligned to the right side of the column.\r
- // If the direction is multi line and aligned to right side may have problem, so \r
- // add ASSERT code here.\r
- //\r
- if (HelpPageIndex > 0) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ());\r
- for (Index = 0; Index < HelpHeaderLine; Index++) {\r
- ASSERT (HelpHeaderLine == 1);\r
- ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow,\r
- gEmptyString,\r
- gHelpBlockWidth\r
- );\r
- PrintStringAt (\r
- gStatementDimensions.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,\r
- Index + TopRow,\r
- &HelpHeaderString[Index * HeaderLineWidth]\r
- );\r
- }\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, GetHelpTextColor ());\r
- //\r
- // Print the help string info.\r
- //\r
- if (!MultiHelpPage) {\r
- for (Index = 0; Index < HelpLine; Index++) {\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow,\r
- &HelpString[Index * EachLineWidth],\r
- gHelpBlockWidth\r
- );\r
- }\r
- for (; Index < RowCount; Index ++) {\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow,\r
- gEmptyString,\r
- gHelpBlockWidth\r
- );\r
- }\r
- gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow);\r
- } else {\r
- if (HelpPageIndex == 0) {\r
- for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow,\r
- &HelpString[Index * EachLineWidth],\r
- gHelpBlockWidth\r
- );\r
- }\r
- } else {\r
- for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && \r
- (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) {\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow + HelpHeaderLine,\r
- &HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* EachLineWidth],\r
- gHelpBlockWidth\r
- );\r
- }\r
- if (HelpPageIndex == HelpPageCount - 1) {\r
- for (; Index < RowCount - HelpHeaderLine; Index ++) {\r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- Index + TopRow + HelpHeaderLine,\r
- gEmptyString,\r
- gHelpBlockWidth\r
- );\r
- }\r
- gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow);\r
- }\r
- } \r
- }\r
-\r
- //\r
- // Check whether need to print the 'More(D/d)' at the bottom.\r
- // Base on current direct info, here shows aligned to the right side of the column.\r
- // If the direction is multi line and aligned to right side may have problem, so \r
- // add ASSERT code here.\r
- //\r
- if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ());\r
- for (Index = 0; Index < HelpBottomLine; Index++) {\r
- ASSERT (HelpBottomLine == 1);\r
- ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1)); \r
- PrintStringAtWithWidth (\r
- gStatementDimensions.RightColumn - gHelpBlockWidth,\r
- BottomRow + Index - HelpBottomLine + 1,\r
- gEmptyString,\r
- gHelpBlockWidth\r
- );\r
- PrintStringAt (\r
- gStatementDimensions.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,\r
- BottomRow + Index - HelpBottomLine + 1,\r
- &HelpBottomString[Index * BottomLineWidth]\r
- );\r
- }\r
- }\r
- //\r
- // Reset this flag every time we finish using it.\r
- //\r
- Repaint = FALSE;\r
- NewLine = FALSE;\r
- break;\r
-\r
- case CfPrepareToReadKey:\r
- ControlFlag = CfReadKey;\r
- ScreenOperation = UiNoOperation;\r
- break;\r
-\r
- case CfReadKey:\r
- ControlFlag = CfScreenOperation;\r
-\r
- //\r
- // Wait for user's selection\r
- //\r
- while (TRUE) {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- if (!EFI_ERROR (Status)) {\r
- EventType = UIEventKey;\r
- break;\r
- }\r
-\r
- //\r
- // If we encounter error, continue to read another key in.\r
- //\r
- if (Status != EFI_NOT_READY) {\r
- continue;\r
- }\r
- \r
- EventType = UiWaitForEvent(gST->ConIn->WaitForKey);\r
- if (EventType == UIEventKey) {\r
- gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- }\r
- break;\r
- }\r
-\r
- if (EventType == UIEventDriver) {\r
- gUserInput->Action = BROWSER_ACTION_NONE;\r
- ControlFlag = CfExit;\r
- break;\r
- }\r
- \r
- if (EventType == UIEventTimeOut) {\r
- gUserInput->Action = BROWSER_ACTION_FORM_EXIT;\r
- ControlFlag = CfExit;\r
- break;\r
- }\r
-\r
- switch (Key.UnicodeChar) {\r
- case CHAR_CARRIAGE_RETURN:\r
- if(MenuOption == NULL || MenuOption->GrayOut || MenuOption->ReadOnly) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
-\r
- ScreenOperation = UiSelect;\r
- gDirection = 0;\r
- break;\r
-\r
- //\r
- // We will push the adjustment of these numeric values directly to the input handler\r
- // NOTE: we won't handle manual input numeric\r
- //\r
- case '+':\r
- case '-':\r
- //\r
- // If the screen has no menu items, and the user didn't select UiReset\r
- // ignore the selection and go back to reading keys.\r
- //\r
- if(IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
-\r
- ASSERT(MenuOption != NULL);\r
- Statement = MenuOption->ThisTag;\r
- if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP)\r
- || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)\r
- || ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (GetFieldFromNum(Statement->OpCode) != 0))\r
- ){\r
- if (Key.UnicodeChar == '+') {\r
- gDirection = SCAN_RIGHT;\r
- } else {\r
- gDirection = SCAN_LEFT;\r
- }\r
- \r
- Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE);\r
- if (OptionString != NULL) {\r
- FreePool (OptionString);\r
- }\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Repaint to clear possible error prompt pop-up\r
- //\r
- Repaint = TRUE;\r
- NewLine = TRUE;\r
- } else {\r
- ControlFlag = CfExit;\r
- }\r
- }\r
- break;\r
-\r
- case '^':\r
- ScreenOperation = UiUp;\r
- break;\r
-\r
- case 'V':\r
- case 'v':\r
- ScreenOperation = UiDown;\r
- break;\r
-\r
- case ' ':\r
- if(IsListEmpty (&gMenuOption)) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
- \r
- ASSERT(MenuOption != NULL);\r
- if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) {\r
- ScreenOperation = UiSelect;\r
- }\r
- break;\r
-\r
- case 'D':\r
- case 'd':\r
- if (!MultiHelpPage) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
- ControlFlag = CfUpdateHelpString;\r
- HelpPageIndex = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1;\r
- break;\r
-\r
- case 'U':\r
- case 'u':\r
- if (!MultiHelpPage) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
- ControlFlag = CfUpdateHelpString;\r
- HelpPageIndex = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0;\r
- break;\r
-\r
- case CHAR_NULL:\r
- for (Index = 0; Index < mScanCodeNumber; Index++) {\r
- if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {\r
- ScreenOperation = gScanCodeToOperation[Index].ScreenOperation;\r
- break;\r
- }\r
- }\r
- \r
- if (((FormData->Attribute & HII_DISPLAY_MODAL) != 0) && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) {\r
- //\r
- // ModalForm has no ESC key and Hot Key.\r
- //\r
- ControlFlag = CfReadKey;\r
- } else if (Index == mScanCodeNumber) {\r
- //\r
- // Check whether Key matches the registered hot key.\r
- //\r
- HotKey = NULL;\r
- HotKey = GetHotKeyFromRegisterList (&Key);\r
- if (HotKey != NULL) {\r
- ScreenOperation = UiHotKey;\r
- }\r
- }\r
- break;\r
- }\r
- break;\r
-\r
- case CfScreenOperation:\r
- if (ScreenOperation != UiReset) {\r
- //\r
- // If the screen has no menu items, and the user didn't select UiReset\r
- // ignore the selection and go back to reading keys.\r
- //\r
- if (IsListEmpty (&gMenuOption)) {\r
- ControlFlag = CfReadKey;\r
- break;\r
- }\r
- }\r
-\r
- for (Index = 0;\r
- Index < sizeof (gScreenOperationToControlFlag) / sizeof (gScreenOperationToControlFlag[0]);\r
- Index++\r
- ) {\r
- if (ScreenOperation == gScreenOperationToControlFlag[Index].ScreenOperation) {\r
- ControlFlag = gScreenOperationToControlFlag[Index].ControlFlag;\r
- break;\r
- }\r
- }\r
- break;\r
-\r
- case CfUiSelect:\r
- ControlFlag = CfRepaint;\r
-\r
- ASSERT(MenuOption != NULL);\r
- Statement = MenuOption->ThisTag;\r
- if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) {\r
- break;\r
- }\r
-\r
- switch (Statement->OpCode->OpCode) {\r
- case EFI_IFR_REF_OP:\r
- case EFI_IFR_ACTION_OP:\r
- case EFI_IFR_RESET_BUTTON_OP:\r
- ControlFlag = CfExit;\r
- break;\r
-\r
- default:\r
- //\r
- // Editable Questions: oneof, ordered list, checkbox, numeric, string, password\r
- //\r
- RefreshKeyHelp (gFormData, Statement, TRUE);\r
- Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE);\r
- \r
- if (OptionString != NULL) {\r
- FreePool (OptionString);\r
- }\r
- \r
- if (EFI_ERROR (Status)) {\r
- Repaint = TRUE;\r
- NewLine = TRUE;\r
- RefreshKeyHelp (gFormData, Statement, FALSE);\r
- break;\r
- } else {\r
- ControlFlag = CfExit;\r
- break;\r
- }\r
- }\r
- break;\r
-\r
- case CfUiReset:\r
- //\r
- // We come here when someone press ESC\r
- // If the policy is not exit front page when user press ESC, process here.\r
- //\r
- if (!FormExitPolicy()) {\r
- Repaint = TRUE;\r
- NewLine = TRUE;\r
- ControlFlag = CfRepaint;\r
- break;\r
- }\r
-\r
- //\r
- // When user press ESC, it will try to show another menu, should clean the gSequence info.\r
- //\r
- if (gSequence != 0) {\r
- gSequence = 0;\r
- }\r
-\r
- gUserInput->Action = BROWSER_ACTION_FORM_EXIT;\r
- ControlFlag = CfExit;\r
- break;\r
-\r
- case CfUiHotKey:\r
- ControlFlag = CfRepaint;\r
- \r
- gUserInput->Action = HotKey->Action;\r
- ControlFlag = CfExit;\r
- break;\r
-\r
- case CfUiLeft:\r
- ControlFlag = CfRepaint;\r
- ASSERT(MenuOption != NULL);\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- if (MenuOption->Sequence != 0) {\r
- //\r
- // In the middle or tail of the Date/Time op-code set, go left.\r
- //\r
- ASSERT(NewPos != NULL);\r
- NewPos = NewPos->BackLink;\r
- }\r
- }\r
- break;\r
-\r
- case CfUiRight:\r
- ControlFlag = CfRepaint;\r
- ASSERT(MenuOption != NULL);\r
- if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- if (MenuOption->Sequence != 2) {\r
- //\r
- // In the middle or tail of the Date/Time op-code set, go left.\r
- //\r
- ASSERT(NewPos != NULL);\r
- NewPos = NewPos->ForwardLink;\r
- }\r
- }\r
- break;\r
-\r
- case CfUiUp:\r
- ControlFlag = CfRepaint;\r
-\r
- SavedListEntry = NewPos;\r
-\r
- ASSERT(NewPos != NULL);\r
- //\r
- // Adjust Date/Time position before we advance forward.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- if (NewPos->BackLink != &gMenuOption) {\r
- MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- ASSERT (MenuOption != NULL);\r
- NewLine = TRUE;\r
- NewPos = NewPos->BackLink;\r
-\r
- PreviousMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- if (PreviousMenuOption->Row == 0) {\r
- UpdateOptionSkipLines (PreviousMenuOption);\r
- }\r
- DistanceValue = PreviousMenuOption->Skip;\r
- Difference = 0;\r
- if (MenuOption->Row >= DistanceValue + TopRow) {\r
- Difference = MoveToNextStatement (TRUE, &NewPos, MenuOption->Row - TopRow - DistanceValue);\r
- }\r
- NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- \r
- if (Difference < 0) {\r
- //\r
- // We hit the begining MenuOption that can be focused\r
- // so we simply scroll to the top.\r
- //\r
- if (TopOfScreen != gMenuOption.ForwardLink) {\r
- TopOfScreen = gMenuOption.ForwardLink;\r
- Repaint = TRUE;\r
- } else {\r
- //\r
- // Scroll up to the last page when we have arrived at top page.\r
- //\r
- NewPos = &gMenuOption;\r
- TopOfScreen = &gMenuOption;\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
- ScreenOperation = UiPageUp;\r
- ControlFlag = CfScreenOperation;\r
- break;\r
- }\r
- } else if (MenuOption->Row < TopRow + DistanceValue + Difference) {\r
- //\r
- // Previous focus MenuOption is above the TopOfScreen, so we need to scroll\r
- //\r
- TopOfScreen = NewPos;\r
- Repaint = TRUE;\r
- SkipValue = 0;\r
- } else if (!IsSelectable (NextMenuOption)) {\r
- //\r
- // Continue to go up until scroll to next page or the selectable option is found.\r
- //\r
- ScreenOperation = UiUp;\r
- ControlFlag = CfScreenOperation;\r
- }\r
-\r
- //\r
- // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
- UpdateStatusBar (INPUT_ERROR, FALSE);\r
- } else {\r
- //\r
- // Scroll up to the last page.\r
- //\r
- NewPos = &gMenuOption;\r
- TopOfScreen = &gMenuOption;\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
- ScreenOperation = UiPageUp;\r
- ControlFlag = CfScreenOperation;\r
- }\r
- break;\r
-\r
- case CfUiPageUp:\r
- //\r
- // SkipValue means lines is skipped when show the top menu option.\r
- //\r
- ControlFlag = CfRepaint;\r
-\r
- ASSERT(NewPos != NULL);\r
- //\r
- // Already at the first menu option, Check the skip value.\r
- //\r
- if (NewPos->BackLink == &gMenuOption) {\r
- if (SkipValue == 0) {\r
- NewLine = FALSE;\r
- Repaint = FALSE;\r
- } else {\r
- NewLine = TRUE;\r
- Repaint = TRUE;\r
- SkipValue = 0;\r
- }\r
- break;\r
- }\r
-\r
- NewLine = TRUE;\r
- Repaint = TRUE;\r
-\r
- //\r
- // SkipValue > (BottomRow - TopRow + 1) means current menu has more than one\r
- // form of options to be show, so just update the SkipValue to show the next\r
- // parts of options.\r
- //\r
- if (SkipValue > (INTN) (BottomRow - TopRow + 1)) {\r
- SkipValue -= BottomRow - TopRow + 1;\r
- break;\r
- }\r
-\r
- Link = TopOfScreen;\r
- //\r
- // First minus the menu of the top screen, it's value is SkipValue.\r
- //\r
- Index = (BottomRow + 1) - SkipValue;\r
- while ((Index > TopRow) && (Link->BackLink != &gMenuOption)) {\r
- Link = Link->BackLink;\r
- PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);\r
- if (PreviousMenuOption->Row == 0) {\r
- UpdateOptionSkipLines (PreviousMenuOption);\r
- } \r
- if (Index < PreviousMenuOption->Skip) {\r
- break;\r
- }\r
- Index = Index - PreviousMenuOption->Skip;\r
- }\r
- \r
- if ((Link->BackLink == &gMenuOption) && (Index >= TopRow)) {\r
- SkipValue = 0;\r
- if (TopOfScreen == &gMenuOption) {\r
- TopOfScreen = gMenuOption.ForwardLink;\r
- NewPos = gMenuOption.BackLink;\r
- MoveToNextStatement (TRUE, &NewPos, BottomRow - TopRow);\r
- Repaint = FALSE;\r
- } else if (TopOfScreen != Link) {\r
- TopOfScreen = Link;\r
- NewPos = Link;\r
- MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
- } else {\r
- //\r
- // Finally we know that NewPos is the last MenuOption can be focused.\r
- //\r
- Repaint = FALSE;\r
- NewPos = Link;\r
- MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
- }\r
- } else {\r
- if (Index > TopRow) {\r
- //\r
- // At here, only case "Index < PreviousMenuOption->Skip" can reach here.\r
- //\r
- SkipValue = PreviousMenuOption->Skip - (Index - TopRow);\r
- } else if (Index == TopRow) {\r
- SkipValue = 0;\r
- } else {\r
- SkipValue = TopRow - Index;\r
- }\r
-\r
- //\r
- // Move to the option in Next page.\r
- //\r
- if (TopOfScreen == &gMenuOption) {\r
- NewPos = gMenuOption.BackLink;\r
- MoveToNextStatement (TRUE, &NewPos, BottomRow - TopRow);\r
- } else {\r
- NewPos = Link;\r
- MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
- }\r
-\r
- //\r
- // There are more MenuOption needing scrolling up.\r
- //\r
- TopOfScreen = Link;\r
- MenuOption = NULL;\r
- }\r
-\r
- //\r
- // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
- // Don't do this when we are already in the first page.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- break;\r
-\r
- case CfUiPageDown:\r
- //\r
- // SkipValue means lines is skipped when show the top menu option.\r
- //\r
- ControlFlag = CfRepaint;\r
-\r
- ASSERT (NewPos != NULL);\r
- if (NewPos->ForwardLink == &gMenuOption) {\r
- NewLine = FALSE;\r
- Repaint = FALSE;\r
- break;\r
- }\r
-\r
- NewLine = TRUE;\r
- Repaint = TRUE;\r
- Link = TopOfScreen;\r
- NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
- Index = TopRow + NextMenuOption->Skip - SkipValue;\r
- //\r
- // Count to the menu option which will show at the top of the next form.\r
- //\r
- while ((Index <= BottomRow + 1) && (Link->ForwardLink != &gMenuOption)) {\r
- Link = Link->ForwardLink;\r
- NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
- Index = Index + NextMenuOption->Skip;\r
- }\r
-\r
- if ((Link->ForwardLink == &gMenuOption) && (Index <= BottomRow + 1)) {\r
- //\r
- // Finally we know that NewPos is the last MenuOption can be focused.\r
- //\r
- Repaint = FALSE;\r
- MoveToNextStatement (TRUE, &Link, Index - TopRow);\r
- } else {\r
- //\r
- // Calculate the skip line for top of screen menu.\r
- //\r
- if (Link == TopOfScreen) {\r
- //\r
- // The top of screen menu option occupies the entire form.\r
- //\r
- SkipValue += BottomRow - TopRow + 1;\r
- } else {\r
- SkipValue = NextMenuOption->Skip - (Index - (BottomRow + 1));\r
- }\r
-\r
- TopOfScreen = Link;\r
- MenuOption = NULL;\r
- //\r
- // Move to the Next selectable menu.\r
- //\r
- MoveToNextStatement (FALSE, &Link, BottomRow - TopRow);\r
- }\r
-\r
- //\r
- // Save the menu as the next highlight menu.\r
- //\r
- NewPos = Link;\r
-\r
- //\r
- // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
- // Don't do this when we are already in the last page.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- break;\r
-\r
- case CfUiDown:\r
- //\r
- // SkipValue means lines is skipped when show the top menu option.\r
- // NewPos points to the menu which is highlighted now.\r
- //\r
- ControlFlag = CfRepaint;\r
-\r
- //\r
- // Since the behavior of hitting the down arrow on a Date/Time op-code is intended\r
- // to be one that progresses to the next set of op-codes, we need to advance to the last\r
- // Date/Time op-code and leave the remaining logic in UiDown intact so the appropriate\r
- // checking can be done. The only other logic we need to introduce is that if a Date/Time\r
- // op-code is the last entry in the menu, we need to rewind back to the first op-code of\r
- // the Date/Time op-code.\r
- //\r
- SavedListEntry = NewPos;\r
- AdjustDateAndTimePosition (FALSE, &NewPos);\r
-\r
- if (NewPos->ForwardLink != &gMenuOption) {\r
- MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- NewLine = TRUE;\r
- NewPos = NewPos->ForwardLink;\r
-\r
- Difference = 0;\r
- //\r
- // Current menu not at the bottom of the form.\r
- //\r
- if (BottomRow >= MenuOption->Row + MenuOption->Skip) {\r
- //\r
- // Find the next selectable menu.\r
- //\r
- Difference = MoveToNextStatement (FALSE, &NewPos, BottomRow - MenuOption->Row - MenuOption->Skip);\r
- //\r
- // We hit the end of MenuOption that can be focused\r
- // so we simply scroll to the first page.\r
- //\r
- if (Difference < 0) {\r
- //\r
- // Scroll to the first page.\r
- //\r
- if (TopOfScreen != gMenuOption.ForwardLink) {\r
- TopOfScreen = gMenuOption.ForwardLink;\r
- Repaint = TRUE;\r
- MenuOption = NULL;\r
- } else {\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
- }\r
- NewPos = gMenuOption.ForwardLink;\r
- MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-\r
- SkipValue = 0;\r
- //\r
- // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- break;\r
- }\r
- }\r
- NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- if (NextMenuOption->Row == 0) {\r
- UpdateOptionSkipLines (NextMenuOption);\r
- }\r
- DistanceValue = Difference + NextMenuOption->Skip;\r
-\r
- Temp = MenuOption->Row + MenuOption->Skip + DistanceValue - 1;\r
- if ((MenuOption->Row + MenuOption->Skip == BottomRow + 1) &&\r
- (NextMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP ||\r
- NextMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)\r
- ) {\r
- Temp ++;\r
- }\r
-\r
- //\r
- // If we are going to scroll, update TopOfScreen\r
- //\r
- if (Temp > BottomRow) {\r
- do {\r
- //\r
- // Is the current top of screen a zero-advance op-code?\r
- // If so, keep moving forward till we hit a >0 advance op-code\r
- //\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
- //\r
- // If bottom op-code is more than one line or top op-code is more than one line\r
- //\r
- if ((DistanceValue > 1) || (SavedMenuOption->Skip > 1)) {\r
- //\r
- // Is the bottom op-code greater than or equal in size to the top op-code?\r
- //\r
- if ((Temp - BottomRow) >= (SavedMenuOption->Skip - SkipValue)) {\r
- //\r
- // Skip the top op-code\r
- //\r
- TopOfScreen = TopOfScreen->ForwardLink;\r
- Difference = (Temp - BottomRow) - (SavedMenuOption->Skip - SkipValue);\r
-\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
- //\r
- // If we have a remainder, skip that many more op-codes until we drain the remainder\r
- //\r
- while (Difference >= (INTN) SavedMenuOption->Skip) {\r
- //\r
- // Since the Difference is greater than or equal to this op-code's skip value, skip it\r
- //\r
- Difference = Difference - (INTN) SavedMenuOption->Skip;\r
- TopOfScreen = TopOfScreen->ForwardLink;\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
- }\r
- //\r
- // Since we will act on this op-code in the next routine, and increment the\r
- // SkipValue, set the skips to one less than what is required.\r
- //\r
- SkipValue = Difference - 1;\r
- } else {\r
- //\r
- // Since we will act on this op-code in the next routine, and increment the\r
- // SkipValue, set the skips to one less than what is required.\r
- //\r
- SkipValue += (Temp - BottomRow) - 1;\r
- }\r
- } else {\r
- if ((SkipValue + 1) == (INTN) SavedMenuOption->Skip) {\r
- TopOfScreen = TopOfScreen->ForwardLink;\r
- break;\r
- }\r
- }\r
- //\r
- // If the op-code at the top of the screen is more than one line, let's not skip it yet\r
- // Let's set a skip flag to smoothly scroll the top of the screen.\r
- //\r
- if (SavedMenuOption->Skip > 1) {\r
- if (SavedMenuOption == NextMenuOption) {\r
- SkipValue = 0;\r
- } else {\r
- SkipValue++;\r
- }\r
- } else if (SavedMenuOption->Skip == 1) {\r
- SkipValue = 0;\r
- } else {\r
- SkipValue = 0;\r
- TopOfScreen = TopOfScreen->ForwardLink;\r
- }\r
- } while (SavedMenuOption->Skip == 0);\r
-\r
- Repaint = TRUE;\r
- } else if (!IsSelectable (NextMenuOption)) {\r
- //\r
- // Continue to go down until scroll to next page or the selectable option is found.\r
- //\r
- ScreenOperation = UiDown;\r
- ControlFlag = CfScreenOperation;\r
- }\r
-\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-\r
- UpdateStatusBar (INPUT_ERROR, FALSE);\r
-\r
- } else {\r
- //\r
- // Scroll to the first page.\r
- //\r
- if (TopOfScreen != gMenuOption.ForwardLink) {\r
- TopOfScreen = gMenuOption.ForwardLink;\r
- Repaint = TRUE;\r
- MenuOption = NULL;\r
- } else {\r
- //\r
- // Need to remove the current highlight menu.\r
- // MenuOption saved the last highlight menu info.\r
- //\r
- MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
- }\r
-\r
- SkipValue = 0;\r
- NewLine = TRUE;\r
- //\r
- // Get the next highlight menu.\r
- //\r
- NewPos = gMenuOption.ForwardLink;\r
- MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
- }\r
-\r
- //\r
- // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
- //\r
- AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
- AdjustDateAndTimePosition (TRUE, &NewPos);\r
- break;\r
-\r
- case CfUiNoOperation:\r
- ControlFlag = CfRepaint;\r
- break;\r
-\r
- case CfExit:\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- if (HelpString != NULL) {\r
- FreePool (HelpString);\r
- }\r
- if (HelpHeaderString != NULL) {\r
- FreePool (HelpHeaderString);\r
- }\r
- if (HelpBottomString != NULL) {\r
- FreePool (HelpBottomString);\r
- }\r
- return EFI_SUCCESS;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
-}\r
-\r
-/**\r
-\r
- Base on the browser status info to show an pop up message.\r
-\r
-**/\r
-VOID\r
-BrowserStatusProcess (\r
- VOID\r
- )\r
-{\r
- CHAR16 *ErrorInfo;\r
- EFI_INPUT_KEY Key;\r
-\r
- if (gFormData->BrowserStatus == BROWSER_SUCCESS) {\r
- return;\r
- }\r
-\r
- if (gFormData->ErrorString != NULL) {\r
- ErrorInfo = gFormData->ErrorString;\r
- } else {\r
- switch (gFormData->BrowserStatus) {\r
- case BROWSER_SUBMIT_FAIL:\r
- ErrorInfo = gSaveFailed;\r
- break;\r
-\r
- case BROWSER_NO_SUBMIT_IF:\r
- ErrorInfo = gNoSubmitIf;\r
- break;\r
-\r
- case BROWSER_FORM_NOT_FOUND:\r
- ErrorInfo = gFormNotFound;\r
- break;\r
-\r
- case BROWSER_FORM_SUPPRESS:\r
- ErrorInfo = gFormSuppress;\r
- break;\r
-\r
- case BROWSER_PROTOCOL_NOT_FOUND:\r
- ErrorInfo = gProtocolNotFound;\r
- break;\r
-\r
- default:\r
- ErrorInfo = gBrwoserError;\r
- break;\r
- }\r
- }\r
-\r
- //\r
- // Error occur, prompt error message.\r
- //\r
- do {\r
- CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
- } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-}\r
-\r
-/**\r
- Display one form, and return user input.\r
- \r
- @param FormData Form Data to be shown.\r
- @param UserInputData User input data.\r
- \r
- @retval EFI_SUCCESS 1.Form Data is shown, and user input is got.\r
- 2.Error info has show and return.\r
- @retval EFI_INVALID_PARAMETER The input screen dimension is not valid\r
- @retval EFI_NOT_FOUND New form data has some error.\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-FormDisplay (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT USER_INPUT *UserInputData\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- ASSERT (FormData != NULL);\r
- if (FormData == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- gUserInput = UserInputData;\r
- gFormData = FormData;\r
-\r
- //\r
- // Process the status info first.\r
- //\r
- BrowserStatusProcess();\r
- if (UserInputData == NULL) {\r
- //\r
- // UserInputData == NULL, means only need to print the error info, return here.\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- ConvertStatementToMenu();\r
-\r
- Status = DisplayPageFrame (FormData, &gStatementDimensions);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Check whether layout is changed.\r
- //\r
- if (mIsFirstForm \r
- || (gOldFormEntry.HiiHandle != FormData->HiiHandle)\r
- || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))\r
- || (gOldFormEntry.FormId != FormData->FormId)) {\r
- mStatementLayoutIsChanged = TRUE;\r
- } else {\r
- mStatementLayoutIsChanged = FALSE;\r
- }\r
-\r
- Status = UiDisplayMenu(FormData);\r
- \r
- //\r
- // Backup last form info.\r
- //\r
- mIsFirstForm = FALSE;\r
- gOldFormEntry.HiiHandle = FormData->HiiHandle;\r
- CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid);\r
- gOldFormEntry.FormId = FormData->FormId;\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-DriverClearDisplayPage (\r
- VOID\r
- )\r
-{\r
- ClearDisplayPage ();\r
- mIsFirstForm = TRUE;\r
-}\r
-\r
-/**\r
- Set Buffer to Value for Size bytes.\r
-\r
- @param Buffer Memory to set.\r
- @param Size Number of bytes to set\r
- @param Value Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
- IN VOID *Buffer,\r
- IN UINTN Size,\r
- IN CHAR16 Value\r
- )\r
-{\r
- CHAR16 *Ptr;\r
-\r
- Ptr = Buffer;\r
- while ((Size--) != 0) {\r
- *(Ptr++) = Value;\r
- }\r
-}\r
-\r
-/**\r
- Initialize Setup Browser driver.\r
-\r
- @param ImageHandle The image handle.\r
- @param SystemTable The system table.\r
-\r
- @retval EFI_SUCCESS The Setup Browser module is initialized correctly..\r
- @return Other value if failed to initialize the Setup Browser module.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeDisplayEngine (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY HotKey;\r
- EFI_STRING NewString;\r
- EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2;\r
-\r
- //\r
- // Publish our HII data\r
- //\r
- gHiiHandle = HiiAddPackages (\r
- &gDisplayEngineGuid,\r
- ImageHandle,\r
- DisplayEngineStrings,\r
- NULL\r
- );\r
- ASSERT (gHiiHandle != NULL);\r
-\r
- //\r
- // Install Form Display protocol\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &mPrivateData.Handle,\r
- &gEdkiiFormDisplayEngineProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &mPrivateData.FromDisplayProt\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- InitializeDisplayStrings();\r
- \r
- ZeroMem (&gHighligthMenuInfo, sizeof (gHighligthMenuInfo));\r
- ZeroMem (&gOldFormEntry, sizeof (gOldFormEntry));\r
-\r
- //\r
- // Use BrowserEx2 protocol to register HotKey.\r
- // \r
- Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Register the default HotKey F9 and F10 again.\r
- //\r
- HotKey.UnicodeChar = CHAR_NULL;\r
- HotKey.ScanCode = SCAN_F10;\r
- NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_TEN_STRING), NULL);\r
- ASSERT (NewString != NULL);\r
- FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_SUBMIT, 0, NewString);\r
-\r
- HotKey.ScanCode = SCAN_F9;\r
- NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_NINE_STRING), NULL);\r
- ASSERT (NewString != NULL);\r
- FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD, NewString);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This is the default unload handle for display core drivers.\r
-\r
- @param[in] ImageHandle The drivers' driver image.\r
-\r
- @retval EFI_SUCCESS The image is unloaded.\r
- @retval Others Failed to unload the image.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UnloadDisplayEngine (\r
- IN EFI_HANDLE ImageHandle\r
- )\r
-{\r
- HiiRemovePackages(gHiiHandle);\r
-\r
- FreeDisplayStrings ();\r
-\r
- return EFI_SUCCESS;\r
-}\r
+++ /dev/null
-/** @file\r
- FormDiplay protocol to show Form\r
-\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution. \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php. \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef __FORM_DISPLAY_H__\r
-#define __FORM_DISPLAY_H__\r
-\r
-\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/CustomizedDisplayLib.h>\r
-\r
-#include <Protocol/FormBrowserEx2.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/DisplayProtocol.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-\r
-//\r
-// This is the generated header file which includes whatever needs to be exported (strings + IFR)\r
-//\r
-extern UINT8 DisplayEngineStrings[];\r
-extern EFI_SCREEN_DESCRIPTOR gStatementDimensions;\r
-extern USER_INPUT *gUserInput;\r
-extern FORM_DISPLAY_ENGINE_FORM *gFormData;\r
-extern EFI_HII_HANDLE gHiiHandle;\r
-extern UINT16 gDirection;\r
-extern LIST_ENTRY gMenuOption;\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-extern CHAR16 *gSaveFailed;\r
-extern CHAR16 *gPromptForData;\r
-extern CHAR16 *gPromptForPassword;\r
-extern CHAR16 *gPromptForNewPassword;\r
-extern CHAR16 *gConfirmPassword;\r
-extern CHAR16 *gConfirmError;\r
-extern CHAR16 *gPassowordInvalid;\r
-extern CHAR16 *gPressEnter;\r
-extern CHAR16 *gEmptyString;\r
-extern CHAR16 *gMiniString;\r
-extern CHAR16 *gOptionMismatch;\r
-extern CHAR16 *gFormSuppress;\r
-extern CHAR16 *gProtocolNotFound;\r
-\r
-extern CHAR16 gPromptBlockWidth;\r
-extern CHAR16 gOptionBlockWidth;\r
-extern CHAR16 gHelpBlockWidth;\r
-extern CHAR16 *mUnknownString;\r
-\r
-//\r
-// Screen definitions\r
-//\r
-\r
-#define LEFT_SKIPPED_COLUMNS 3\r
-#define SCROLL_ARROW_HEIGHT 1\r
-#define POPUP_PAD_SPACE_COUNT 5\r
-#define POPUP_FRAME_WIDTH 2\r
-\r
-//\r
-// Display definitions\r
-//\r
-#define LEFT_ONEOF_DELIMITER L'<'\r
-#define RIGHT_ONEOF_DELIMITER L'>'\r
-\r
-#define LEFT_NUMERIC_DELIMITER L'['\r
-#define RIGHT_NUMERIC_DELIMITER L']'\r
-\r
-#define LEFT_CHECKBOX_DELIMITER L'['\r
-#define RIGHT_CHECKBOX_DELIMITER L']'\r
-\r
-#define CHECK_ON L'X'\r
-#define CHECK_OFF L' '\r
-\r
-#define TIME_SEPARATOR L':'\r
-#define DATE_SEPARATOR L'/'\r
-\r
-#define SUBTITLE_INDENT 2\r
-\r
-//\r
-// This is the Input Error Message\r
-//\r
-#define INPUT_ERROR 1\r
-\r
-//\r
-// This is the NV RAM update required Message\r
-//\r
-#define NV_UPDATE_REQUIRED 2\r
-//\r
-// Time definitions\r
-//\r
-#define ONE_SECOND 10000000\r
-\r
-//\r
-// It take 23 characters including the NULL to print a 64 bits number with "[" and "]".\r
-// pow(2, 64) = [18446744073709551616]\r
-//\r
-#define MAX_NUMERIC_INPUT_WIDTH 23\r
-\r
-#define EFI_HII_EXPRESSION_INCONSISTENT_IF 0\r
-#define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1\r
-#define EFI_HII_EXPRESSION_GRAY_OUT_IF 2\r
-#define EFI_HII_EXPRESSION_SUPPRESS_IF 3\r
-#define EFI_HII_EXPRESSION_DISABLE_IF 4\r
-\r
-//\r
-// Character definitions\r
-//\r
-#define CHAR_SPACE 0x0020\r
-\r
-#define FORM_DISPLAY_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'D', 'D', 'V')\r
-typedef struct {\r
- UINT32 Signature;\r
-\r
- EFI_HANDLE Handle;\r
-\r
- //\r
- // Produced protocol\r
- //\r
- EDKII_FORM_DISPLAY_ENGINE_PROTOCOL FromDisplayProt;\r
-} FORM_DISPLAY_DRIVER_PRIVATE_DATA;\r
-\r
-\r
-typedef enum {\r
- UiNoOperation,\r
- UiSelect,\r
- UiUp,\r
- UiDown,\r
- UiLeft,\r
- UiRight,\r
- UiReset,\r
- UiPrevious,\r
- UiPageUp,\r
- UiPageDown,\r
- UiHotKey,\r
- UiMaxOperation\r
-} UI_SCREEN_OPERATION;\r
-\r
-typedef enum {\r
- CfInitialization,\r
- CfCheckSelection,\r
- CfRepaint,\r
- CfRefreshHighLight,\r
- CfUpdateHelpString,\r
- CfPrepareToReadKey,\r
- CfReadKey,\r
- CfScreenOperation,\r
- CfUiSelect,\r
- CfUiReset,\r
- CfUiLeft,\r
- CfUiRight,\r
- CfUiUp,\r
- CfUiPageUp,\r
- CfUiPageDown,\r
- CfUiDown,\r
- CfUiDefault,\r
- CfUiNoOperation,\r
- CfExit,\r
- CfUiHotKey,\r
- CfMaxControlFlag\r
-} UI_CONTROL_FLAG;\r
-\r
-typedef enum {\r
- UIEventNone,\r
- UIEventKey,\r
- UIEventTimeOut,\r
- UIEventDriver\r
-} UI_EVENT_TYPE;\r
-\r
-typedef struct {\r
- UINT16 ScanCode;\r
- UI_SCREEN_OPERATION ScreenOperation;\r
-} SCAN_CODE_TO_SCREEN_OPERATION;\r
-\r
-typedef struct {\r
- UI_SCREEN_OPERATION ScreenOperation;\r
- UI_CONTROL_FLAG ControlFlag;\r
-} SCREEN_OPERATION_T0_CONTROL_FLAG;\r
-\r
-typedef struct {\r
- EFI_QUESTION_ID QuestionId;\r
- UINT16 DisplayRow;\r
-} DISPLAY_HIGHLIGHT_MENU_INFO;\r
-\r
-#define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
-\r
- EFI_HII_HANDLE Handle;\r
- FORM_DISPLAY_ENGINE_STATEMENT *ThisTag;\r
- UINT16 EntryNumber;\r
-\r
- UINTN Row;\r
- UINTN Col;\r
- UINTN OptCol;\r
- CHAR16 *Description;\r
- UINTN Skip; // Number of lines\r
-\r
- //\r
- // Display item sequence for date/time\r
- // Date: Month/Day/Year\r
- // Sequence: 0 1 2\r
- //\r
- // Time: Hour : Minute : Second\r
- // Sequence: 0 1 2\r
- //\r
- //\r
- UINTN Sequence;\r
-\r
- BOOLEAN GrayOut;\r
- BOOLEAN ReadOnly;\r
-\r
- //\r
- // Whether user could change value of this item\r
- //\r
- BOOLEAN IsQuestion;\r
- BOOLEAN NestInStatement;\r
-} UI_MENU_OPTION;\r
-\r
-#define MENU_OPTION_FROM_LINK(a) CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)\r
-\r
-/**\r
- Print Question Value according to it's storage width and display attributes.\r
-\r
- @param Question The Question to be printed.\r
- @param FormattedNumber Buffer for output string.\r
- @param BufferSize The FormattedNumber buffer size in bytes.\r
-\r
- @retval EFI_SUCCESS Print success.\r
- @retval EFI_BUFFER_TOO_SMALL Buffer size is not enough for formatted number.\r
-\r
-**/\r
-EFI_STATUS\r
-PrintFormattedNumber (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Question,\r
- IN OUT CHAR16 *FormattedNumber,\r
- IN UINTN BufferSize\r
- );\r
-\r
-/**\r
- Set value of a data element in an Array by its Index.\r
-\r
- @param Array The data array.\r
- @param Type Type of the data in this array.\r
- @param Index Zero based index for data in this array.\r
- @param Value The value to be set.\r
-\r
-**/\r
-VOID\r
-SetArrayData (\r
- IN VOID *Array,\r
- IN UINT8 Type,\r
- IN UINTN Index,\r
- IN UINT64 Value\r
- );\r
-\r
-/**\r
- Return data element in an Array by its Index.\r
-\r
- @param Array The data array.\r
- @param Type Type of the data in this array.\r
- @param Index Zero based index for data in this array.\r
-\r
- @retval Value The data to be returned\r
-\r
-**/\r
-UINT64\r
-GetArrayData (\r
- IN VOID *Array,\r
- IN UINT8 Type,\r
- IN UINTN Index\r
- );\r
- \r
-/**\r
- Search an Option of a Question by its value.\r
-\r
- @param Question The Question\r
- @param OptionValue Value for Option to be searched.\r
-\r
- @retval Pointer Pointer to the found Option.\r
- @retval NULL Option not found.\r
-\r
-**/\r
-DISPLAY_QUESTION_OPTION *\r
-ValueToOption (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Question,\r
- IN EFI_HII_VALUE *OptionValue\r
- );\r
-\r
-/**\r
- Compare two Hii value.\r
-\r
- @param Value1 Expression value to compare on left-hand.\r
- @param Value2 Expression value to compare on right-hand.\r
- @param Result Return value after compare.\r
- retval 0 Two operators equal.\r
- return Positive value if Value1 is greater than Value2.\r
- retval Negative value if Value1 is less than Value2.\r
- @param HiiHandle Only required for string compare.\r
-\r
- @retval other Could not perform compare on two values.\r
- @retval EFI_SUCCESS Compare the value success.\r
-\r
-**/\r
-EFI_STATUS\r
-CompareHiiValue (\r
- IN EFI_HII_VALUE *Value1,\r
- IN EFI_HII_VALUE *Value2,\r
- OUT INTN *Result,\r
- IN EFI_HII_HANDLE HiiHandle OPTIONAL\r
- );\r
-\r
-/**\r
- Draw a pop up windows based on the dimension, number of lines and\r
- strings specified.\r
-\r
- @param RequestedWidth The width of the pop-up.\r
- @param NumberOfLines The number of lines.\r
- @param ... A series of text strings that displayed in the pop-up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CreateMultiStringPopUp (\r
- IN UINTN RequestedWidth,\r
- IN UINTN NumberOfLines,\r
- ...\r
- );\r
-\r
-/**\r
- Will copy LineWidth amount of a string in the OutputString buffer and return the\r
- number of CHAR16 characters that were copied into the OutputString buffer.\r
- The output string format is:\r
- Glyph Info + String info + '\0'.\r
-\r
- In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
- @param InputString String description for this option.\r
- @param LineWidth Width of the desired string to extract in CHAR16\r
- characters\r
- @param GlyphWidth The glyph width of the begin of the char in the string.\r
- @param Index Where in InputString to start the copy process\r
- @param OutputString Buffer to copy the string into\r
-\r
- @return Returns the number of CHAR16 characters that were copied into the OutputString \r
- buffer, include extra glyph info and '\0' info.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
- IN CHAR16 *InputString,\r
- IN UINT16 LineWidth,\r
- IN OUT UINT16 *GlyphWidth,\r
- IN OUT UINTN *Index,\r
- OUT CHAR16 **OutputString\r
- );\r
-\r
-\r
-/**\r
- Get the string based on the StringId and HII Package List Handle.\r
-\r
- @param Token The String's ID.\r
- @param HiiHandle The Hii handle for this string package.\r
-\r
- @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-GetToken (\r
- IN EFI_STRING_ID Token,\r
- IN EFI_HII_HANDLE HiiHandle\r
- );\r
- \r
-/**\r
- Count the storage space of a Unicode string.\r
-\r
- This function handles the Unicode string with NARROW_CHAR\r
- and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
- does not count in the resultant output. If a WIDE_CHAR is\r
- hit, then 2 Unicode character will consume an output storage\r
- space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
- If String is NULL, then ASSERT ().\r
-\r
- @param String The input string to be counted.\r
-\r
- @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-GetStringWidth (\r
- IN CHAR16 *String\r
- );\r
-\r
-/**\r
- This routine reads a numeric value from the user input.\r
-\r
- @param MenuOption Pointer to the current input menu.\r
-\r
- @retval EFI_SUCCESS If numerical input is read successfully\r
- @retval EFI_DEVICE_ERROR If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
- IN UI_MENU_OPTION *MenuOption\r
- );\r
-\r
-/**\r
- Get string or password input from user.\r
-\r
- @param MenuOption Pointer to the current input menu.\r
- @param Prompt The prompt string shown on popup window.\r
- @param StringPtr Old user input and destination for use input string.\r
-\r
- @retval EFI_SUCCESS If string input is read successfully\r
- @retval EFI_DEVICE_ERROR If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
- IN UI_MENU_OPTION *MenuOption,\r
- IN CHAR16 *Prompt,\r
- IN OUT CHAR16 *StringPtr\r
- );\r
-\r
-/**\r
- Draw a pop up windows based on the dimension, number of lines and\r
- strings specified.\r
-\r
- @param RequestedWidth The width of the pop-up.\r
- @param NumberOfLines The number of lines.\r
- @param Marker The variable argument list for the list of string to be printed.\r
-\r
-**/\r
-VOID\r
-CreateSharedPopUp (\r
- IN UINTN RequestedWidth,\r
- IN UINTN NumberOfLines,\r
- IN VA_LIST Marker\r
- );\r
- \r
-/**\r
- Wait for a key to be pressed by user.\r
-\r
- @param Key The key which is pressed by user.\r
-\r
- @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
- OUT EFI_INPUT_KEY *Key\r
- );\r
-\r
-/**\r
- Get selection for OneOf and OrderedList (Left/Right will be ignored).\r
-\r
- @param MenuOption Pointer to the current input menu.\r
-\r
- @retval EFI_SUCCESS If Option input is processed successfully\r
- @retval EFI_DEVICE_ERROR If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetSelectionInputPopUp (\r
- IN UI_MENU_OPTION *MenuOption\r
- );\r
-\r
-/**\r
- Process the help string: Split StringPtr to several lines of strings stored in\r
- FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.\r
-\r
- @param StringPtr The entire help string.\r
- @param FormattedString The oupput formatted string.\r
- @param EachLineWidth The max string length of each line in the formatted string.\r
- @param RowCount TRUE: if Question is selected.\r
-\r
-**/\r
-UINTN\r
-ProcessHelpString (\r
- IN CHAR16 *StringPtr,\r
- OUT CHAR16 **FormattedString,\r
- OUT UINT16 *EachLineWidth,\r
- IN UINTN RowCount\r
- );\r
-\r
-/**\r
- Process a Question's Option (whether selected or un-selected).\r
-\r
- @param MenuOption The MenuOption for this Question.\r
- @param Selected TRUE: if Question is selected.\r
- @param OptionString Pointer of the Option String to be displayed.\r
- @param SkipErrorValue Whether need to return when value without option for it.\r
-\r
- @retval EFI_SUCCESS Question Option process success.\r
- @retval Other Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessOptions (\r
- IN UI_MENU_OPTION *MenuOption,\r
- IN BOOLEAN Selected,\r
- OUT CHAR16 **OptionString,\r
- IN BOOLEAN SkipErrorValue\r
- );\r
-\r
-/**\r
- Set Buffer to Value for Size bytes.\r
-\r
- @param Buffer Memory to set.\r
- @param Size Number of bytes to set\r
- @param Value Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
- IN VOID *Buffer,\r
- IN UINTN Size,\r
- IN CHAR16 Value\r
- );\r
-\r
-/**\r
- Display one form, and return user input.\r
- \r
- @param FormData Form Data to be shown.\r
- @param UserInputData User input data.\r
- \r
- @retval EFI_SUCCESS Form Data is shown, and user input is got.\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-FormDisplay (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
- OUT USER_INPUT *UserInputData\r
- );\r
-\r
-/**\r
- Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-DriverClearDisplayPage (\r
- VOID\r
- );\r
-\r
-/**\r
- Exit Display and Clear Screen to the original state.\r
-\r
-**/\r
-VOID\r
-EFIAPI \r
-ExitDisplay (\r
- VOID\r
- );\r
-\r
-/**\r
- Process validate for one question.\r
-\r
- @param Question The question which need to validate.\r
-\r
- @retval EFI_SUCCESS Question Option process success.\r
- @retval Other Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS \r
-ValidateQuestion (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Question\r
- );\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
-Implementation for handling user input from the User Interfaces.\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "FormDisplay.h"\r
-\r
-/**\r
- Get maximum and minimum info from this opcode.\r
-\r
- @param OpCode Pointer to the current input opcode.\r
- @param Minimum The minimum size info for this opcode.\r
- @param Maximum The maximum size info for this opcode.\r
-\r
-**/\r
-VOID\r
-GetFieldFromOp (\r
- IN EFI_IFR_OP_HEADER *OpCode,\r
- OUT UINTN *Minimum,\r
- OUT UINTN *Maximum\r
- )\r
-{\r
- EFI_IFR_STRING *StringOp;\r
- EFI_IFR_PASSWORD *PasswordOp;\r
- if (OpCode->OpCode == EFI_IFR_STRING_OP) {\r
- StringOp = (EFI_IFR_STRING *) OpCode;\r
- *Minimum = StringOp->MinSize;\r
- *Maximum = StringOp->MaxSize; \r
- } else if (OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
- PasswordOp = (EFI_IFR_PASSWORD *) OpCode;\r
- *Minimum = PasswordOp->MinSize;\r
- *Maximum = PasswordOp->MaxSize; \r
- } else {\r
- *Minimum = 0;\r
- *Maximum = 0; \r
- }\r
-}\r
-\r
-/**\r
- Get string or password input from user.\r
-\r
- @param MenuOption Pointer to the current input menu.\r
- @param Prompt The prompt string shown on popup window.\r
- @param StringPtr Old user input and destination for use input string.\r
-\r
- @retval EFI_SUCCESS If string input is read successfully\r
- @retval EFI_DEVICE_ERROR If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
- IN UI_MENU_OPTION *MenuOption,\r
- IN CHAR16 *Prompt,\r
- IN OUT CHAR16 *StringPtr\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY Key;\r
- CHAR16 NullCharacter;\r
- UINTN ScreenSize;\r
- CHAR16 Space[2];\r
- CHAR16 KeyPad[2];\r
- CHAR16 *TempString;\r
- CHAR16 *BufferedString;\r
- UINTN Index;\r
- UINTN Index2;\r
- UINTN Count;\r
- UINTN Start;\r
- UINTN Top;\r
- UINTN DimensionsWidth;\r
- UINTN DimensionsHeight;\r
- UINTN CurrentCursor;\r
- BOOLEAN CursorVisible;\r
- UINTN Minimum;\r
- UINTN Maximum;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Question;\r
- BOOLEAN IsPassword;\r
-\r
- DimensionsWidth = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn;\r
- DimensionsHeight = gStatementDimensions.BottomRow - gStatementDimensions.TopRow;\r
-\r
- NullCharacter = CHAR_NULL;\r
- ScreenSize = GetStringWidth (Prompt) / sizeof (CHAR16);\r
- Space[0] = L' ';\r
- Space[1] = CHAR_NULL;\r
-\r
- Question = MenuOption->ThisTag;\r
- GetFieldFromOp(Question->OpCode, &Minimum, &Maximum);\r
-\r
- if (Question->OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
- IsPassword = TRUE;\r
- } else {\r
- IsPassword = FALSE;\r
- }\r
-\r
- TempString = AllocateZeroPool ((Maximum + 1)* sizeof (CHAR16));\r
- ASSERT (TempString);\r
-\r
- if (ScreenSize < (Maximum + 1)) {\r
- ScreenSize = Maximum + 1;\r
- }\r
-\r
- if ((ScreenSize + 2) > DimensionsWidth) {\r
- ScreenSize = DimensionsWidth - 2;\r
- }\r
-\r
- BufferedString = AllocateZeroPool (ScreenSize * 2);\r
- ASSERT (BufferedString);\r
-\r
- Start = (DimensionsWidth - ScreenSize - 2) / 2 + gStatementDimensions.LeftColumn + 1;\r
- Top = ((DimensionsHeight - 6) / 2) + gStatementDimensions.TopRow - 1;\r
-\r
- //\r
- // Display prompt for string\r
- //\r
- // CreateDialog (NULL, "", Prompt, Space, "", NULL);\r
- CreateMultiStringPopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
-\r
- CursorVisible = gST->ConOut->Mode->CursorVisible;\r
- gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-\r
- CurrentCursor = GetStringWidth (StringPtr) / 2 - 1;\r
- if (CurrentCursor != 0) {\r
- //\r
- // Show the string which has beed saved before.\r
- //\r
- SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
- PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
- if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
- Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
- } else {\r
- Index = 0;\r
- }\r
-\r
- if (IsPassword) {\r
- gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
- }\r
-\r
- for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
- BufferedString[Count] = StringPtr[Index];\r
-\r
- if (IsPassword) {\r
- PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
- }\r
- }\r
-\r
- if (!IsPassword) {\r
- PrintStringAt (Start + 1, Top + 3, BufferedString);\r
- }\r
- \r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->SetCursorPosition (gST->ConOut, Start + GetStringWidth (StringPtr) / 2, Top + 3);\r
- }\r
- \r
- do {\r
- Status = WaitForKeyStroke (&Key);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
- switch (Key.UnicodeChar) {\r
- case CHAR_NULL:\r
- switch (Key.ScanCode) {\r
- case SCAN_LEFT:\r
- if (CurrentCursor > 0) {\r
- CurrentCursor--;\r
- }\r
- break;\r
-\r
- case SCAN_RIGHT:\r
- if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {\r
- CurrentCursor++;\r
- }\r
- break;\r
-\r
- case SCAN_ESC:\r
- FreePool (TempString);\r
- FreePool (BufferedString);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
- return EFI_DEVICE_ERROR;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- break;\r
-\r
- case CHAR_CARRIAGE_RETURN:\r
- if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {\r
-\r
- FreePool (TempString);\r
- FreePool (BufferedString);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // Simply create a popup to tell the user that they had typed in too few characters.\r
- // To save code space, we can then treat this as an error and return back to the menu.\r
- //\r
- do {\r
- CreateDialog (&Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter, NULL);\r
- } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
- FreePool (TempString);\r
- FreePool (BufferedString);\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- break;\r
-\r
- case CHAR_BACKSPACE:\r
- if (StringPtr[0] != CHAR_NULL && CurrentCursor != 0) {\r
- for (Index = 0; Index < CurrentCursor - 1; Index++) {\r
- TempString[Index] = StringPtr[Index];\r
- }\r
- Count = GetStringWidth (StringPtr) / 2 - 1;\r
- if (Count >= CurrentCursor) {\r
- for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {\r
- TempString[Index] = StringPtr[Index2];\r
- }\r
- TempString[Index] = CHAR_NULL;\r
- }\r
- //\r
- // Effectively truncate string by 1 character\r
- //\r
- StrCpy (StringPtr, TempString);\r
- CurrentCursor --;\r
- }\r
-\r
- default:\r
- //\r
- // If it is the beginning of the string, don't worry about checking maximum limits\r
- //\r
- if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
- StrnCpy (StringPtr, &Key.UnicodeChar, 1);\r
- CurrentCursor++;\r
- } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
- KeyPad[0] = Key.UnicodeChar;\r
- KeyPad[1] = CHAR_NULL;\r
- Count = GetStringWidth (StringPtr) / 2 - 1;\r
- if (CurrentCursor < Count) {\r
- for (Index = 0; Index < CurrentCursor; Index++) {\r
- TempString[Index] = StringPtr[Index];\r
- }\r
- TempString[Index] = CHAR_NULL;\r
- StrCat (TempString, KeyPad);\r
- StrCat (TempString, StringPtr + CurrentCursor);\r
- StrCpy (StringPtr, TempString);\r
- } else {\r
- StrCat (StringPtr, KeyPad);\r
- }\r
- CurrentCursor++;\r
- }\r
-\r
- //\r
- // If the width of the input string is now larger than the screen, we nee to\r
- // adjust the index to start printing portions of the string\r
- //\r
- SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
- PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
- if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
- Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
- } else {\r
- Index = 0;\r
- }\r
-\r
- if (IsPassword) {\r
- gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
- }\r
-\r
- for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
- BufferedString[Count] = StringPtr[Index];\r
-\r
- if (IsPassword) {\r
- PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
- }\r
- }\r
-\r
- if (!IsPassword) {\r
- PrintStringAt (Start + 1, Top + 3, BufferedString);\r
- }\r
- break;\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
- gST->ConOut->SetCursorPosition (gST->ConOut, Start + CurrentCursor + 1, Top + 3);\r
- } while (TRUE);\r
-\r
-}\r
-\r
-/**\r
- Adjust the value to the correct one. Rules follow the sample:\r
- like: Year change: 2012.02.29 -> 2013.02.29 -> 2013.02.01\r
- Month change: 2013.03.29 -> 2013.02.29 -> 2013.02.28\r
-\r
- @param QuestionValue Pointer to current question.\r
- @param Sequence The sequence of the field in the question.\r
-**/\r
-VOID\r
-AdjustQuestionValue (\r
- IN EFI_HII_VALUE *QuestionValue,\r
- IN UINT8 Sequence\r
- )\r
-{\r
- UINT8 Month;\r
- UINT16 Year;\r
- UINT8 Maximum;\r
- UINT8 Minimum;\r
-\r
- Month = QuestionValue->Value.date.Month;\r
- Year = QuestionValue->Value.date.Year;\r
- Minimum = 1;\r
-\r
- switch (Month) {\r
- case 2:\r
- if ((Year % 4) == 0 && ((Year % 100) != 0 || (Year % 400) == 0)) {\r
- Maximum = 29;\r
- } else {\r
- Maximum = 28;\r
- }\r
- break;\r
- case 4:\r
- case 6:\r
- case 9:\r
- case 11:\r
- Maximum = 30;\r
- break;\r
- default:\r
- Maximum = 31;\r
- break;\r
- }\r
-\r
- //\r
- // Change the month area.\r
- //\r
- if (Sequence == 0) {\r
- if (QuestionValue->Value.date.Day > Maximum) {\r
- QuestionValue->Value.date.Day = Maximum;\r
- }\r
- }\r
- \r
- //\r
- // Change the Year area.\r
- //\r
- if (Sequence == 2) {\r
- if (QuestionValue->Value.date.Day > Maximum) {\r
- QuestionValue->Value.date.Day = Minimum;\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Get field info from numeric opcode.\r
-\r
- @param OpCode Pointer to the current input opcode.\r
- @param Minimum The minimum size info for this opcode.\r
- @param Maximum The maximum size info for this opcode.\r
- @param Step The step size info for this opcode.\r
- @param StorageWidth The storage width info for this opcode.\r
-\r
-**/\r
-VOID\r
-GetValueFromNum (\r
- IN EFI_IFR_OP_HEADER *OpCode,\r
- OUT UINT64 *Minimum,\r
- OUT UINT64 *Maximum,\r
- OUT UINT64 *Step,\r
- OUT UINT16 *StorageWidth\r
-)\r
-{\r
- EFI_IFR_NUMERIC *NumericOp;\r
-\r
- NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
- \r
- switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
- case EFI_IFR_NUMERIC_SIZE_1:\r
- *Minimum = NumericOp->data.u8.MinValue;\r
- *Maximum = NumericOp->data.u8.MaxValue;\r
- *Step = NumericOp->data.u8.Step;\r
- *StorageWidth = (UINT16) sizeof (UINT8);\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_2:\r
- *Minimum = NumericOp->data.u16.MinValue;\r
- *Maximum = NumericOp->data.u16.MaxValue;\r
- *Step = NumericOp->data.u16.Step;\r
- *StorageWidth = (UINT16) sizeof (UINT16);\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_4:\r
- *Minimum = NumericOp->data.u32.MinValue;\r
- *Maximum = NumericOp->data.u32.MaxValue;\r
- *Step = NumericOp->data.u32.Step;\r
- *StorageWidth = (UINT16) sizeof (UINT32);\r
- break;\r
- \r
- case EFI_IFR_NUMERIC_SIZE_8:\r
- *Minimum = NumericOp->data.u64.MinValue;\r
- *Maximum = NumericOp->data.u64.MaxValue;\r
- *Step = NumericOp->data.u64.Step;\r
- *StorageWidth = (UINT16) sizeof (UINT64);\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
-\r
- if (*Maximum == 0) {\r
- *Maximum = (UINT64) -1;\r
- }\r
-}\r
-\r
-/**\r
- This routine reads a numeric value from the user input.\r
-\r
- @param MenuOption Pointer to the current input menu.\r
-\r
- @retval EFI_SUCCESS If numerical input is read successfully\r
- @retval EFI_DEVICE_ERROR If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
- IN UI_MENU_OPTION *MenuOption\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Column;\r
- UINTN Row;\r
- CHAR16 InputText[MAX_NUMERIC_INPUT_WIDTH];\r
- CHAR16 FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];\r
- UINT64 PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];\r
- UINTN Count;\r
- UINTN Loop;\r
- BOOLEAN ManualInput;\r
- BOOLEAN HexInput;\r
- BOOLEAN DateOrTime;\r
- UINTN InputWidth;\r
- UINT64 EditValue;\r
- UINT64 Step;\r
- UINT64 Minimum;\r
- UINT64 Maximum;\r
- UINTN EraseLen;\r
- UINT8 Digital;\r
- EFI_INPUT_KEY Key;\r
- EFI_HII_VALUE *QuestionValue;\r
- FORM_DISPLAY_ENGINE_STATEMENT *Question;\r
- EFI_IFR_NUMERIC *NumericOp;\r
- UINT16 StorageWidth;\r
-\r
- Column = MenuOption->OptCol;\r
- Row = MenuOption->Row;\r
- PreviousNumber[0] = 0;\r
- Count = 0;\r
- InputWidth = 0;\r
- Digital = 0;\r
- StorageWidth = 0;\r
- Minimum = 0;\r
- Maximum = 0;\r
- NumericOp = NULL;\r
-\r
- Question = MenuOption->ThisTag;\r
- QuestionValue = &Question->CurrentValue;\r
-\r
- //\r
- // Only two case, user can enter to this function: Enter and +/- case.\r
- // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT\r
- //\r
- ManualInput = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
-\r
- if ((Question->OpCode->OpCode == EFI_IFR_DATE_OP) || (Question->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- DateOrTime = TRUE;\r
- } else {\r
- DateOrTime = FALSE;\r
- }\r
-\r
- //\r
- // Prepare Value to be edit\r
- //\r
- EraseLen = 0;\r
- EditValue = 0;\r
- if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- Step = 1;\r
- Minimum = 1;\r
-\r
- switch (MenuOption->Sequence) {\r
- case 0:\r
- Maximum = 12;\r
- EraseLen = 4;\r
- EditValue = QuestionValue->Value.date.Month;\r
- break;\r
-\r
- case 1:\r
- switch (QuestionValue->Value.date.Month) {\r
- case 2:\r
- if ((QuestionValue->Value.date.Year % 4) == 0 && \r
- ((QuestionValue->Value.date.Year % 100) != 0 || \r
- (QuestionValue->Value.date.Year % 400) == 0)) {\r
- Maximum = 29;\r
- } else {\r
- Maximum = 28;\r
- }\r
- break;\r
- case 4:\r
- case 6:\r
- case 9:\r
- case 11:\r
- Maximum = 30;\r
- break;\r
- default:\r
- Maximum = 31;\r
- break;\r
- } \r
-\r
- EraseLen = 3;\r
- EditValue = QuestionValue->Value.date.Day;\r
- break;\r
-\r
- case 2:\r
- Maximum = 0xffff;\r
- EraseLen = 5;\r
- EditValue = QuestionValue->Value.date.Year;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- Step = 1;\r
- Minimum = 0;\r
-\r
- switch (MenuOption->Sequence) {\r
- case 0:\r
- Maximum = 23;\r
- EraseLen = 4;\r
- EditValue = QuestionValue->Value.time.Hour;\r
- break;\r
-\r
- case 1:\r
- Maximum = 59;\r
- EraseLen = 3;\r
- EditValue = QuestionValue->Value.time.Minute;\r
- break;\r
-\r
- case 2:\r
- Maximum = 59;\r
- EraseLen = 3;\r
- EditValue = QuestionValue->Value.time.Second;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- } else {\r
- ASSERT (Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP);\r
- NumericOp = (EFI_IFR_NUMERIC *) Question->OpCode;\r
- GetValueFromNum(Question->OpCode, &Minimum, &Maximum, &Step, &StorageWidth);\r
- EditValue = QuestionValue->Value.u64;\r
- EraseLen = gOptionBlockWidth;\r
- }\r
-\r
- if ((Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (NumericOp != NULL) &&\r
- ((NumericOp->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX)) {\r
- HexInput = TRUE;\r
- } else {\r
- HexInput = FALSE;\r
- }\r
-\r
- //\r
- // Enter from "Enter" input, clear the old word showing.\r
- //\r
- if (ManualInput) {\r
- if (Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP) {\r
- if (HexInput) {\r
- InputWidth = StorageWidth * 2;\r
- } else {\r
- switch (StorageWidth) {\r
- case 1:\r
- InputWidth = 3;\r
- break;\r
-\r
- case 2:\r
- InputWidth = 5;\r
- break;\r
-\r
- case 4:\r
- InputWidth = 10;\r
- break;\r
-\r
- case 8:\r
- InputWidth = 20;\r
- break;\r
-\r
- default:\r
- InputWidth = 0;\r
- break;\r
- }\r
- }\r
-\r
- InputText[0] = LEFT_NUMERIC_DELIMITER;\r
- SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
- ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH);\r
- InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
- InputText[InputWidth + 2] = L'\0';\r
-\r
- PrintStringAt (Column, Row, InputText);\r
- Column++;\r
- }\r
-\r
- if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- if (MenuOption->Sequence == 2) {\r
- InputWidth = 4;\r
- } else {\r
- InputWidth = 2;\r
- }\r
-\r
- if (MenuOption->Sequence == 0) {\r
- InputText[0] = LEFT_NUMERIC_DELIMITER;\r
- SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
- } else {\r
- SetUnicodeMem (InputText, InputWidth, L' ');\r
- }\r
-\r
- if (MenuOption->Sequence == 2) {\r
- InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
- } else {\r
- InputText[InputWidth + 1] = DATE_SEPARATOR;\r
- }\r
- InputText[InputWidth + 2] = L'\0';\r
-\r
- PrintStringAt (Column, Row, InputText);\r
- if (MenuOption->Sequence == 0) {\r
- Column++;\r
- }\r
- }\r
-\r
- if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- InputWidth = 2;\r
-\r
- if (MenuOption->Sequence == 0) {\r
- InputText[0] = LEFT_NUMERIC_DELIMITER;\r
- SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
- } else {\r
- SetUnicodeMem (InputText, InputWidth, L' ');\r
- }\r
-\r
- if (MenuOption->Sequence == 2) {\r
- InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
- } else {\r
- InputText[InputWidth + 1] = TIME_SEPARATOR;\r
- }\r
- InputText[InputWidth + 2] = L'\0';\r
-\r
- PrintStringAt (Column, Row, InputText);\r
- if (MenuOption->Sequence == 0) {\r
- Column++;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // First time we enter this handler, we need to check to see if\r
- // we were passed an increment or decrement directive\r
- //\r
- do {\r
- Key.UnicodeChar = CHAR_NULL;\r
- if (gDirection != 0) {\r
- Key.ScanCode = gDirection;\r
- gDirection = 0;\r
- goto TheKey2;\r
- }\r
-\r
- Status = WaitForKeyStroke (&Key);\r
-\r
-TheKey2:\r
- switch (Key.UnicodeChar) {\r
-\r
- case '+':\r
- case '-':\r
- if (Key.UnicodeChar == '+') {\r
- Key.ScanCode = SCAN_RIGHT;\r
- } else {\r
- Key.ScanCode = SCAN_LEFT;\r
- }\r
- Key.UnicodeChar = CHAR_NULL;\r
- goto TheKey2;\r
-\r
- case CHAR_NULL:\r
- switch (Key.ScanCode) {\r
- case SCAN_LEFT:\r
- case SCAN_RIGHT:\r
- if (DateOrTime && !ManualInput) {\r
- //\r
- // By setting this value, we will return back to the caller.\r
- // We need to do this since an auto-refresh will destroy the adjustment\r
- // based on what the real-time-clock is showing. So we always commit\r
- // upon changing the value.\r
- //\r
- gDirection = SCAN_DOWN;\r
- }\r
-\r
- if ((Step != 0) && !ManualInput) {\r
- if (Key.ScanCode == SCAN_LEFT) {\r
- if (EditValue >= Minimum + Step) {\r
- EditValue = EditValue - Step;\r
- } else if (EditValue > Minimum){\r
- EditValue = Minimum;\r
- } else {\r
- EditValue = Maximum;\r
- }\r
- } else if (Key.ScanCode == SCAN_RIGHT) {\r
- if (EditValue + Step <= Maximum) {\r
- EditValue = EditValue + Step;\r
- } else if (EditValue < Maximum) {\r
- EditValue = Maximum;\r
- } else {\r
- EditValue = Minimum;\r
- }\r
- }\r
-\r
- ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
- if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
- if (MenuOption->Sequence == 2) {\r
- //\r
- // Year\r
- //\r
- UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);\r
- } else {\r
- //\r
- // Month/Day\r
- //\r
- UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
- }\r
-\r
- if (MenuOption->Sequence == 0) {\r
- ASSERT (EraseLen >= 2);\r
- FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
- } else if (MenuOption->Sequence == 1) {\r
- ASSERT (EraseLen >= 1);\r
- FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
- }\r
- } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-\r
- if (MenuOption->Sequence == 0) {\r
- ASSERT (EraseLen >= 2);\r
- FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
- } else if (MenuOption->Sequence == 1) {\r
- ASSERT (EraseLen >= 1);\r
- FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
- }\r
- } else {\r
- QuestionValue->Value.u64 = EditValue;\r
- PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
- }\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
- for (Loop = 0; Loop < EraseLen; Loop++) {\r
- PrintStringAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
- }\r
- gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
-\r
- if (MenuOption->Sequence == 0) {\r
- PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
- Column = MenuOption->OptCol + 1;\r
- }\r
-\r
- PrintStringAt (Column, Row, FormattedNumber);\r
-\r
- if (!DateOrTime || MenuOption->Sequence == 2) {\r
- PrintCharAt ((UINTN)-1, (UINTN)-1, RIGHT_NUMERIC_DELIMITER);\r
- }\r
- }\r
-\r
- goto EnterCarriageReturn;\r
- break;\r
-\r
- case SCAN_UP:\r
- case SCAN_DOWN:\r
- goto EnterCarriageReturn;\r
-\r
- case SCAN_ESC:\r
- return EFI_DEVICE_ERROR;\r
-\r<