]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h
MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe: Add support for PCD PcdPteMemoryEn...
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / FormDisplay.h
1 /** @file
2 FormDiplay protocol to show Form
3
4 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef __FORM_DISPLAY_H__
16 #define __FORM_DISPLAY_H__
17
18
19 #include <Library/UefiBootServicesTableLib.h>
20 #include <Library/DebugLib.h>
21 #include <Library/BaseMemoryLib.h>
22 #include <Library/BaseLib.h>
23 #include <Library/HiiLib.h>
24 #include <Library/MemoryAllocationLib.h>
25 #include <Library/PrintLib.h>
26 #include <Library/CustomizedDisplayLib.h>
27
28 #include <Protocol/FormBrowserEx2.h>
29 #include <Protocol/SimpleTextIn.h>
30 #include <Protocol/DisplayProtocol.h>
31
32 #include <Guid/MdeModuleHii.h>
33
34 //
35 // This is the generated header file which includes whatever needs to be exported (strings + IFR)
36 //
37 extern UINT8 DisplayEngineStrings[];
38 extern EFI_SCREEN_DESCRIPTOR gStatementDimensions;
39 extern USER_INPUT *gUserInput;
40 extern FORM_DISPLAY_ENGINE_FORM *gFormData;
41 extern EFI_HII_HANDLE gHiiHandle;
42 extern UINT16 gDirection;
43 extern LIST_ENTRY gMenuOption;
44
45 //
46 // Browser Global Strings
47 //
48 extern CHAR16 *gSaveFailed;
49 extern CHAR16 *gPromptForData;
50 extern CHAR16 *gPromptForPassword;
51 extern CHAR16 *gPromptForNewPassword;
52 extern CHAR16 *gConfirmPassword;
53 extern CHAR16 *gConfirmError;
54 extern CHAR16 *gPassowordInvalid;
55 extern CHAR16 *gPressEnter;
56 extern CHAR16 *gEmptyString;
57 extern CHAR16 *gMiniString;
58 extern CHAR16 *gOptionMismatch;
59 extern CHAR16 *gFormSuppress;
60 extern CHAR16 *gProtocolNotFound;
61 extern CHAR16 *gPasswordUnsupported;
62
63 extern CHAR16 gPromptBlockWidth;
64 extern CHAR16 gOptionBlockWidth;
65 extern CHAR16 gHelpBlockWidth;
66 extern CHAR16 *mUnknownString;
67 extern BOOLEAN gMisMatch;
68
69 //
70 // Screen definitions
71 //
72
73 #define LEFT_SKIPPED_COLUMNS 3
74 #define SCROLL_ARROW_HEIGHT 1
75 #define POPUP_PAD_SPACE_COUNT 5
76 #define POPUP_FRAME_WIDTH 2
77
78 #define UPPER_LOWER_CASE_OFFSET 0x20
79
80 //
81 // Display definitions
82 //
83 #define LEFT_ONEOF_DELIMITER L'<'
84 #define RIGHT_ONEOF_DELIMITER L'>'
85
86 #define LEFT_NUMERIC_DELIMITER L'['
87 #define RIGHT_NUMERIC_DELIMITER L']'
88
89 #define LEFT_CHECKBOX_DELIMITER L'['
90 #define RIGHT_CHECKBOX_DELIMITER L']'
91
92 #define CHECK_ON L'X'
93 #define CHECK_OFF L' '
94
95 #define TIME_SEPARATOR L':'
96 #define DATE_SEPARATOR L'/'
97
98 #define SUBTITLE_INDENT 2
99
100 //
101 // This is the Input Error Message
102 //
103 #define INPUT_ERROR 1
104
105 //
106 // This is the NV RAM update required Message
107 //
108 #define NV_UPDATE_REQUIRED 2
109 //
110 // Time definitions
111 //
112 #define ONE_SECOND 10000000
113
114 //
115 // It take 23 characters including the NULL to print a 64 bits number with "[" and "]".
116 // pow(2, 64) = [18446744073709551616]
117 // with extra '-' flat, set the width to 24.
118 //
119 #define MAX_NUMERIC_INPUT_WIDTH 24
120
121 #define EFI_HII_EXPRESSION_INCONSISTENT_IF 0
122 #define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1
123 #define EFI_HII_EXPRESSION_GRAY_OUT_IF 2
124 #define EFI_HII_EXPRESSION_SUPPRESS_IF 3
125 #define EFI_HII_EXPRESSION_DISABLE_IF 4
126
127 //
128 // Character definitions
129 //
130 #define CHAR_SPACE 0x0020
131
132 #define FORM_DISPLAY_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'D', 'D', 'V')
133 typedef struct {
134 UINT32 Signature;
135
136 EFI_HANDLE Handle;
137
138 //
139 // Produced protocol
140 //
141 EDKII_FORM_DISPLAY_ENGINE_PROTOCOL FromDisplayProt;
142 } FORM_DISPLAY_DRIVER_PRIVATE_DATA;
143
144
145 typedef enum {
146 UiNoOperation,
147 UiSelect,
148 UiUp,
149 UiDown,
150 UiLeft,
151 UiRight,
152 UiReset,
153 UiPrevious,
154 UiPageUp,
155 UiPageDown,
156 UiHotKey,
157 UiMaxOperation
158 } UI_SCREEN_OPERATION;
159
160 typedef enum {
161 CfInitialization,
162 CfCheckSelection,
163 CfRepaint,
164 CfRefreshHighLight,
165 CfUpdateHelpString,
166 CfPrepareToReadKey,
167 CfReadKey,
168 CfScreenOperation,
169 CfUiSelect,
170 CfUiReset,
171 CfUiLeft,
172 CfUiRight,
173 CfUiUp,
174 CfUiPageUp,
175 CfUiPageDown,
176 CfUiDown,
177 CfUiNoOperation,
178 CfExit,
179 CfUiHotKey,
180 CfMaxControlFlag
181 } UI_CONTROL_FLAG;
182
183 typedef enum {
184 UIEventNone,
185 UIEventKey,
186 UIEventTimeOut,
187 UIEventDriver
188 } UI_EVENT_TYPE;
189
190 typedef struct {
191 UINT16 ScanCode;
192 UI_SCREEN_OPERATION ScreenOperation;
193 } SCAN_CODE_TO_SCREEN_OPERATION;
194
195 typedef struct {
196 UI_SCREEN_OPERATION ScreenOperation;
197 UI_CONTROL_FLAG ControlFlag;
198 } SCREEN_OPERATION_T0_CONTROL_FLAG;
199
200 typedef struct {
201 EFI_HII_HANDLE HiiHandle;
202 UINT16 FormId;
203
204 //
205 // Info for the highlight question.
206 // HLT means highlight
207 //
208 // If one statement has questionid, save questionid info to find the question.
209 // If one statement not has questionid info, save the opcode info to find the
210 // statement. If more than one statement has same opcode in one form(just like
211 // empty subtitle info may has more than one info one form), also use Index
212 // info to find the statement.
213 //
214 EFI_QUESTION_ID HLTQuestionId;
215 EFI_IFR_OP_HEADER *HLTOpCode;
216 UINTN HLTIndex;
217 UINTN HLTSequence;
218
219 //
220 // Info for the top of screen question.
221 // TOS means Top Of Screen
222 //
223 EFI_QUESTION_ID TOSQuestionId;
224 EFI_IFR_OP_HEADER *TOSOpCode;
225 UINTN TOSIndex;
226
227 UINT16 SkipValue;
228 } DISPLAY_HIGHLIGHT_MENU_INFO;
229
230 typedef struct {
231 EFI_EVENT SyncEvent;
232 UINT8 *TimeOut;
233 CHAR16 *ErrorInfo;
234 } WARNING_IF_CONTEXT;
235
236 #define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')
237
238 typedef struct {
239 UINTN Signature;
240 LIST_ENTRY Link;
241
242 EFI_HII_HANDLE Handle;
243 FORM_DISPLAY_ENGINE_STATEMENT *ThisTag;
244 UINT16 EntryNumber;
245
246 UINTN Row;
247 UINTN Col;
248 UINTN OptCol;
249 CHAR16 *Description;
250 UINTN Skip; // Number of lines
251
252 //
253 // Display item sequence for date/time
254 // Date: Month/Day/Year
255 // Sequence: 0 1 2
256 //
257 // Time: Hour : Minute : Second
258 // Sequence: 0 1 2
259 //
260 //
261 UINTN Sequence;
262
263 BOOLEAN GrayOut;
264 BOOLEAN ReadOnly;
265
266 //
267 // Whether user could change value of this item
268 //
269 BOOLEAN IsQuestion;
270 BOOLEAN NestInStatement;
271 } UI_MENU_OPTION;
272
273 #define MENU_OPTION_FROM_LINK(a) CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)
274
275 /**
276 Print Question Value according to it's storage width and display attributes.
277
278 @param Question The Question to be printed.
279 @param FormattedNumber Buffer for output string.
280 @param BufferSize The FormattedNumber buffer size in bytes.
281
282 @retval EFI_SUCCESS Print success.
283 @retval EFI_BUFFER_TOO_SMALL Buffer size is not enough for formatted number.
284
285 **/
286 EFI_STATUS
287 PrintFormattedNumber (
288 IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
289 IN OUT CHAR16 *FormattedNumber,
290 IN UINTN BufferSize
291 );
292
293 /**
294 Set value of a data element in an Array by its Index.
295
296 @param Array The data array.
297 @param Type Type of the data in this array.
298 @param Index Zero based index for data in this array.
299 @param Value The value to be set.
300
301 **/
302 VOID
303 SetArrayData (
304 IN VOID *Array,
305 IN UINT8 Type,
306 IN UINTN Index,
307 IN UINT64 Value
308 );
309
310 /**
311 Return data element in an Array by its Index.
312
313 @param Array The data array.
314 @param Type Type of the data in this array.
315 @param Index Zero based index for data in this array.
316
317 @retval Value The data to be returned
318
319 **/
320 UINT64
321 GetArrayData (
322 IN VOID *Array,
323 IN UINT8 Type,
324 IN UINTN Index
325 );
326
327 /**
328 Search an Option of a Question by its value.
329
330 @param Question The Question
331 @param OptionValue Value for Option to be searched.
332
333 @retval Pointer Pointer to the found Option.
334 @retval NULL Option not found.
335
336 **/
337 DISPLAY_QUESTION_OPTION *
338 ValueToOption (
339 IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
340 IN EFI_HII_VALUE *OptionValue
341 );
342
343 /**
344 Compare two Hii value.
345
346 @param Value1 Expression value to compare on left-hand.
347 @param Value2 Expression value to compare on right-hand.
348 @param Result Return value after compare.
349 retval 0 Two operators equal.
350 return Positive value if Value1 is greater than Value2.
351 retval Negative value if Value1 is less than Value2.
352 @param HiiHandle Only required for string compare.
353
354 @retval other Could not perform compare on two values.
355 @retval EFI_SUCCESS Compare the value success.
356
357 **/
358 EFI_STATUS
359 CompareHiiValue (
360 IN EFI_HII_VALUE *Value1,
361 IN EFI_HII_VALUE *Value2,
362 OUT INTN *Result,
363 IN EFI_HII_HANDLE HiiHandle OPTIONAL
364 );
365
366 /**
367 Draw a pop up windows based on the dimension, number of lines and
368 strings specified.
369
370 @param RequestedWidth The width of the pop-up.
371 @param NumberOfLines The number of lines.
372 @param ... A series of text strings that displayed in the pop-up.
373
374 **/
375 VOID
376 EFIAPI
377 CreateMultiStringPopUp (
378 IN UINTN RequestedWidth,
379 IN UINTN NumberOfLines,
380 ...
381 );
382
383 /**
384 Will copy LineWidth amount of a string in the OutputString buffer and return the
385 number of CHAR16 characters that were copied into the OutputString buffer.
386 The output string format is:
387 Glyph Info + String info + '\0'.
388
389 In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
390
391 @param InputString String description for this option.
392 @param LineWidth Width of the desired string to extract in CHAR16
393 characters
394 @param GlyphWidth The glyph width of the begin of the char in the string.
395 @param Index Where in InputString to start the copy process
396 @param OutputString Buffer to copy the string into
397
398 @return Returns the number of CHAR16 characters that were copied into the OutputString
399 buffer, include extra glyph info and '\0' info.
400
401 **/
402 UINT16
403 GetLineByWidth (
404 IN CHAR16 *InputString,
405 IN UINT16 LineWidth,
406 IN OUT UINT16 *GlyphWidth,
407 IN OUT UINTN *Index,
408 OUT CHAR16 **OutputString
409 );
410
411
412 /**
413 Get the string based on the StringId and HII Package List Handle.
414
415 @param Token The String's ID.
416 @param HiiHandle The Hii handle for this string package.
417
418 @return The output string.
419
420 **/
421 CHAR16 *
422 GetToken (
423 IN EFI_STRING_ID Token,
424 IN EFI_HII_HANDLE HiiHandle
425 );
426
427 /**
428 Count the storage space of a Unicode string.
429
430 This function handles the Unicode string with NARROW_CHAR
431 and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR
432 does not count in the resultant output. If a WIDE_CHAR is
433 hit, then 2 Unicode character will consume an output storage
434 space with size of CHAR16 till a NARROW_CHAR is hit.
435
436 If String is NULL, then ASSERT ().
437
438 @param String The input string to be counted.
439
440 @return Storage space for the input string.
441
442 **/
443 UINTN
444 GetStringWidth (
445 IN CHAR16 *String
446 );
447
448 /**
449 This routine reads a numeric value from the user input.
450
451 @param MenuOption Pointer to the current input menu.
452
453 @retval EFI_SUCCESS If numerical input is read successfully
454 @retval EFI_DEVICE_ERROR If operation fails
455
456 **/
457 EFI_STATUS
458 GetNumericInput (
459 IN UI_MENU_OPTION *MenuOption
460 );
461
462 /**
463 Get string or password input from user.
464
465 @param MenuOption Pointer to the current input menu.
466 @param Prompt The prompt string shown on popup window.
467 @param StringPtr Old user input and destination for use input string.
468
469 @retval EFI_SUCCESS If string input is read successfully
470 @retval EFI_DEVICE_ERROR If operation fails
471
472 **/
473 EFI_STATUS
474 ReadString (
475 IN UI_MENU_OPTION *MenuOption,
476 IN CHAR16 *Prompt,
477 IN OUT CHAR16 *StringPtr
478 );
479
480 /**
481 Draw a pop up windows based on the dimension, number of lines and
482 strings specified.
483
484 @param RequestedWidth The width of the pop-up.
485 @param NumberOfLines The number of lines.
486 @param Marker The variable argument list for the list of string to be printed.
487
488 **/
489 VOID
490 CreateSharedPopUp (
491 IN UINTN RequestedWidth,
492 IN UINTN NumberOfLines,
493 IN VA_LIST Marker
494 );
495
496 /**
497 Wait for a key to be pressed by user.
498
499 @param Key The key which is pressed by user.
500
501 @retval EFI_SUCCESS The function always completed successfully.
502
503 **/
504 EFI_STATUS
505 WaitForKeyStroke (
506 OUT EFI_INPUT_KEY *Key
507 );
508
509 /**
510 Get selection for OneOf and OrderedList (Left/Right will be ignored).
511
512 @param MenuOption Pointer to the current input menu.
513
514 @retval EFI_SUCCESS If Option input is processed successfully
515 @retval EFI_DEVICE_ERROR If operation fails
516
517 **/
518 EFI_STATUS
519 GetSelectionInputPopUp (
520 IN UI_MENU_OPTION *MenuOption
521 );
522
523 /**
524 Process the help string: Split StringPtr to several lines of strings stored in
525 FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.
526
527 @param StringPtr The entire help string.
528 @param FormattedString The oupput formatted string.
529 @param EachLineWidth The max string length of each line in the formatted string.
530 @param RowCount TRUE: if Question is selected.
531
532 **/
533 UINTN
534 ProcessHelpString (
535 IN CHAR16 *StringPtr,
536 OUT CHAR16 **FormattedString,
537 OUT UINT16 *EachLineWidth,
538 IN UINTN RowCount
539 );
540
541 /**
542 Process a Question's Option (whether selected or un-selected).
543
544 @param MenuOption The MenuOption for this Question.
545 @param Selected TRUE: if Question is selected.
546 @param OptionString Pointer of the Option String to be displayed.
547 @param SkipErrorValue Whether need to return when value without option for it.
548
549 @retval EFI_SUCCESS Question Option process success.
550 @retval Other Question Option process fail.
551
552 **/
553 EFI_STATUS
554 ProcessOptions (
555 IN UI_MENU_OPTION *MenuOption,
556 IN BOOLEAN Selected,
557 OUT CHAR16 **OptionString,
558 IN BOOLEAN SkipErrorValue
559 );
560
561 /**
562 Set Buffer to Value for Size bytes.
563
564 @param Buffer Memory to set.
565 @param Size Number of bytes to set
566 @param Value Value of the set operation.
567
568 **/
569 VOID
570 SetUnicodeMem (
571 IN VOID *Buffer,
572 IN UINTN Size,
573 IN CHAR16 Value
574 );
575
576 /**
577 Display one form, and return user input.
578
579 @param FormData Form Data to be shown.
580 @param UserInputData User input data.
581
582 @retval EFI_SUCCESS Form Data is shown, and user input is got.
583 **/
584 EFI_STATUS
585 EFIAPI
586 FormDisplay (
587 IN FORM_DISPLAY_ENGINE_FORM *FormData,
588 OUT USER_INPUT *UserInputData
589 );
590
591 /**
592 Clear Screen to the initial state.
593 **/
594 VOID
595 EFIAPI
596 DriverClearDisplayPage (
597 VOID
598 );
599
600 /**
601 Exit Display and Clear Screen to the original state.
602
603 **/
604 VOID
605 EFIAPI
606 ExitDisplay (
607 VOID
608 );
609
610 /**
611 Process nothing.
612
613 @param Event The Event need to be process
614 @param Context The context of the event.
615
616 **/
617 VOID
618 EFIAPI
619 EmptyEventProcess (
620 IN EFI_EVENT Event,
621 IN VOID *Context
622 );
623
624 /**
625 Process for the refresh interval statement.
626
627 @param Event The Event need to be process
628 @param Context The context of the event.
629
630 **/
631 VOID
632 EFIAPI
633 RefreshTimeOutProcess (
634 IN EFI_EVENT Event,
635 IN VOID *Context
636 );
637
638 /**
639 Record the highlight menu and top of screen menu info.
640
641 @param Highlight The menu opton which is highlight.
642 @param TopOfScreen The menu opton which is at the top of the form.
643 @param SkipValue The skip line info for the top of screen menu.
644
645 **/
646 VOID
647 UpdateHighlightMenuInfo (
648 IN LIST_ENTRY *Highlight,
649 IN LIST_ENTRY *TopOfScreen,
650 IN UINTN SkipValue
651 );
652
653 #endif